ทำไม xlabel ของฉันถูกตัดในพล็อต matplotlib ของฉัน


303

ฉันกำลังวางแผนชุดข้อมูลโดยmatplotlibที่ฉันมี xlabel ที่ค่อนข้าง "สูง" (เป็นสูตรที่เรนเดอร์ใน TeX ที่มีเศษส่วนและดังนั้นจึงมีความสูงเทียบเท่ากับข้อความสองบรรทัด)

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

นี่คือตัวอย่างของสิ่งที่ฉันหมายถึง:

import matplotlib.pyplot as plt

plt.figure()
plt.ylabel(r'$\ln\left(\frac{x_a-x_b}{x_a-x_c}\right)$')
plt.xlabel(r'$\ln\left(\frac{x_a-x_d}{x_a-x_e}\right)$')
plt.show()

ในขณะที่คุณสามารถเห็น ylabel ทั้งหมด xlabel จะถูกตัดที่ด้านล่าง

ในกรณีนี้เป็นปัญหาเฉพาะของเครื่องฉันเรียกใช้งานบน OSX 10.6.8 ด้วย matplotlib 1.0.0


4
คุณสามารถโพสต์บนเว็บไซต์โฮสต์รูปภาพและเชื่อมโยงได้ที่นี่
agf

1
ช่วยถ้าคุณสามารถโพสต์โค้ดตัวอย่างขนาดเล็กที่ทำให้เกิดปัญหานี้ ด้วยวิธีนี้ผู้คนสามารถเข้าใจและทำซ้ำปัญหาของคุณได้เร็วขึ้นและพวกเขาจะมีแนวโน้มที่จะช่วยเหลือคุณมากกว่า
Denilson Sá Maia

รหัสของคุณใช้งานได้ดี (แสดงสูตรที่มองเห็นได้อย่างสมบูรณ์) บนเครื่องของฉัน (ubuntu 11.04 64 บิต) อาจเป็นปัญหาเฉพาะของเครื่อง [เช่นตัวอักษรที่มีข้อมูลมิติที่ไม่ถูกต้องใช้ในภาพหรือไม่] คุณอาจระบุระบบที่คุณใช้ในคำถามของคุณ
แม็ค

9
คุณอาจต้องการลองplt.savefig("test.png",bbox_inches='tight'): stackoverflow.com/questions/21288062/
Yibo Yang

คำตอบ:


474

ใช้:

import matplotlib.pyplot as plt

plt.gcf().subplots_adjust(bottom=0.15)

เพื่อให้มีที่ว่างสำหรับฉลาก

แก้ไข:

ตั้งแต่ฉันตอบ matplotlibได้เพิ่มtight_layout()ฟังก์ชั่น ดังนั้นฉันแนะนำให้ใช้:

plt.tight_layout()

ควรทำให้มีที่ว่างสำหรับ xlabel


141
ฉันคิดว่ามันค่อนข้างแปลกที่เราจะต้องโทรเพิ่มเพื่อให้มีที่ว่างสำหรับส่วนสำคัญของพล็อต อะไรคือเหตุผลเบื้องหลังสิ่งนี้
ben ben

3
เพิ่งออกจาก curiousity ทำไมคุณมีgcf().subplots_adjustมากกว่าplt.subplots_adjust? มีความแตกต่างหรือไม่?
juniper-

49
สิ่งที่เป็นgcfและgca? คุณละเลยที่จะอธิบาย!
พันเอก Panic

12
ฉันประสบปัญหาเดียวกันและในขณะที่tight_layout()แก้ไข xlabels cutoff มันทำให้ ylabel ของฉันถูกตัดออก (ซึ่งไม่ได้ถูกตัดไปก่อน) อย่างไรก็ตามวิธีแก้ปัญหาแรก ( subplots_adjust(bottom=0.25)) ทำงานได้ดี ขอบคุณ
Scott H

17
@ColonelPanic gcf()และgca()เป็น "รับตัวเลขปัจจุบัน" และ "รับแกนปัจจุบัน" ตามลำดับ
DrMisha

150

ตัวเลือกที่ง่ายคือกำหนดค่า matplotlib เพื่อปรับขนาดพล็อตโดยอัตโนมัติ มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉันและฉันไม่แน่ใจว่าทำไมมันไม่เปิดใช้งานโดยค่าเริ่มต้น

วิธีที่ 1

ตั้งค่านี้ในไฟล์ matplotlibrc ของคุณ

figure.autolayout : True

ดูที่นี่สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการปรับแต่งไฟล์ matplotlibrc: http://matplotlib.org/users/customizing.html

วิธีที่ 2

อัปเดต rcParams ระหว่างรันไทม์เช่นนี้

from matplotlib import rcParams
rcParams.update({'figure.autolayout': True})

ข้อดีของการใช้วิธีนี้คือรหัสของคุณจะสร้างกราฟเดียวกันบนเครื่องที่กำหนดค่าต่างกัน


ฉันมีปัญหากับแถบสีที่ใหญ่เกินไปเมื่อใช้ตัวเลือกนี้ วิธีแก้ปัญหาหนึ่งที่เป็นไปได้มีการกล่าวถึงที่นี่: matplotlib.org/users/tight_layout_guide.html
PiQuer

2
tight_layout ทำให้เกิดความยุ่งเหยิงเมื่อฉันตั้งค่าแบบอักษรที่กำหนดเอง (ใหญ่!) มันทำงานได้ดีขึ้นมาก
BenB

การอัปเดต rcParams เป็นสิ่งเดียวที่ใช้ได้ผลสำหรับฉันเมื่อใช้ pgf backend กับ LaTeX (แม้ว่ามันจะทำให้ฉากเป็นพล็อตที่ฉันไม่รังเกียจ)
h4nek

สิ่งนี้ใช้ได้สำหรับฉันเท่านั้น ไม่มี tight_layout หรือ box_inches ทำงาน
zed111

106

ในกรณีที่คุณต้องการเก็บไว้ในไฟล์คุณสามารถแก้ไขโดยใช้bbox_inches="tight"อาร์กิวเมนต์:

plt.savefig('myfile.png', bbox_inches = "tight")

2
@Guido บันทึกวัน
pcko1

7

วางplot.tight_layout()หลังจากการเปลี่ยนแปลงทั้งหมดในกราฟก่อนshow()หรือsavefig()จะแก้ปัญหา


1
นี่ไม่ได้ทำให้มีพื้นที่ว่างสำหรับด้านล่างของพล็อต แต่มันค่อนข้างจะช่วยลดพล็อตทั้งหมดซึ่งในบางกรณี (เป็นของฉัน) ทำให้พล็อตดูแปลกจริง ๆ
89f3a1c


5

นอกจากนี้คุณยังสามารถตั้งค่าช่องว่างภายในที่กำหนดเองเป็นค่าเริ่มต้นในของคุณ$HOME/.matplotlib/matplotlib_rcดังนี้ ในตัวอย่างด้านล่างฉันได้ปรับเปลี่ยนช่องว่างด้านล่างและด้านซ้าย:

# The figure subplot parameters.  All dimensions are a fraction of the
# figure width or height
figure.subplot.left  : 0.1 #left side of the subplots of the figure
#figure.subplot.right : 0.9 
figure.subplot.bottom : 0.15
...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.