Python Matplotlib:是否有rcParams方法调整图例边框宽度?

Python Matplotlib:是否有rcParams方法调整图例边框宽度?,python,matplotlib,legend-properties,Python,Matplotlib,Legend Properties,显示了许多(全部?)rc参数,这些参数可以通过matplotlibrc文件或在Python脚本中使用Matplotlib.rcParams[]在Matplotlib绘图中进行调整。我无法使用该站点中列出的参数调整图例边框的宽度。我知道可以“手动”更改框的线宽,即在脚本()中,但我希望可以使用matplotlib.rcParams[]或在matplotlibrc文件中进行设置。我怎么能这样做 我之所以希望有一个自动化的、外部的(或者至少是易于复制和复制的)图形,是因为我有几个图形,由几个不同的Py

显示了许多(全部?)rc参数,这些参数可以通过
matplotlibrc
文件或在Python脚本中使用
Matplotlib.rcParams[]
在Matplotlib绘图中进行调整。我无法使用该站点中列出的参数调整图例边框的宽度。我知道可以“手动”更改框的线宽,即在脚本()中,但我希望可以使用
matplotlib.rcParams[]
或在
matplotlibrc
文件中进行设置。我怎么能这样做

我之所以希望有一个自动化的、外部的(或者至少是易于复制和复制的)图形,是因为我有几个图形,由几个不同的Python脚本生成这些图形,并且我希望有一种尽可能简单的方法来跨不同的Python脚本在这些图形之间保持标准的外观


在某些脚本中,我将图例称为
pyplot.legend()
,而在其他脚本中,我将其称为
ax.legend()

,这取决于您尝试执行的操作,实际上可以通过
rcParams
设置图例边框的宽度

TL;DR

matplotlibrc
中设置
patch.linewidth
,或者更好地为
legend
编写一个两行包装函数,并在脚本中使用它

长版本

查看
legend
的代码,您可以看到存储为
matplotlib.patched.fancyboxpatch
对象的帧,该对象是
matplotlib.patches.Patch
的一种类型<代码>面片对象从
matplotlib.rcParams['Patch.linewidth']
获取其默认线宽。这意味着,如果在
matplotlibrc
中设置
patch.linewidth
,图例边框的大小将改变

patch.edgecolor
的类似修改将更改边框颜色,但图例将忽略
patch.facecolor

下面是一个代码示例,用于说明此更改,并提供一些输出:

>>> import matplotlib as mpl
>>> from matplotlib import pyplot as plt
>>> mpl.rcParams['patch.linewidth']
1.0
>>> plt.plot((0, 1), label='a')[0].axes.legend()
<matplotlib.legend.Legend object at 0x7f6d7b0a0e48>
>>> mpl.rcParams['patch.linewidth'] = 15
>>> plt.plot((0, 1), label='a')[0].axes.legend()
<matplotlib.legend.Legend object at 0x7f6d7ae20908>
此脚本的结构使您无需手动调用
add\u legend
。只需导入脚本子类
matplotlib.axes.axes
,以便像以前一样调用
ax.legend(…)
将默认的图例边框宽度设置为15点

上面的脚本将用于调用
ax.legend
,其中
ax
Axes
实例,并且在
plt.legend
上,因为
plt.legend
实际上只是通过一些附加处理委托给
gca().legend


即使您的程序包含多个导入共享脚本的脚本/模块,该子类化机制也会起作用。这是因为Python在第一次之后不会实际重新加载模块,而是返回对它的引用,所有属性都保持不变。如果您开始使用
importlib.reload
,事情就会破裂,但这只是一个非常遥远的可能性。

您可能无法通过rcParams执行此操作,但我打赌您可以在legend类中的某个位置设置一个属性来执行此操作。@MadPhysicator,自动设置的方法?我假设您可以自动执行类似
matplotlib.legend.legend.myMagicProperty=25的操作,也可以
matplotlib.rcParams['my.magic.param']=25
。您可以查看第359行,了解用于绘制图例的修补程序是如何初始化的。您是否介意解释一下为什么在脚本中使用
set\u linewidth
设置新图例的线宽对您来说不够“自动化”?
from matplotlib.axes import Axes

def add_legend(ax, *args, **kwargs):
    """
    Adds a legend to the specified axes, along with some common formatting. All additional arguments are the same as for `ax.legend`.
    """
    legend = _originalFn(ax, *args, **kwargs)
    legend.set_linewidth(15)
    return legend

if Axes.legend is not add_legend:
    _originalFn = Axes.legend
    Axes.legend = add_legend