2012-06-28 624 views
115

Quiero hacer algunas modificaciones en algunas etiquetas de marca seleccionadas en un trazado.Modificar texto de etiqueta de marcación

Por ejemplo, si hago:

label = axes.yaxis.get_major_ticks()[2].label 
label.set_fontsize(size) 
label.set_rotation('vertical') 

el tamaño de fuente y la orientación de la etiqueta garrapata se cambia.

Sin embargo, si intento:

label.set_text('Foo') 

la etiqueta garrapata es no modificado. También si lo hago:

print label.get_text() 

no se imprime nada.

Aquí hay algo más extraño. Cuando probé esto:

from pylab import * 
axes = figure().add_subplot(111) 
t = arange(0.0, 2.0, 0.01) 
s = sin(2*pi*t) 
axes.plot(t, s) 
for ticklabel in axes.get_xticklabels(): 
    print ticklabel.get_text() 

cuerdas Sólo vacías se imprimen, pero la trama contiene garrapatas etiquetados como '0.0', '0.5', '1.0', '1.5', y '2.0'.

+0

¿Puede supl y la trama que utilizó para obtener la etiqueta? – Claudio

+1

Ver fragmento por encima de – repoman

+0

Obtendrá etiquetas en blanco porque aún no ha dibujado el lienzo. Si llama a 'dibujar()' antes de tratar de imprimir las etiquetas, obtendrá lo que espera. El ajuste de etiquetas de tilde individuales es, lamentablemente, un poco más difícil (lo que sucede es que el localizador de ticks y el formateador no se han restablecido y anula las cosas cuando '' set_text'). Agregaré un ejemplo en un momento, si alguien no me pega. Tengo que tomar el autobús, por el momento, sin embargo. –

Respuesta

156

Advertencia: A menos que las ticklabels ya están configurados en una cadena (como suele ser el caso en el ejemplo de un diagrama de caja), esto no va a funcionar con cualquier versión de matplotlib más nuevo que 1.1.0. Si está trabajando desde el maestro actual de Github, esto no funcionará. No estoy seguro de cuál es el problema todavía es ... Puede ser un cambio no deseado, o puede que no sea ...

Normalmente, usted haría algo como lo siguiente:

import matplotlib.pyplot as plt 

fig, ax = plt.subplots() 

# We need to draw the canvas, otherwise the labels won't be positioned and 
# won't have values yet. 
fig.canvas.draw() 

labels = [item.get_text() for item in ax.get_xticklabels()] 
labels[1] = 'Testing' 

ax.set_xticklabels(labels) 

plt.show() 

enter image description here

Para comprender el motivo por el que necesita pasar por tantos aros, debe comprender un poco más cómo está estructurado matplotlib.

Matplotlib evita deliberadamente la colocación "estática" de tics, etc., a menos que se indique explícitamente. La suposición es que querrás interactuar con la trama, por lo que los límites de la trama, los ticks, ticklabels, etc. cambiarán dinámicamente.

Por lo tanto, no puede simplemente configurar el texto de una etiqueta de tilde determinada. Por defecto, el Localizador y el Formateador del eje lo vuelven a configurar cada vez que se dibuja el gráfico.

Sin embargo, si los localizadores y los formateadores se configuran como estáticos (FixedLocator y FixedFormatter, respectivamente), las etiquetas de tilde se mantienen igual.

Esto es lo que hace set_*ticklabels o .

Afortunadamente eso hace que sea ligeramente más claro en cuanto a por qué el cambio de una etiqueta de tilde individual es un poco intrincado.

A menudo, lo que realmente quiere hacer es anotar una determinada posición. En ese caso, mira en annotate, en su lugar.

+5

esto no parece funcionar con la versión actual (1.20)! –

+1

Si las etiquetas de tick ya están configuradas en una cadena como en p. Ej. un diagrama de caja, esto todavía está funcionando. Esto podría ser obvio, pero dado que la primera línea de la respuesta es que no está funcionando en las versiones más nuevas de matplotlib, los usuarios pueden omitirla por completo (lo hice inicialmente). Tal vez mencionar esto brevemente. –

+2

creo que puede condensarlo en * plt.gca(). Set_xticklabels (labels) * – alexey

10

La clase ejes tiene una función set_yticklabels que le permite configurar las etiquetas señalizadoras, así:

#ax is the axes instance 
group_labels = ['control', 'cold treatment', 
      'hot treatment', 'another treatment', 
      'the last one'] 

ax.set_xticklabels(group_labels) 

Todavía estoy trabajando sobre por qué el ejemplo anterior no funcionó.

+2

Pero solo quiero alterar una sola etiqueta. El truco anterior requiere que extraigas todas las etiquetas y establezcas el deseado en un nuevo valor. Pero, ¿cómo puedo extraer las etiquetas tick cuando label.get_text() no devuelve nada? – repoman

-4

que puede hacer:

for k in ax.get_xmajorticklabels(): 
    if some-condition: 
     k.set_color(any_colour_you_like) 

draw() 
65

En las nuevas versiones de matplotlib, si no se establece las etiquetas señalizadoras con un montón de str valores, que son '' por defecto (y cuando la trama es dibujar las etiquetas son simplemente los valores de los ticks). Sabiendo que, para obtener su salida deseada requeriría algo como esto:

>>> from pylab import * 
>>> axes = figure().add_subplot(111) 
>>> a=axes.get_xticks().tolist() 
>>> a[1]='change' 
>>> axes.set_xticklabels(a) 
[<matplotlib.text.Text object at 0x539aa50>, <matplotlib.text.Text object at 0x53a0c90>, 
<matplotlib.text.Text object at 0x53a73d0>, <matplotlib.text.Text object at 0x53a7a50>, 
<matplotlib.text.Text object at 0x53aa110>, <matplotlib.text.Text object at 0x53aa790>] 
>>> plt.show() 

y el resultado: enter image description here

y ahora si se comprueba la _xticklabels, que ya no son un montón de ''.

>>> [item.get_text() for item in axes.get_xticklabels()] 
['0.0', 'change', '1.0', '1.5', '2.0'] 

funciona en las versiones de 1.1.1rc1 a la versión actual 2.0.

+0

Gracias, esta es la respuesta que estaba buscando. La solución más limpia IMO; simplemente suministre 'set_xticklabels' con una lista mixta de cadenas y marque objetos. –

+0

Tenga en cuenta que si las etiquetas de tilde se configuran como ints, esto las cambiará a flotantes. Funcionó fácilmente pero vale la pena señalar. – ApproachingDarknessFish

56

Uno también puede hacer esto con pylab y xticks

import pylab as plt 
x = [0,1,2] 
y = [90,40,65] 
labels = ['high', 'low', 37337] 
plt.plot(x,y, 'r') 
plt.xticks(x, labels, rotation='vertical') 
plt.show() 

http://matplotlib.org/examples/ticks_and_spines/ticklabels_demo_rotation.html

+0

Esta es una solución simple y funciona con pyplot 1.5.1. Esto debe ser votado. – wordsmith

+0

Aunque la pregunta no me pidió esto, agradezco que este ejemplo le permita establecer la ubicación de los ticks al mismo tiempo que modifica sus etiquetas. – eclark

1

Esto funciona:

import matplotlib.pyplot as plt 

fig, ax1 = plt.subplots(1,1) 

x1 = [0,1,2,3] 
squad = ['Fultz','Embiid','Dario','Simmons'] 

ax1.set_xticks(x1) 
ax1.set_xticklabels(squad, minor=False, rotation=45) 

FEDS

Cuestiones relacionadas