2012-10-05 17 views
91

Estoy intentando trazar dos cantidades separadas en el mismo gráfico usando Twiny como sigue:Python Matplotlib figura título se superpone etiqueta ejes utilizando Twiny

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 estoy teniendo el problema 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 todavía no tengo una representación lo suficientemente alta).

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

+0

¡Bienvenido a Stack Overflow! Si realiza un enlace a una publicación de imgur de su imagen, un usuario de mayor reputación insertará la imagen en su publicación por usted. – Hooked

+0

@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) –

Respuesta

169

No estoy seguro de si se trata de una nueva característica en versiones posteriores de matplotlib, pero al menos por 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.

+6

Para las etiquetas puede establecer el argumento' labelpad', consulte [aquí] (http://stackoverflow.com/a/6406750/692634). –

+1

Por lo que vale, no es una característica nueva. 'title' ha tomado argumentos' x' y 'y' durante mucho tiempo (siempre que pueda recordar, en cualquier caso). –

+0

esta debería ser la respuesta correcta aceptada – dashesy

29

Olvídese de usar plt.title y coloque el texto directamente en plt.text. Un ejemplo exagerado se da a continuación:

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

enter image description here

+0

¡Gracias por eso, creo que ha resuelto mi problema! no parece –

+0

dos problemas resueltos por @hooked en dos días ... gracias –

+0

Esta trabajar bien en combinación con 'tight_layout' .. –

1
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.

+0

esto no funcionó para mí – bgenchel

Cuestiones relacionadas