実際には、凡例の罫線の幅をrcParams
で設定することができます。
TL; DR
いっそmatplotlibrc
のSet patch.linewidth
や、legend
ための2つのラインのラッパー関数を作成し、使用することを代わりにスクリプトインチ
ロングバージョン
legend
ためのコードを見てみると、あなたは、フレームがmatplotlib.patches.Patch
のタイプであるmatplotlib.patched.FancyBBoxPatch
オブジェクトとして保存されていることがわかります。 Patch
オブジェクトのデフォルトの線幅はmatplotlib.rcParams['patch.linewidth']
です。つまり、patch.linewidth
をmatplotlibrc
に設定すると、凡例の境界線のサイズが変更されます。
同様の変更を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>
![normal line legend](https://i.stack.imgur.com/CxE4G.png)
![15px line legend](https://i.stack.imgur.com/wxPWl.png)
あなたのチャート上の任意の他のパッチを描くその場合は、ここで明らかに問題があります、デフォルトの線幅はスローされます。もちろん、作成したすべてのパッチに対して線幅を1に「手動で」変更することでこれを軽減できます。明らかに、これは最適な解決策ではありません。
Aより良い方法
はるかに優れたソリューションは、すべてのあなたのチャート生成スクリプト間で共有することになり、小さなスクリプトを作成することです。ここでは、そのようなスクリプトのサンプルです:
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
このスクリプトは、あなたがこれまで手動でadd_legend
を呼び出す必要はありませんように構成されています。スクリプトサブクラスmatplotlib.axes.Axes
をインポートするだけで、前述のようにax.legend(...)
を呼び出すと、デフォルトの凡例の境界幅が15ポイントに設定されます。
上記のスクリプトは、いくつかの追加処理でgca().legend
するplt.legend
本当にただ委譲しているので、ax
がAxes
インスタンスでax.legend
へとplt.legend
上のコールのために動作します。
このサブクラス化メカニズムは、プログラムが共有スクリプトをインポートする複数のスクリプト/モジュールで構成されている場合でも機能します。これは、Pythonが初めて実際にモジュールをリロードするのではなく、代わりにすべての属性がそのままの状態でリファレンスを返すためです。 importlib.reload
を使い始めると状況が壊れますが、それは非常に遠隔の可能性にすぎません。
rcParamsでこれを行うことができない場合がありますが、これを行うために凡例クラスのどこかに設定できるプロパティがあると思います。 –
@MadPhysicist、それを設定する自動化された方法? – Joshua
私は、 'matplotlib.legend.Legend.myMagicProperty = 25'のようなものを自動化できることと、' matplotlib.rcParams ['my.magic.param'] = 25'とすることができると仮定しています。 –