Python Matplotlib ชื่อรูปซ้อนทับฉลากแกนเมื่อใช้ twiny


139

ฉันพยายามพล็อตสองปริมาณแยกกันบนกราฟเดียวกันโดยใช้ twiny ดังนี้:

fig = figure()
ax = fig.add_subplot(111)
ax.plot(T, r, 'b-', T, R, 'r-', T, r_geo, 'g-')
ax.set_yscale('log')
ax.annotate('Approx. sea level', xy=(Planet.T_day*1.3,(Planet.R)/1000), xytext=(Planet.T_day*1.3, Planet.R/1000))
ax.annotate('Geostat. orbit', xy=(Planet.T_day*1.3, r_geo[0]), xytext=(Planet.T_day*1.3, r_geo[0]))
ax.set_xlabel('Rotational period (hrs)')
ax.set_ylabel('Orbital radius (km), logarithmic')
ax.set_title('Orbital charts for ' + Planet.N, horizontalalignment='center', verticalalignment='top')


ax2 = ax.twiny()
ax2.plot(v,r,'k-')
ax2.set_xlabel('Linear speed (ms-1)')

show()

และข้อมูลถูกนำเสนอได้ดี แต่ฉันมีปัญหาว่าชื่อรูปซ้อนทับกับป้ายชื่อแกนบนแกน x ทุติยภูมิเพื่อให้อ่านได้ง่าย (ฉันต้องการโพสต์ภาพตัวอย่างที่นี่ แต่ฉันไม่มี ตัวแทนสูงพอ)

ฉันต้องการทราบว่ามีวิธีที่ตรงไปตรงมาเพียงแค่เลื่อนชื่อเรื่องขึ้นไปไม่กี่สิบพิกเซลโดยตรงหรือไม่เพื่อให้แผนภูมิดูสวยขึ้น


1
ยินดีต้อนรับสู่ Stack Overflow! หากคุณเชื่อมโยงไปยัง imgur การโพสต์ภาพของคุณผู้ใช้ตัวแทนที่สูงขึ้นจะฝังภาพในโพสต์ของคุณ
ตะขอ

@Magic - คุณจะพิจารณาอีกครั้งว่าคำตอบที่ยอมรับสำหรับคำถามนี้คืออะไร Matplotlib ได้เพิ่มกลไก builtin เพื่อจัดการกับความต้องการที่แม่นยำนี้ (คำตอบที่โหวตมากที่สุดด้านล่าง)
Amelio Vazquez-Reina

คำตอบ:


243

ฉันไม่แน่ใจว่ามันเป็นคุณสมบัติใหม่ใน matplotlib รุ่นใหม่กว่า แต่อย่างน้อยสำหรับ 1.3.1 นี่เป็นเพียง:

plt.title(figure_title, y=1.08)

สิ่งนี้ยังใช้งานplt.suptitle()ได้ แต่ยังไม่ (สำหรับ) plt.xlabel()เป็นต้น


6
สำหรับป้ายชื่อคุณสามารถตั้งค่าการโต้แย้งlabelpadดูที่นี่
เฟลิกซ์ฮอฟแมนน์

1
สำหรับสิ่งที่คุ้มค่าไม่ใช่คุณสมบัติใหม่ titleได้ดำเนินการxและyโต้แย้งมานานมาก (ตราบใดที่ฉันจำได้ไม่ว่าจะด้วยวิธีใดก็ตาม)
Joe Kington

3
plt.set_title ('ชื่อสตริง', y = 1.08) ใช้ได้สำหรับฉัน
Yu Shen

3
มันจะมีประโยชน์มากขึ้นถ้ามีคนอธิบายว่าหน่วย 1.08 คืออะไรและค่าเริ่มต้นคืออะไร ความเข้าใจของฉันคือค่าเริ่มต้นคือ 1
kon Psych

3
@JohnCummings ดูเหมือนว่าค่าเริ่มต้นคือ y = 1 และหน่วยคือ "เศษส่วนของแกน" คือ y = 0.5 หมายถึงชื่ออยู่ตรงกลางของแกนและ y = 0 หมายถึงชื่ออยู่เหนือด้านล่างของ แกน
herrlich10

33

ลืมใช้และวางข้อความโดยตรงกับplt.title plt.textตัวอย่างที่พูดเกินจริงแสดงไว้ด้านล่าง:

import pylab as plt

fig = plt.figure(figsize=(5,10))

figure_title = "Normal title"
ax1  = plt.subplot(1,2,1)

plt.title(figure_title, fontsize = 20)
plt.plot([1,2,3],[1,4,9])

figure_title = "Raised title"
ax2  = plt.subplot(1,2,2)

plt.text(0.5, 1.08, figure_title,
         horizontalalignment='center',
         fontsize=20,
         transform = ax2.transAxes)
plt.plot([1,2,3],[1,4,9])

plt.show()

ป้อนคำอธิบายรูปภาพที่นี่


@ user815423426 ใช่tight_layoutยังดูเหมือนจะไม่เล่นได้ดีกับตำแหน่งที่ไม่ได้มาตรฐาน บางทีคุณสามารถรายงานบั๊กได้?
ติดยา

2
ฉันพบว่าการทำงานรอบเมื่อใช้ tight_layout อย่างน้อยเมื่อคุณบันทึกพล็อตของคุณโดยใช้figure.savefig () ถ้าเป็นเช่นtitle = plt.title(...)นั้นคุณสามารถระบุเฟรมที่พล็อตไว้รอบ ๆ ชื่อโดยใช้ตัวเลือก bbox_extra_artists:figure.savefig(filename, bbox_extra_artists=(title), bbox_inches='tight')
junkaholik

10
ax.set_title('My Title\n', fontsize="15", color="red")
plt.imshow(myfile, origin="upper")

หากคุณใส่'\n'หลังสตริงหัวเรื่องของคุณพล็อตจะถูกวาดใต้ชื่อ นั่นอาจเป็นวิธีแก้ปัญหาที่รวดเร็วเช่นกัน


8

ฉันกำลังมีปัญหากับ x-label ทับชื่อเรื่องย่อย สิ่งนี้ใช้ได้กับฉัน:

import matplotlib.pyplot as plt
fig, ax = plt.subplots(2, 1)
ax[0].scatter(...)
ax[1].scatter(...)
plt.tight_layout()
.
.
.
plt.show()

ก่อน

ป้อนคำอธิบายรูปภาพที่นี่

หลังจาก

ป้อนคำอธิบายรูปภาพที่นี่

อ้างอิง:



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.