El título de la figura de Python Matplotlib se superpone a la etiqueta de los ejes cuando se usa twiny

139

Estoy tratando de trazar dos cantidades separadas en el mismo gráfico usando twiny de la siguiente manera:

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

y los datos se presentan bien, pero tengo el problema de que el título de la figura se superpone con las etiquetas de los ejes en el eje x secundario para que sea apenas legible (quería publicar un ejemplo de imagen aquí, pero no tengo un rep suficientemente alto todavía).

Me gustaría saber si hay una forma sencilla de cambiar el título directamente hacia arriba unas pocas decenas de píxeles, para que el gráfico se vea más bonito.

Magic_Matt_Man
fuente
1
¡Bienvenido a Stack Overflow! Si se vincula a una publicación imgur de su imagen, un usuario de mayor reputación insertará la imagen en su publicación por usted.
Enganchado el
@Magic: ¿reconsideraría qué respuesta aceptar para esta pregunta? Matplotlib ha agregado un mecanismo incorporado para manejar esta necesidad precisa (la respuesta más votada a continuación)
Amelio Vazquez-Reina

Respuestas:

243

No estoy seguro de si es una nueva característica en versiones posteriores de matplotlib, pero al menos para 1.3.1, esto es simplemente:

plt.title(figure_title, y=1.08)

Esto también funciona para plt.suptitle(), pero no (todavía) para plt.xlabel(), etc.

herrlich10
fuente
66
Para las etiquetas, puede establecer el argumento labelpad, consulte aquí .
Felix Hoffmann
1
Por lo que vale, no es una característica nueva. titleha tomado xy yargumentos durante mucho tiempo (hasta donde puedo recordar, en cualquier caso).
Joe Kington
3
plt.set_title ('title string', y = 1.08) funciona para mí.
Yu Shen
3
Sería más útil si alguien explicara qué son las unidades 1.08 y cuáles son los valores predeterminados. Tengo entendido que el valor predeterminado es 1
kon psych
3
@JohnCummings Parece que el valor predeterminado es y = 1 y las unidades son "fracción de ejes", es decir, y = 0.5 significa que el título está en el medio de los ejes, y y = 0 significa que el título está justo arriba de la parte inferior de Los ejes.
herrlich10
33

Olvídate de usar plt.titley coloca el texto directamente con plt.text. A continuación se da un ejemplo exagerado:

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

ingrese la descripción de la imagen aquí

Enganchado
fuente
@ user815423426 sí, tight_layouttodavía no parece funcionar bien con ubicaciones no estándar. ¿Quizás podrías hacer un informe de error?
Enganchado el
2
Encontré una solución al usar tight_layout, al menos cuando guardas tu trama usando figure.savefig () . Si title = plt.title(...)luego puede especificar enmarcar la trama estrechamente alrededor del título usando la opción 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")

Si coloca '\n'justo después de su cadena de título, la trama se dibuja justo debajo del título. Esa podría ser una solución rápida también.

Efkan
fuente
8

Estaba teniendo un problema con la etiqueta x superpuesta a un título de subtrama; esto funcionó para mí:

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

antes de

ingrese la descripción de la imagen aquí

después

ingrese la descripción de la imagen aquí

referencia:

jmunsch
fuente
4

Solo usa plt.tight_layout()antes plt.show(). Funciona bien.

Peter Zhu
fuente
4

Puede usar el pad para este caso:

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