upper - python plt legend outside




軸の外にあるmatplotlibの凡例を動かすと、figureボックスで切り取られます (2)

追加されたものすぐにそのトリックを行うべきものを見つけましたが、以下のコードの残りの部分も代替手段を提供しています。

subplots_adjust()関数を使用して、 subplots_adjust()の下を上に移動します。

fig.subplots_adjust(bottom=0.2) # <-- Change the 0.02 to work for your plot.

次に、凡例コマンドの凡例bbox_to_anchorあるオフセットを使って再生して、凡例を取得します。 figsizeを設定し、 figsize subplots_adjust(bottom=...)を使用すると、品質のプロットが生成されます。

代わりに:私は単に行を変更しました:

fig = plt.figure(1)

に:

fig = plt.figure(num=1, figsize=(13, 13), dpi=80, facecolor='w', edgecolor='k')

変更された

lgd = ax.legend(loc=9, bbox_to_anchor=(0.5,0))

lgd = ax.legend(loc=9, bbox_to_anchor=(0.5,-0.02))

それは私の画面(24インチCRTモニター)でうまく表示されます。

ここで、 figsize=(M,N)はFigureウィンドウをMインチ×Nインチに設定します。 それはあなたのために右に見えるまでこれで遊ぶ。 よりスケーラブルな画像フォーマットに変換し、必要に応じてGIMPを使用して編集するか、グラフィックスを含めるときにLaTeX viewportオプションを使用してクロップします。

私は次の質問に精通しています:

プロットの外に凡例があるMatplotlibのsavefig

伝説をプロットの外に置く方法

これらの質問の答えは、凡例が収まるように軸の正確な縮みを聞くことができるという贅沢さがあるようです。

しかし、軸を縮小することは理想的な解決策ではありません。なぜなら、データを小さくして解釈するのが実際より難しくなるからです。 特にその複合体があり、多くのことが起こっている時には...そのため、大きな伝説が必要です

ドキュメント内の複雑な凡例の例は、プロット内の凡例が実際には複数のデータポイントを完全に隠すため、この必要性を示しています。

http://matplotlib.sourceforge.net/users/legend_guide.html#legend-of-complex-plots

私ができることを望むのは、拡大するFigureの凡例に対応するためにFigureボックスのサイズを動的に拡大することです。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-2*np.pi, 2*np.pi, 0.1)
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x, np.sin(x), label='Sine')
ax.plot(x, np.cos(x), label='Cosine')
ax.plot(x, np.arctan(x), label='Inverse tan')
lgd = ax.legend(loc=9, bbox_to_anchor=(0.5,0))
ax.grid('on')

どのように最終的なラベル 'Inverse tan'が実際にフィギュアボックスの外側にあるのか注意してください(そして、出版品質ではありません。

最後に、これはRとLaTeXの通常の動作であると言われています。なぜこれがPythonでは難しいのか少し混乱しています...歴史的な理由はありますか? この問題に関してMatlabは同等に貧しいですか?

私はペーストビンhttp://pastebin.com/grVjc007このコードの(わずかに)より長いバージョンがあります


もう一つの非常に手作業の解決法があります。 軸のサイズを定義することができ、それに従って詰め物が考慮されます(凡例と目盛りを含む)。 それが誰かに役立つことを望みます。

例(軸のサイズは同じです!):

コード:

#==================================================
# Plot table

colmap = [(0,0,1) #blue
         ,(1,0,0) #red
         ,(0,1,0) #green
         ,(1,1,0) #yellow
         ,(1,0,1) #magenta
         ,(1,0.5,0.5) #pink
         ,(0.5,0.5,0.5) #gray
         ,(0.5,0,0) #brown
         ,(1,0.5,0) #orange
         ]


import matplotlib.pyplot as plt
import numpy as np

import collections
df = collections.OrderedDict()
df['labels']        = ['GWP100a\n[kgCO2eq]\n\nasedf\nasdf\nadfs','human\n[pts]','ressource\n[pts]'] 
df['all-petroleum long name'] = [3,5,2]
df['all-electric']  = [5.5, 1, 3]
df['HEV']           = [3.5, 2, 1]
df['PHEV']          = [3.5, 2, 1]

numLabels = len(df.values()[0])
numItems = len(df)-1
posX = np.arange(numLabels)+1
width = 1.0/(numItems+1)

fig = plt.figure(figsize=(2,2))
ax = fig.add_subplot(111)
for iiItem in range(1,numItems+1):
  ax.bar(posX+(iiItem-1)*width, df.values()[iiItem], width, color=colmap[iiItem-1], label=df.keys()[iiItem])
ax.set(xticks=posX+width*(0.5*numItems), xticklabels=df['labels'])

#--------------------------------------------------
# Change padding and margins, insert legend

fig.tight_layout() #tight margins
leg = ax.legend(loc='upper left', bbox_to_anchor=(1.02, 1), borderaxespad=0)
plt.draw() #to know size of legend

padLeft   = ax.get_position().x0 * fig.get_size_inches()[0]
padBottom = ax.get_position().y0 * fig.get_size_inches()[1]
padTop    = ( 1 - ax.get_position().y0 - ax.get_position().height ) * fig.get_size_inches()[1]
padRight  = ( 1 - ax.get_position().x0 - ax.get_position().width ) * fig.get_size_inches()[0]
dpi       = fig.get_dpi()
padLegend = ax.get_legend().get_frame().get_width() / dpi 

widthAx = 3 #inches
heightAx = 3 #inches
widthTot = widthAx+padLeft+padRight+padLegend
heightTot = heightAx+padTop+padBottom

# resize ipython window (optional)
posScreenX = 1366/2-10 #pixel
posScreenY = 0 #pixel
canvasPadding = 6 #pixel
canvasBottom = 40 #pixel
ipythonWindowSize = '{0}x{1}+{2}+{3}'.format(int(round(widthTot*dpi))+2*canvasPadding
                                            ,int(round(heightTot*dpi))+2*canvasPadding+canvasBottom
                                            ,posScreenX,posScreenY)
fig.canvas._tkcanvas.master.geometry(ipythonWindowSize) 
plt.draw() #to resize ipython window. Has to be done BEFORE figure resizing!

# set figure size and ax position
fig.set_size_inches(widthTot,heightTot)
ax.set_position([padLeft/widthTot, padBottom/heightTot, widthAx/widthTot, heightAx/heightTot])
plt.draw()
plt.show()
#--------------------------------------------------
#==================================================




legend