Matplotlib - legenda global dan subplot selain judul

125

Saya sudah mulai dengan matplot dan mengelola beberapa plot dasar, tetapi sekarang saya merasa sulit untuk menemukan cara melakukan beberapa hal yang saya butuhkan sekarang :(

Pertanyaan saya yang sebenarnya adalah bagaimana menempatkan gelar global dan legenda global pada sosok dengan subplot.

Saya membuat subplot 2x3 di mana saya memiliki banyak grafik berbeda dalam berbagai warna (sekitar 200). Untuk membedakan (kebanyakan) dari mereka, saya menulis sesuatu seperti

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

(ada pendapat tentang ini? :)) Setiap subplot memiliki fungsi gaya yang sama.

Sekarang saya mencoba mendapatkan judul global untuk semua subplot dan juga legenda global yang menjelaskan semua gaya. Saya juga perlu membuat font menjadi kecil agar sesuai dengan 200 gaya di sana (saya tidak perlu gaya yang benar-benar unik, tetapi setidaknya beberapa upaya)

Bisakah seseorang membantu saya menyelesaikan tugas ini?

Gerenuk
sumber

Jawaban:

192

Judul global : Dalam rilis matplotlib yang lebih baru, seseorang dapat menggunakan metode Figure.suptitle () dari Figure:

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

Atau (berdasarkan komentar @Steven C. Howell di bawah (terima kasih!)), Gunakan fungsi matplotlib.pyplot.suptitle () :

 import matplotlib.pyplot as plt
 # plot stuff
 # ...
 plt.suptitle("Title centered above all subplots", fontsize=14)
orbeckst
sumber
64
Bagi mereka yang mengimpor seperti ini import matplotlib.pyplot as plt:, perintah dapat dimasukkan sesederhana plt.figure(); plt.suptitle('Title centered above all subplots'); plt.subplot(231); plt.plot(data[:,0], data[:,1]);dll ...
Steven C. Howell
1
Terima kasih. Ini harus menjadi jawaban yang dipilih sebenarnya.
mulai
62

Selain jawaban orbeckst, seseorang mungkin juga ingin menggeser subplot ke bawah. Inilah MWE dalam gaya OOP:

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")

memberikan:

masukkan deskripsi gambar di sini

Adobe
sumber
2
ini harus menjadi jawaban terbaik
Statham
Sepakat ! Jawaban yang diterima memperkenalkan ketergantungan lain, karenanya tidak menjawab pertanyaan OP dengan benar.
Yohan Obadia
7

Untuk label legenda bisa menggunakan sesuatu seperti di bawah ini. Label legenda adalah garis plot yang disimpan. modFreq adalah tempat nama label sebenarnya yang sesuai dengan garis plot. Kemudian parameter ketiga adalah lokasi legenda. Terakhir, Anda dapat menyampaikan argumen apa pun seperti yang telah saya bahas di sini, tetapi sebagian besar membutuhkan tiga argumen pertama. Juga, Anda seharusnya melakukannya jika Anda mengatur label dengan benar dalam perintah plot. Untuk memanggil legenda dengan parameter lokasi dan menemukan label di setiap baris. Saya lebih beruntung membuat legenda saya sendiri seperti di bawah ini. Tampaknya berhasil dalam semua kasus di mana sepertinya tidak pernah mendapatkan cara lain berjalan dengan baik. Jika Anda tidak mengerti, beri tahu saya:

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)

Anda juga dapat menggunakan kaki untuk mengubah ukuran font atau hampir semua parameter legenda.

Judul global seperti yang tertera pada komentar di atas dapat dilakukan dengan menambahkan teks sesuai link yang disediakan: 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')
J Spen
sumber
4

suptitletampaknya cara untuk pergi, tetapi untuk apa nilainya, figurememiliki transFigureproperti yang dapat Anda gunakan:

fig=figure(1)
text(0.5, 0.95, 'test', transform=fig.transFigure, horizontalalignment='center')
mathtick
sumber