2017-02-08 71 views
2

マステックスの書式設定によって、いくつかのラベルが凡例の2つの列に配置されたときに整列しないように、行は関連データを示すためにも使用されるため、これは特に重要です。ここでmatplotlibの凡例の行を2列で整列する方法

は一例です。

import matplotlib as mpl 
import matplotlib.pyplot as plt 
import matplotlib.mathtext as mathtext 
mpl.rc("font", family="Times New Roman",weight='normal') 
plt.rcParams.update({'mathtext.default': 'regular' }) 
plt.plot(1,1, label='A') 
plt.plot(2,2, label='B') 
plt.plot(3,3, label='C') 
plt.plot(4,4,label='$A_{x}^{y}$') 
plt.plot(5,5,label='$B_{x}^{y}$') 
plt.plot(6,6,label='$C_{x}^{y}$') 
plt.legend(fontsize='xx-large', ncol=2) 
plt.show() 

これはそうのような数字を生成:しばらく enter image description here

を、私はいくつかの空の上付き、下付き文字を追加することによって、「偽のそれ」ビットすることができましたただし、これはプロットがpdfにエクスポートされた場合にのみ有効です。 pngにエクスポートするときには動作していないようです。ラベルの最初の列を2番目の列に並べるにはどうすればよいですか?

+0

あなたはmatplotlibのバックエンドを変更しようとしたことがありますか?それらのうちのいくつかは他のものと異なって輸出しています。 – cphlewis

+0

私がバックエンドでやったことは、複数ページのpdfファイルをインポートすることだけです。私が知る限り、AGGを使ってpngをレンダリングしていますが、これはデフォルトだと思います。おそらくカイロを試してみることができますが、50-100のユニークなプロットもありますので、ここではもっとサンドボックスアプローチを探しています。 – Samwise

答えて

1

handleheightキーワード引数には、ハンドルの高さがフォントのスペースよりも大きいだけの大きさの数値を設定できます。これにより、テキストが整列して表示されます。凡例を大きくしすぎないようにするには、labelspacingを小さく設定する必要があります。画像に見られるように

plt.legend(fontsize='xx-large', ncol=2,handleheight=2.4, labelspacing=0.05) 

enter image description here

この方法の欠点は、行テキストのベースラインと比較して上方にシフトすることです。これが受け入れられるかどうかは、おそらく使用法の場合には分かりません。

そうでない場合は、少し深く掘り下げる必要があります。行と少し異なる位置を設定するために、以下のサブクラスHandlerLine2D(行のハンドラ)があります。凡例のサイズ、フォントサイズなどに応じて、SymHandlerクラスの数字をxxに変更する必要があります。

from matplotlib.legend_handler import HandlerLine2D 
import matplotlib.lines 

class SymHandler(HandlerLine2D): 
    def create_artists(self, legend, orig_handle,xdescent, ydescent, width, height, fontsize, trans): 
     xx= 0.6*height 
     return super(SymHandler, self).create_artists(legend, orig_handle,xdescent, xx, width, height, fontsize, trans) 

leg = plt.legend(handler_map={matplotlib.lines.Line2D: SymHandler()}, 
      fontsize='xx-large', ncol=2,handleheight=2.4, labelspacing=0.05) 

enter image description here

+0

これは素晴らしいです。 HandlerLine2Dをこのように更新すると、この凡例の範囲を超えて何かが影響を受けますか?私は一般的に継承を避けようとしていますので、私はこのタイプのことに慣れていません。関数create_artistsの引数は継承されているので、それらを指定する必要はありません。 xx因子は、線の底が始まり、ハンドル高さに正規化された位置です。 – Samwise

関連する問題