Tại sao xlabel của tôi bị cắt trong âm mưu matplotlib của tôi?


303

Tôi đang vẽ một tập dữ liệu bằng cách sử dụng matplotlibnơi tôi có một xlabel khá "cao" (đó là một công thức được hiển thị trong TeX có chứa một phân số và do đó có chiều cao tương đương với một vài dòng văn bản).

Trong mọi trường hợp, phần dưới của công thức luôn bị cắt khi tôi vẽ các số liệu. Thay đổi kích thước hình có vẻ không giúp được điều này và tôi chưa thể tìm ra cách dịch chuyển trục x "lên" để nhường chỗ cho xlabel. Một cái gì đó như thế sẽ là một giải pháp tạm thời hợp lý, nhưng điều tuyệt vời sẽ là có cách để matplotlib tự động nhận ra rằng nhãn bị cắt và thay đổi kích thước tương ứng.

Đây là một ví dụ về những gì tôi muốn nói:

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

trong khi bạn có thể thấy toàn bộ nhãn hiệu, xlabel bị cắt ở phía dưới.

Trong trường hợp đây là sự cố cụ thể của máy, tôi đang chạy vấn đề này trên OSX 10.6.8 với matplotlib 1.0.0


4
Bạn có thể đăng trên một trang web lưu trữ hình ảnh và liên kết nó ở đây.
agf

1
Nó có ích nếu bạn có thể đăng một mã mẫu tối giản gây ra vấn đề này. Bằng cách này, mọi người có thể hiểu và tái tạo vấn đề của bạn nhanh hơn, và họ sẽ có nhiều khả năng giúp bạn hơn.
Denilson Sá Maia

Mã của bạn chỉ hoạt động tốt (hiển thị công thức hiển thị đầy đủ) trên máy của tôi (ubfox 11.04 64bit). Có lẽ là một vấn đề cụ thể của máy [như một phông chữ có thông tin chiều sai được sử dụng trong hình ảnh?]. Bạn có thể chỉ định hệ thống bạn đang sử dụng trong câu hỏi của bạn.
mac

9
bạn cũng có thể muốn thử plt.savefig("test.png",bbox_inches='tight'): stackoverflow.com/questions/21288062/iêu
Yibo Yang

Câu trả lời:


475

Sử dụng:

import matplotlib.pyplot as plt

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

để nhường chỗ cho nhãn.

Biên tập:

Kể từ khi tôi đưa ra câu trả lời, matplotlibđã thêm tight_layout()chức năng. Vì vậy, tôi đề nghị sử dụng nó:

plt.tight_layout()

nên nhường chỗ cho xlabel.


141
Tôi thấy khá kỳ lạ khi người ta cần thực hiện một cuộc gọi thêm để nhường chỗ cho một phần thiết yếu của cốt truyện. Lý do đằng sau này là gì?
một ben khác

3
Chỉ vì tò mò, tại sao bạn lại có gcf().subplots_adjustchứ plt.subplots_adjust? Có sự khác biệt?
cây bách xù-

49
Là gì gcfgca? Bạn lơ là để giải thích!
Đại tá Panic

12
Tôi đã phải đối mặt với cùng một vấn đề, và trong khi tight_layout()đã sửa lỗi cắt xlabels, thật không may, nó đã khiến nhãn hiệu của tôi bị cắt (trước đây không bị cắt). Tuy nhiên, phương thuốc đầu tiên ( subplots_adjust(bottom=0.25)) hoạt động độc đáo. Cảm ơn.
Scott H

17
@ColonelPanic gcf()và lần lượt gca()là "lấy số liệu hiện tại" và "lấy các trục hiện tại".
DrMisha

150

Một tùy chọn dễ dàng là cấu hình matplotlib để tự động điều chỉnh kích thước lô. Nó hoạt động hoàn hảo với tôi và tôi không chắc tại sao nó không được kích hoạt theo mặc định.

Phương pháp 1

Đặt cái này trong tệp matplotlibrc của bạn

figure.autolayout : True

Xem tại đây để biết thêm thông tin về việc tùy chỉnh tệp matplotlibrc: http://matplotlib.org/users/customizing.html

Phương pháp 2

Cập nhật RCParams trong thời gian chạy như thế này

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

Ưu điểm của việc sử dụng phương pháp này là mã của bạn sẽ tạo ra các biểu đồ giống nhau trên các máy có cấu hình khác nhau.


Tôi gặp một số vấn đề với bảng màu quá lớn khi sử dụng tùy chọn này. Một giải pháp khả thi được thảo luận ở đây: matplotlib.org/users/tight_layout_guide.html
PiQuer

2
chặt chẽ_layout làm cho một mớ hỗn độn của mọi thứ khi tôi đặt phông chữ tùy chỉnh (lớn!). Điều này làm một công việc tốt hơn nhiều.
BenB

Cập nhật RCParams thực sự là điều duy nhất hiệu quả với tôi khi sử dụng phụ trợ pgf với LaTeX. (mặc dù nó làm cho cốt truyện hình chữ nhật, mà tôi không
bận

Chỉ điều này làm việc cho tôi; không có lệnh chặt chẽ nào hoặc box_inches hoạt động
zed111

106

Trong trường hợp bạn muốn lưu trữ nó vào một tệp, bạn giải quyết nó bằng cách sử dụng bbox_inches="tight"đối số:

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

2
@Guido đã lưu trong ngày
pcko1

7

Đặt plot.tight_layout()sau tất cả các thay đổi trên biểu đồ, ngay trước show()hoặc savefig()sẽ giải quyết vấn đề.


1
Điều này không dành chỗ cho phần dưới của cốt truyện, nhưng nó thay thế toàn bộ cốt truyện, trong một số trường hợp (như của tôi) làm cho cốt truyện trông thực sự kỳ lạ.
89f3a1c


5

Bạn cũng có thể đặt phần đệm tùy chỉnh làm mặc định $HOME/.matplotlib/matplotlib_rcnhư sau. Trong ví dụ dưới đây, tôi đã sửa đổi cả phần đệm phía dưới và bên trái:

# 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
...
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.