Python Matplotlib şekil başlığı, twiny kullanırken eksen etiketiyle çakışıyor


139

Aşağıdaki gibi twiny kullanarak aynı grafik üzerinde iki ayrı miktarlar çizmek çalışıyorum:

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

ve veriler iyi sunuldu, ancak şekil başlığının ikincil x eksenindeki eksen etiketleri ile örtüşmesi sorunu yaşıyorum, böylece zar zor okunabilir (burada bir resim örneği göndermek istedim, ancak bir yeterince yüksek temsilci).

Başlığı doğrudan birkaç on piksele yükseltmenin basit bir yolu olup olmadığını bilmek istiyorum, böylece grafik daha güzel görünüyor.


1
Stack Overflow'a hoş geldiniz! Resminizin imgur yayınına bağlantı verirseniz, daha yüksek bir temsilci resmi sizin için yayına yerleştirecektir.
Hooked

@Magic - Bu soru için hangi cevabı kabul edeceğinizi yeniden düşünür müsünüz? Matplotlib, bu hassas ihtiyacı karşılamak için yerleşik bir mekanizma ekledi (en çok oy verilen cevap)
Amelio Vazquez-Reina

Yanıtlar:


243

Matplotlib'ın sonraki sürümlerinde yeni bir özellik olup olmadığından emin değilim, ancak en azından 1.3.1 için, bu sadece:

plt.title(figure_title, y=1.08)

Bu aynı zamanda çalışır plt.suptitle(), ancak henüz ( plt.xlabel()vb.)


6
Etiketler için argümanı ayarlayabilirsiniz, burayalabelpad bakın .
Felix Hoffmann

1
Değeri için, yeni bir özellik değil. titlealmıştır xve y(Hatırladığım kadarıyla herhangi bir oranda, uzun gibi) çok uzun bir süre için argümanlar.
Joe Kington

3
plt.set_title ('title string', y = 1.08) benim için çalışıyor.
Yu Shen

3
Birisi 1.08 birimlerinin ne olduğunu ve varsayılanların ne olduğunu açıklarsa daha yararlı olacaktır. Benim anlayış varsayılan 1 olduğunu
kon psych

3
@JohnCummings Görünüşe göre varsayılan değer y = 1 ve birimler "eksen kesiri", yani y = 0,5, başlık eksenlerin ortasında, y = 0 ise başlık, eksenler.
herrlich10

33

Kullanmayı unutun plt.titleve metni doğrudan ile yerleştirin plt.text. Aşırı abartılı bir örnek aşağıda verilmiştir:

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

resim açıklamasını buraya girin


@ user815423426 evet, tight_layoutyine de standart dışı yerleşimlerle iyi oynamıyor gibi görünüyor. Belki bir hata raporu verebilirsin?
Hooked

2
En azından figure.savefig () kullanarak çiziminizi kaydettiğinizde, tight_layout kullanırken bir çözüm buldum . Eğer title = plt.title(...)öyleyse, seçeneği kullanarak arsa etrafında sıkıca çerçeveyi belirtebilirsiniz 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'Başlık dizenizin hemen arkasına koyarsanız , grafik başlığın hemen altına çizilir. Bu da hızlı bir çözüm olabilir.


8

Bir alt alan başlığı örtüşen x etiketi ile ilgili bir sorun vardı; bu benim için çalıştı:

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

önce

resim açıklamasını buraya girin

sonra

resim açıklamasını buraya girin

referans:


4

Daha plt.tight_layout()önce kullanın plt.show(). İyi çalışıyor.


4

Bu durumda ped kullanabilirsiniz:

ax.set_title("whatever", pad=20)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.