Quiero hacer algunas modificaciones a algunas etiquetas de marca seleccionadas en un gráfico.
Por ejemplo, si lo hago:
label = axes.yaxis.get_major_ticks()[2].label
label.set_fontsize(size)
label.set_rotation('vertical')
Se cambia el tamaño de fuente y la orientación de la etiqueta.
Sin embargo, si intentas:
label.set_text('Foo')
la etiqueta de marca no se modifica. 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()
Solo se imprimen cadenas vacías, pero el gráfico contiene marcas marcadas como '0.0', '0.5', '1.0', '1.5' y '2.0'.
python
matplotlib
hombre repo
fuente
fuente
draw()
antes de intentar imprimir las etiquetas, obtendrá lo que espera. Desafortunadamente, establecer etiquetas de marca individuales es un poco más difícil (lo que sucede es que el localizador y formateador de marca no se ha reiniciado y anula las cosas cuando ustedset_text
). Agregaré un ejemplo en un momento, si alguien no me gana. Sin embargo, tengo que tomar el autobús en este momento.Respuestas:
Advertencia: a menos que las etiquetas 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
1.1.0
. Si está trabajando desde el maestro github actual, esto no funcionará. Todavía no estoy seguro de cuál es el problema ... Puede ser un cambio no deseado, o puede no ser ...Normalmente, harías algo en este sentido:
Para comprender la razón por la que necesita pasar por tantos aros, necesita comprender un poco más sobre cómo está estructurado matplotlib.
Matplotlib evita deliberadamente realizar el posicionamiento "estático" de las garrapatas, etc., a menos que se indique explícitamente. La suposición es que querrá interactuar con la trama, por lo que los límites de la trama, las marcas, las marcas de verificación, etc. cambiarán dinámicamente.
Por lo tanto, no puede simplemente establecer el texto de una etiqueta de marca dada. De forma predeterminada, el Localizador y Formateador del eje lo restablece cada vez que se dibuja el gráfico.
Sin embargo, si los localizadores y formateadores están configurados para ser estáticos (
FixedLocator
yFixedFormatter
, respectivamente), las etiquetas de marca permanecen igual.Esto es lo que
set_*ticklabels
oax.*axis.set_ticklabels
hace.Esperemos que eso aclare un poco más por qué cambiar una etiqueta de marca individual es un poco complicado.
A menudo, lo que realmente quieres hacer es anotar una determinada posición. En ese caso, busca en su
annotate
lugar.fuente
bold
mientras otros usan el fontweight de "light"? ¿Hay una manera de hacerlo?fig.canvas.draw()
es crucialTambién se puede hacer esto con pylab y xticks
http://matplotlib.org/examples/ticks_and_spines/ticklabels_demo_rotation.html
fuente
En las versiones más recientes de
matplotlib
, si no establece las etiquetas de marca con un montón destr
valores, son''
por defecto (y cuando se dibuja el gráfico, las etiquetas son simplemente los valores de las marcas). Sabiendo eso, para obtener el resultado deseado requeriría algo como esto:y el resultado:
y ahora si revisas el
_xticklabels
, ya no son muchos''
.Funciona en las versiones de
1.1.1rc1
a la versión actual2.0
.fuente
set_xticklabels
una lista mixta de cadenas y objetos de marca.ax.get_xticks().tolist()
). La solución más votada no lo hizo (ax.get_xtickslabels()
). De alguna manera no fue capaz de extraer las etiquetas antes de queplt.show()
se eliminara, aunque lo uséfig.canvas.draw()
como se sugirió.Ha pasado un tiempo desde que se hizo esta pregunta. A partir de hoy (
matplotlib 2.2.2
) y después de algunas lecturas y pruebas, creo que la mejor / adecuada es la siguiente:Matplotlib tiene un módulo llamado
ticker
que "contiene clases para admitir localización y formateo de ticks completamente configurables" . Para modificar una marca específica de la trama, lo siguiente funciona para mí:¡Consideración!
x
es el valor de la marca ypos
es su posición relativa en orden en el eje. Tenga en cuenta quepos
toma valores que comienzan en1
, no0
como de costumbre al indexar.En mi caso, estaba tratando de formatear el
y-axis
histograma con valores porcentuales.mticker
tiene otra clase llamadaPercentFormatter
que puede hacer esto fácilmente sin la necesidad de definir una función separada como antes:En este caso
xmax
es el valor de los datos que corresponde al 100%. Los porcentajes se calculan comox / xmax * 100
, por eso lo arreglamosxmax=1.0
. Además,decimals
es el número de lugares decimales para colocar después del punto.fuente
La clase de ejes tiene una función set_yticklabels que le permite establecer las etiquetas de marca, de esta manera:
Todavía estoy trabajando en por qué su ejemplo anterior no funcionó.
fuente
Esto funciona:
fuente
Esto también funciona en matplotlib 3:
fuente
Si no se trabaja con
fig
yax
y desea modificar todas las etiquetas (por ejemplo, para la normalización) se puede hacer esto:fuente
Prueba esto :
fuente
tu puedes hacer:
fuente