Matplotlib - alt grafikler dışında küresel efsane ve başlık


126

Matplot ile başladım ve bazı temel konuları yönettim, ancak şimdi ihtiyacım olan bazı şeyleri nasıl yapacağımı keşfetmekte zorlanıyorum :(

Asıl sorum, küresel bir unvanın ve küresel efsanenin alt grafiklerle bir figüre nasıl yerleştirileceğidir.

Çeşitli renklerde (yaklaşık 200) çok sayıda farklı grafiğe sahip olduğum 2x3 alt grafik yapıyorum. Birçoğunu ayırt etmek için şöyle bir şey yazdım

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

(bununla ilgili herhangi bir fikriniz var mı? :)) Her alt grafik aynı stil işlevine sahiptir.

Şimdi tüm alt noktalar için küresel bir başlık ve ayrıca tüm stilleri açıklayan küresel bir efsane almaya çalışıyorum. Ayrıca, yazı tipini oradaki 200 stile uyacak şekilde küçültmem gerekiyor (Tamamen benzersiz stillere ihtiyacım yok ama en azından biraz denemeye ihtiyacım var)

Birisi bu görevi çözmeme yardım edebilir mi?


Yanıtlar:


193

Global başlık : Matplotlib'in daha yeni sürümlerinde aşağıdaki yöntemlerden biri Figure.suptitle () yöntemini kullanabilir Figure:

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

Alternatif olarak ( @Steven C. Howell'in aşağıdaki yorumuna göre (teşekkür ederim!)), Matplotlib.pyplot.suptitle () işlevini kullanın:

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

64
Bunun gibi içe aktaranlar için: import matplotlib.pyplot as pltkomut basitçe plt.figure(); plt.suptitle('Title centered above all subplots'); plt.subplot(231); plt.plot(data[:,0], data[:,1]);vb.
Steven C. Howell

1
Teşekkürler. Bu gerçek seçilen cevap olmalıdır.
gustafbstrom

62

Orbeckst cevabına ek olarak , alt noktaları aşağı kaydırmak da isteyebilir. İşte OOP tarzında bir 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")

verir:

görüntü açıklamasını buraya girin


2
bu en iyi cevap olmalı
Statham

Kabul ! Kabul edilen cevap başka bir bağımlılık getirir, dolayısıyla OP sorusuna tam olarak cevap vermez.
Yohan Obadia

7

Açıklama etiketleri için aşağıdaki gibi bir şey kullanabilirsiniz. Gösterge etiketleri, kaydedilen çizim çizgileridir. modFreq, çizim çizgilerine karşılık gelen gerçek etiketlerin adıdır. Sonra üçüncü parametre, efsanenin yeridir. Son olarak, benim burada olduğum gibi herhangi bir argümanı iletebilirsiniz, ancak esas olarak ilk üçüne ihtiyacınız var. Ayrıca plot komutunda etiketleri doğru şekilde ayarlamanız gerekir. Legend'i konum parametresiyle çağırmak ve her satırdaki etiketleri bulmak için. Aşağıdaki gibi kendi efsanemi yaparken daha iyi şansım oldu. Asla diğer yolu düzgün şekilde yapmamış gibi görünen her durumda işe yarıyor gibi görünüyor. Eğer anlamadıysan bana haber ver:

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)

Ayağı yazı tipi boyutlarını veya açıklamanın neredeyse tüm parametrelerini değiştirmek için de kullanabilirsiniz.

Yukarıdaki yorumda belirtildiği gibi küresel başlık, sağlanan bağlantı başına metin eklenerek yapılabilir: 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

suptitlegidilecek yol gibi görünüyor, ancak değeri ne olursa olsun, kullanabileceğiniz figurebir transFiguremülk var:

fig=figure(1)
text(0.5, 0.95, 'test', transform=fig.transFigure, horizontalalignment='center')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.