Matplotlib - ตำนานระดับโลกและชื่อเรื่องนอกเหนือจากเรื่องย่อย


126

ฉันเริ่มต้นด้วย matplot และจัดการแปลงพื้นฐานบางอย่าง แต่ตอนนี้ฉันพบว่ามันยากที่จะค้นพบวิธีทำบางสิ่งที่ฉันต้องการตอนนี้ :(

คำถามที่แท้จริงของฉันคือการวางชื่อระดับโลกและตำนานระดับโลกลงบนร่างที่มีพล็อตย่อยได้อย่างไร

ฉันกำลังทำพล็อตย่อย 2x3 ซึ่งฉันมีกราฟที่แตกต่างกันมากมายในสีต่างๆ (ประมาณ 200) เพื่อแยกความแตกต่าง (ส่วนใหญ่) ของพวกเขาฉันเขียนสิ่งที่ชอบ

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 แบบในนั้น (ฉันไม่ต้องการสไตล์ที่ไม่เหมือนใคร แต่อย่างน้อยก็ต้องพยายาม)

มีใครช่วยฉันแก้ปัญหานี้ได้ไหม


คำตอบ:


193

Global title : ใน 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

62

นอกจากคำตอบของ orbeckst แล้วเราอาจต้องการเลื่อนพล็อตย่อยลงด้วย นี่คือ MWE ในรูปแบบ 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")

ให้:

ใส่คำอธิบายภาพที่นี่


2
นี่น่าจะเป็นคำตอบที่ดีที่สุด
Statham

เห็นด้วย! คำตอบที่ได้รับการยอมรับเป็นการแนะนำการพึ่งพาอื่นดังนั้นจึงไม่สามารถตอบคำถาม OP ได้อย่างถูกต้อง
Yohan Obadia

7

สำหรับป้ายกำกับตำนานสามารถใช้สิ่งต่างๆดังต่อไปนี้ Legendlabels คือเส้นพล็อตที่บันทึกไว้ modFreq คือชื่อของป้ายกำกับจริงที่ตรงกับเส้นพล็อต จากนั้นพารามิเตอร์ที่สามคือตำแหน่งของคำอธิบายแผนภูมิ สุดท้ายนี้คุณสามารถส่งผ่านข้อโต้แย้งใด ๆ ตามที่ฉันได้ลงไว้ที่นี่ แต่ส่วนใหญ่ต้องการสามข้อแรก นอกจากนี้คุณควรตั้งค่าป้ายกำกับอย่างถูกต้องในคำสั่ง plot เพียงแค่เรียกตำนานด้วยพารามิเตอร์ตำแหน่งและพบป้ายกำกับในแต่ละบรรทัด ฉันโชคดีที่ได้สร้างตำนานของตัวเองดังต่อไปนี้ ดูเหมือนว่าจะได้ผลในทุกกรณีที่ดูเหมือนว่าจะไม่ได้ไปทางอื่นอย่างถูกต้อง หากคุณไม่เข้าใจโปรดแจ้งให้เราทราบ:

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.