Judul gambar Python Matplotlib tumpang tindih dengan label sumbu saat menggunakan twiny

139

Saya mencoba memplot dua kuantitas terpisah pada grafik yang sama menggunakan twiny sebagai berikut:

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

dan datanya disajikan dengan baik, tetapi saya memiliki masalah bahwa judul gambar tumpang tindih dengan label sumbu pada sumbu x sekunder sehingga hampir tidak dapat dibaca (saya ingin memposting contoh gambar di sini, tapi saya tidak punya rep yang cukup tinggi).

Saya ingin tahu apakah ada cara mudah untuk hanya menggeser judul secara langsung beberapa puluh piksel, sehingga grafik terlihat lebih cantik.

Magic_Matt_Man
sumber
1
Selamat Datang di Stack Overflow! Jika Anda menautkan ke imgur yang memposting gambar Anda, pengguna rep yang lebih tinggi akan menyematkan gambar dalam posting Anda.
Hooked
@Magic - Akankah Anda mempertimbangkan kembali jawaban apa yang diterima untuk pertanyaan ini? Matplotlib telah menambahkan mekanisme bawaan untuk menangani kebutuhan yang tepat ini (jawaban yang paling banyak dipilih di bawah ini)
Amelio Vazquez-Reina

Jawaban:

243

Saya tidak yakin apakah ini fitur baru di versi matplotlib nanti, tetapi setidaknya untuk 1.3.1, ini hanyalah:

plt.title(figure_title, y=1.08)

Ini juga berfungsi untuk plt.suptitle(), tetapi tidak (belum) untuk plt.xlabel(), dll.

herrlich10
sumber
6
Untuk label, Anda dapat mengatur argumen labelpad, lihat di sini .
Felix Hoffmann
1
Untuk apa nilainya, ini bukan fitur baru. titletelah mengambil xdan yargumen untuk waktu yang sangat lama (selama saya bisa ingat, bagaimanapun juga).
Joe Kington
3
plt.set_title ('title string', y = 1.08) berfungsi untuk saya.
Yu Shen
3
Akan lebih membantu jika seseorang menjelaskan apa itu 1.08 dan apa standarnya. Pemahaman saya adalah bahwa standarnya adalah 1
kon psych
3
@JohnCummings Tampaknya nilai default adalah y = 1 dan unit adalah "fraksi sumbu", yaitu, y = 0,5 berarti judul berada di tengah-tengah sumbu, dan y = 0 berarti judul tepat di atas bagian bawah kapak.
herrlich10
33

Lupakan menggunakan plt.titledan menempatkan teks secara langsung dengan plt.text. Contoh berlebihan yang diberikan di bawah ini:

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

masukkan deskripsi gambar di sini

Doyan
sumber
@ user815423426 ya, tight_layoutmasih tidak terlihat cocok dengan penempatan non-standar. Mungkin Anda bisa membuat laporan bug?
Ketagihan
2
Saya menemukan pekerjaan saat menggunakan tight_layout, setidaknya ketika Anda menyimpan plot Anda menggunakan figure.savefig () . Jika title = plt.title(...)kemudian Anda dapat menentukan untuk membingkai plot dengan ketat di sekitar judul menggunakan opsi 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")

Jika Anda meletakkan '\n'tepat setelah string judul Anda, plot diambil tepat di bawah judul. Itu mungkin solusi yang cepat juga.

Efkan
sumber
8

Saya mengalami masalah dengan label-x yang tumpang tindih dengan judul subplot; ini bekerja untuk saya:

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

sebelum

masukkan deskripsi gambar di sini

setelah

masukkan deskripsi gambar di sini

referensi:

jmunsch
sumber
4

Gunakan saja plt.tight_layout()sebelumnya plt.show(). Ini bekerja dengan baik.

Peter Zhu
sumber
4

Anda dapat menggunakan kertas untuk kasus ini:

ax.set_title("whatever", pad=20)
Radvin
sumber