Mengapa xlabel saya terpotong di plot matplotlib saya?

303

Saya merencanakan dataset menggunakan di matplotlibmana saya memiliki xlabel yang cukup "tinggi" (itu adalah rumus yang diberikan dalam TeX yang berisi sebagian kecil dan karenanya memiliki tinggi yang setara dengan beberapa baris teks).

Bagaimanapun, bagian bawah formula selalu terputus ketika saya menggambar angka. Mengubah ukuran gambar sepertinya tidak membantu ini, dan saya belum bisa menemukan cara menggeser sumbu x "ke atas" untuk memberikan ruang bagi xlabel. Sesuatu seperti itu akan menjadi solusi sementara yang masuk akal, tetapi apa yang akan menyenangkan adalah memiliki cara untuk membuat matplotlib mengenali secara otomatis bahwa label terputus dan diubah ukurannya.

Berikut ini contoh yang saya maksud:

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

sementara Anda dapat melihat seluruh ylabel, xlabel terpotong di bagian bawah.

Dalam hal ini adalah masalah khusus mesin, saya menjalankan ini pada OSX 10.6.8 dengan matplotlib 1.0.0

Andrew
sumber
4
Anda dapat memposting di situs hosting gambar dan menautkannya di sini.
agf
1
Ini membantu jika Anda dapat memposting kode sampel minimalis yang memicu masalah ini. Dengan cara ini, orang dapat memahami dan mereproduksi masalah Anda lebih cepat, dan mereka akan lebih mungkin membantu Anda.
Denilson Sá Maia
Kode Anda berfungsi dengan baik (tampilkan rumus yang sepenuhnya terlihat) di mesin saya (ubuntu 11.04 64bit). Mungkin masalah khusus mesin [seperti font dengan informasi dimensi yang salah yang digunakan dalam gambar?]. Anda mungkin dapat menentukan sistem yang Anda gunakan dalam pertanyaan Anda.
mac
9
Anda mungkin juga ingin mencoba plt.savefig("test.png",bbox_inches='tight'): stackoverflow.com/questions/21288062/…
Yibo Yang

Jawaban:

475

Menggunakan:

import matplotlib.pyplot as plt

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

untuk memberi ruang bagi label.

Edit:

Karena saya memberi jawaban, matplotlibtelah menambahkan tight_layout()fungsi. Jadi saya sarankan untuk menggunakannya:

plt.tight_layout()

harus memberi ruang untuk xlabel.

untsten
sumber
141
Saya merasa sangat aneh bahwa seseorang perlu membuat panggilan ekstra untuk memberikan ruang bagi bagian penting dari plot. Apa alasan di balik ini?
berbeda ben
3
Hanya keluar dari curiousity, mengapa Anda memiliki gcf().subplots_adjustdaripada plt.subplots_adjust? Apakah ada perbedaan?
juniper-
49
Apa gcfdan gca? Anda lalai menjelaskan!
Kolonel Panic
12
Saya dihadapkan dengan masalah yang sama, dan sementara tight_layout()memang memperbaiki cutoff xlabels, sayangnya menyebabkan ylabel saya menjadi terputus (yang tidak terpotong sebelumnya). Namun, obat pertama ( subplots_adjust(bottom=0.25)) bekerja dengan baik. Terima kasih.
Scott H
17
@ColonelPanic gcf()dan gca()"dapatkan angka sekarang" dan "dapatkan sumbu saat ini", masing-masing.
DrMisha
150

Opsi yang mudah adalah dengan mengkonfigurasi matplotlib untuk secara otomatis menyesuaikan ukuran plot. Ini berfungsi dengan baik untuk saya dan saya tidak yakin mengapa itu tidak diaktifkan secara default.

Metode 1

Set ini di file matplotlibrc Anda

figure.autolayout : True

Lihat di sini untuk informasi lebih lanjut tentang menyesuaikan file matplotlibrc: http://matplotlib.org/users/customizing.html

Metode 2

Perbarui rcParams selama runtime seperti ini

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

Keuntungan menggunakan pendekatan ini adalah bahwa kode Anda akan menghasilkan grafik yang sama pada mesin yang dikonfigurasi secara berbeda.

Amit Moscovich
sumber
Saya punya beberapa masalah dengan colorbars terlalu besar ketika menggunakan opsi ini. Salah satu solusi yang mungkin dibahas di sini: matplotlib.org/users/tight_layout_guide.html
PiQuer
2
tight_layout membuat kekacauan ketika saya mengatur ukuran font (besar!) khusus. Ini melakukan pekerjaan yang jauh lebih baik.
BenB
Memperbarui rcParams adalah satu-satunya hal yang bekerja untuk saya saat menggunakan pgf backend dengan LaTeX. (meskipun itu membuat plot persegi panjang, yang saya tidak keberatan)
h4nek
Hanya ini yang berhasil untuk saya; tidak satupun dari tight_layout atau box_inches bekerja
zed111
106

Jika Anda ingin menyimpannya di file, Anda menyelesaikannya menggunakan bbox_inches="tight"argumen:

plt.savefig('myfile.png', bbox_inches = "tight")
Guido
sumber
2
@ Guido menyelamatkan hari
pcko1
7

Menempatkan plot.tight_layout()setelah semua perubahan pada grafik, tepat sebelum show()atau savefig()akan menyelesaikan masalah.

Armin Okić
sumber
1
Ini tidak membuat ruang untuk bagian bawah plot, tetapi agak mengubah seluruh plot, yang mungkin dalam beberapa kasus (seperti milik saya) membuat plot terlihat sangat aneh.
89f3a1c
6

plt.autoscale() bekerja untukku.

dgoodman1
sumber
5

Anda juga dapat mengatur lapisan khusus sebagai default di $HOME/.matplotlib/matplotlib_rcsebagai berikut. Dalam contoh di bawah ini, saya telah memodifikasi bagian bawah dan bagian luar kotak:

# 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
...
Мати Тернер
sumber