2016-07-13 13 views
2

This siteにはMatplotlibプロットでmatplotlibrcファイルを使用するか、Pythonスクリプトでmatplotlib.rcParams[]を使用して調整できる多くの(すべて?)rcパラメータが表示されます。そのサイトに記載されているパラメータを使用して凡例の枠線の幅を調整する方法はありません。 ""またはmatplotlibrcファイルを使用して "手動"、つまりスクリプト(for example)の線幅を変更することは可能ですが、私はそれを設定する方法を期待しています。どうすればこのことができますか?Matplotlib:凡例の境界線の幅を調整するrcParamsの方法はありますか?

自動化された外部(または少なくとも簡単にコピーアンドペースト可能)をお持ちの理由は、いくつかの数字があり、いくつかの異なるPythonスクリプトがいくつか用意されているためです可能な限り、これらの図のそれぞれの間の標準的な外観を、異なるPythonスクリプトにわたって維持する。

私は凡例をpyplot.legend()と呼びますが、他のスクリプトではax.legend()と呼びます。

+0

rcParamsでこれを行うことができない場合がありますが、これを行うために凡例クラスのどこかに設定できるプロパティがあると思います。 –

+0

@MadPhysicist、それを設定する自動化された方法? – Joshua

+0

私は、 'matplotlib.legend.Legend.myMagicProperty = 25'のようなものを自動化できることと、' matplotlib.rcParams ['my.magic.param'] = 25'とすることができると仮定しています。 –

答えて

3

実際には、凡例の罫線の幅をrcParamsで設定することができます。

TL; DR

いっそmatplotlibrcのSet patch.linewidthや、legendための2つのラインのラッパー関数を作成し、使用することを代わりにスクリプトインチ

ロングバージョン

legendためのコードを見てみると、あなたは、フレームがmatplotlib.patches.Patchのタイプであるmatplotlib.patched.FancyBBoxPatchオブジェクトとして保存されていることがわかります。 Patchオブジェクトのデフォルトの線幅はmatplotlib.rcParams['patch.linewidth']です。つまり、patch.linewidthmatplotlibrcに設定すると、凡例の境界線のサイズが変更されます。

同様の変更を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

15px line legend

あなたのチャート上の任意の他のパッチを描くその場合は、ここで明らかに問題があります、デフォルトの線幅はスローされます。もちろん、作成したすべてのパッチに対して線幅を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本当にただ委譲しているので、axAxesインスタンスでax.legendへとplt.legend上のコールのために動作します。

このサブクラス化メカニズムは、プログラムが共有スクリプトをインポートする複数のスクリプト/モジュールで構成されている場合でも機能します。これは、Pythonが初めて実際にモジュールをリロードするのではなく、代わりにすべての属性がそのままの状態でリファレンスを返すためです。 importlib.reloadを使い始めると状況が壊れますが、それは非常に遠隔の可能性にすぎません。

関連する問題