graficos - graficar matrices en python
Modificar el texto de la etiqueta de marcar (6)
Advertencia: a menos que las etiquetas de tick ya estén configuradas en una cadena (como suele ser el caso, por ejemplo, en un diagrama de caja), esto no funcionará con ninguna versión de matplotlib más nueva que la 1.1.0
. Si está trabajando desde el maestro actual de Github, esto no funcionará. Aún no estoy seguro de cuál es el problema ... Puede ser un cambio involuntario, o puede que no sea ...
Normalmente, harías algo en esta línea:
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()
Para entender la razón por la que necesita saltar tantos aros, necesita comprender un poco más acerca de 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 establecer 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 tic no FixedFormatter
.
Esto es lo que set_*ticklabels
o ax.*axis.set_ticklabels
hace.
Afortunadamente eso hace que sea ligeramente más claro en cuanto a por qué el cambio de una etiqueta de tic-tac individual es un poco intrincado.
A menudo, lo que realmente quiere hacer es anotar una determinada posición. En ese caso, busque en annotate
, en su lugar.
Quiero hacer algunas modificaciones en algunas etiquetas de tic en un diagrama.
Por ejemplo, si lo 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 de tic está cambiada.
Sin embargo, si intenta:
label.set_text(''Foo'')
la etiqueta de la señal no se modifica. También si lo hago:
print label.get_text()
nada está impreso.
Aquí hay algo más extraño. Cuando intenté 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()
Solo se imprimen cadenas vacías, pero la gráfica contiene marcas etiquetadas como ''0.0'', ''0.5'', ''1.0'', ''1.5'' y ''2.0''.
En las versiones más nuevas de matplotlib
, si no establece las etiquetas de tic con un grupo de valores str
, están ''''
por defecto (y cuando se dibuja el gráfico, las etiquetas son simplemente los valores de ticks). Sabiendo eso, 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:
y ahora si compruebas las _xticklabels
, 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
.
La clase de ejes tiene una función set_yticklabels que le permite establecer las etiquetas de tic, 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é tu ejemplo anterior no funcionó.
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
tu puedes hacer:
for k in ax.get_xmajorticklabels():
if some-condition:
k.set_color(any_colour_you_like)
draw()