Matplotlib-サブプロット以外のグローバルな凡例とタイトル


125

私はmatplotから始めて、いくつかの基本的なプロットを管理しましたが、今必要なものを行う方法を見つけるのが難しいことに気づきました:(

私の実際の質問は、サブプロットを持つ図にグローバルタイトルとグローバル凡例を配置する方法です。

さまざまな色(約200)のさまざまなグラフがたくさんある2x3サブプロットを実行しています。それらのほとんどを区別するために、私は次のようなものを書きました

def style(i, total):
    return dict(color=jet(i/total),
                linestyle=["-", "--", "-.", ":"][i%4],
                marker=["+", "*", "1", "2", "3", "4", "s"][i%7])

fig=plt.figure()
p0=fig.add_subplot(321)
for i, y in enumerate(data):
    p0.plot(x, trans0(y), "-", label=i, **style(i, total))
# and more subplots with other transN functions

(これについて何か考えはありますか?:))各サブプロットは同じスタイル関数を持っています。

現在、すべてのサブプロットのグローバルタイトルと、すべてのスタイルを説明するグローバルレジェンドを取得しようとしています。また、フォントを200のスタイルすべてに合わせて小さくする必要があります(完全に一意のスタイルは必要ありませんが、少なくともいくつかの試み)

誰かがこのタスクを解決するのを手伝ってくれる?


回答:


192

グローバルタイトル:matplotlibの新しいリリースでは、Figure.suptitle()メソッドを使用できますFigure

import matplotlib.pyplot as plt
fig = plt.gcf()
fig.suptitle("Title centered above all subplots", fontsize=14)

または、@ Steven C. Howellのコメントに基づいて(ありがとう!))、matplotlib.pyplot.suptitle()関数を使用します。

 import matplotlib.pyplot as plt
 # plot stuff
 # ...
 plt.suptitle("Title centered above all subplots", fontsize=14)

64
次のようにインポートする場合:import matplotlib.pyplot as plt、コマンドは単に次のように入力できますplt.figure(); plt.suptitle('Title centered above all subplots'); plt.subplot(231); plt.plot(data[:,0], data[:,1]);...
Steven C. Howell

1
ありがとう。これが実際に選択された答えです。
gustafbstrom 2015

61

orbeckst回答に加えて、サブプロットを下にシフトすることもできます。OOPスタイルのMWEは次のとおりです。

import matplotlib.pyplot as plt

fig = plt.figure()
st = fig.suptitle("suptitle", fontsize="x-large")

ax1 = fig.add_subplot(311)
ax1.plot([1,2,3])
ax1.set_title("ax1")

ax2 = fig.add_subplot(312)
ax2.plot([1,2,3])
ax2.set_title("ax2")

ax3 = fig.add_subplot(313)
ax3.plot([1,2,3])
ax3.set_title("ax3")

fig.tight_layout()

# shift subplots down:
st.set_y(0.95)
fig.subplots_adjust(top=0.85)

fig.savefig("test.png")

与える:

ここに画像の説明を入力してください


2
これが最良の答えになるはずです
ステイサム2018

同意しました!受け入れられた回答は別の依存関係を導入するため、OPの質問には適切に回答しません。
Yohan Obadia

7

凡例については、ラベルは以下のようなものを使用できます。Legendlabelsは保存されたプロット線です。modFreqは、プロットラインに対応する実際のラベルの名前です。次に、3番目のパラメーターは凡例の場所です。最後に、ここで説明したように、任意の引数を渡すことができますが、主に最初の3つが必要です。また、plotコマンドでラベルを正しく設定する必要があります。locationパラメータを指定してlegendを呼び出すだけで、各行のラベルが見つかります。以下のように自分の伝説を作って頑張った。他の方法が正しく機能していないように思われるすべてのケースで機能するようです。理解できない場合はお知らせください。

legendLabels = []
for i in range(modSize):
    legendLabels.append(ax.plot(x,hstack((array([0]),actSum[j,semi,i,semi])), color=plotColor[i%8], dashes=dashes[i%4])[0]) #linestyle=dashs[i%4]       
legArgs = dict(title='AM Templates (Hz)',bbox_to_anchor=[.4,1.05],borderpad=0.1,labelspacing=0,handlelength=1.8,handletextpad=0.05,frameon=False,ncol=4, columnspacing=0.02) #ncol,numpoints,columnspacing,title,bbox_transform,prop
leg = ax.legend(tuple(legendLabels),tuple(modFreq),'upper center',**legArgs)
leg.get_title().set_fontsize(tick_size)

脚を使用して、フォントサイズや凡例のほぼすべてのパラメーターを変更することもできます。

上記のコメントに記載されているグローバルタイトルは、提供されたリンクごとにテキストを追加することで実行できます。http//matplotlib.sourceforge.net/examples/pylab_examples/newscalarformatter_demo.html

f.text(0.5,0.975,'The new formatter, default settings',horizontalalignment='center',
       verticalalignment='top')

4

suptitle進むべき道は見えますが、どのようなことの価値のために、figure持っているtransFigureあなたが使用できるプロパティを:

fig=figure(1)
text(0.5, 0.95, 'test', transform=fig.transFigure, horizontalalignment='center')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.