2012-02-15 14 views
26

Quiero que mi eje x tiene la etiqueta como este formatocómo preparar mi xlabel al final del eje x

0 1 2 3 4 5 Xlabel 

pero trato código de abajo me resulta en 2 líneas

self.axes.set_xticks(np.arange(0,6,1)) 
self.axes.set_xlabel('Xlabel', fontsize=9,x=1,y=1) 

= > :(mi resultado

0 1 2 3 4 5 
     Xlabel 

Respuesta

31

al ajustar el xlabel, el parámetro x asigna la posición en unidades del eje, por lo que 0 es el ori gin y 1 es el borde derecho de la trama. y se ignora, ya que se espera que sea un valor predeterminado, justo debajo de las marcas de graduación.

Para anular este comportamiento, puede establecer la posición en unidades de eje utilizando Axisset_label_coordsmethod. Puede usar otras unidades al proporcionar también una transformación.

Aquí es un ejemplo de esto:

import matplotlib.pyplot as plt 
import numpy as np 

ax = plt.gca() 
ax.set_xticks(np.arange(0,6,1)) 
label = ax.set_xlabel('Xlabel', fontsize = 9) 
ax.xaxis.set_label_coords(1.05, -0.025) 

plt.savefig('labelAtEnd.png') 
plt.show() 

Resultando en: enter image description here

El valor x (1,05) fue elegido para posicionar la etiqueta fuera del marco de los ejes. El valor y (-0.025) se eligió como la mejor estimación para la posición que deseaba. Con una transformación, es posible que el texto se coloque automáticamente en línea con las etiquetas Tick.

EDIT:

He aquí un ejemplo ampliado usando una transformación. No es necesariamente más útil usar la última transformación de ticklabel, porque no tiene en cuenta el tamaño del texto y cómo se alinea. Entonces para obtener un efecto deseado, tuve que 1) usar el mismo tamaño de letra para mi etiqueta x, 2) colocar la alineación vertical (va) en 'arriba', y 3) colocar la alineación horizontal en 'izquierda'. La transformación para cada tilde se establece para unidades de datos para x (porque es un xaxis) y unidades de eje para y (0 a 1), pero desplazadas por un relleno fijo (en píxeles) del eje x.

import matplotlib.pyplot as plt 
import numpy as np 

ax = plt.gca() 
ax.set_xticks(np.arange(0,6,1)) 
ax.set_yticks(np.arange(0,6,1)) 
label = ax.set_xlabel('xlabel', ha='left', va = 'top',)#fontsize = 9) 

# need to draw the figure first to position the tick labels 
fig = plt.gcf() 
fig.draw(fig.canvas.get_renderer()) 

# get a tick and will position things next to the last one 
ticklab = ax.xaxis.get_ticklabels()[0] 
trans = ticklab.get_transform() 
ax.xaxis.set_label_coords(5.1, 0, transform=trans) 

plt.savefig('labelAtEnd2.png') 
plt.show() 

Esto se traduce en:

enter image description here

+1

¿Podría dar un ejemplo del uso de una transformación también? –

+1

@Zhenya Agregué un ejemplo, pero resulta que no es trivial. – Yann

+0

muchas gracias! – billyduc

15

Además de lo que ya se dijo @Yann, en realidad es más fácil de hacer esto con annotate. También se mantendrá en la posición correcta cuando se amplía/panoramiza.

import matplotlib.pyplot as plt 
import matplotlib as mpl 

ticklabelpad = mpl.rcParams['xtick.major.pad'] 

fig, ax = plt.subplots() 
ax.set_xlim([0, 5]) 

# Add the label as annotation. The "5" is the padding betweent the right side 
# of the axis and the label... 
ax.annotate('XLabel', xy=(1,0), xytext=(5, -ticklabelpad), ha='left', va='top', 
      xycoords='axes fraction', textcoords='offset points') 

plt.show() 

enter image description here

+0

gracias por su respuesta Joe – billyduc

3

Aquí es mi variante de utilizar @JoeKington método. Cambio la etiqueta de la última marca al nombre del eje. Primero configuro los últimos tics para cadenas vacías y luego uso anotar(). He usado anotar() porque necesito controlar el tamaño de fuente de la etiqueta del eje.

import numpy as np 
import matplotlib.pyplot as plt 

plt.xlim(50, 70) 
plt.ylim(100, 250) 

ax = plt.gca() 
# clears last tick label 
xticks = ax.get_xticks().tolist() 
xticks[-1] = '' 
ax.set_xticklabels(xticks) 
yticks = ax.get_yticks().tolist() 
yticks[-1] = '' 
ax.set_yticklabels(yticks) 
# sets axes labels on both ends 
ax.annotate('$t$', xy=(0.98, 0), ha='left', va='top', xycoords='axes fraction', fontsize=20) 
ax.annotate('$x$', xy=(0, 1), xytext=(-15,2), ha='left', va='top', xycoords='axes fraction', textcoords='offset points', fontsize=20) 

plt.show(block=True) 

Quizás alguien sepa una forma más elegante de hacerlo, porque es una operación ridículamente compleja.

enter image description here

-1

Para la gente que desea asignar un nombre axises y que están utilizando directamente plt y no algún ax ni fig:

plt.figure(figsize=(width, height)) 
plt.plot(x_list, y_list) 
plt.xlabel('x axis name') 
plt.ylabel('y axis name') 
plt.title("Plot's title") 
plt.show() 

Para agregar a este ejemplo de demostración, he aquí algunos ejemplos prácticos: https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition

+0

Esto no ubica la etiqueta al final del eje. – jinawee

Cuestiones relacionadas