Tengo una figura de matplotlib que estoy trazando datos que siempre se conocen como nanosegundos (1e-9). En el eje y, si tengo datos que son decenas de nanosegundos, es decir. 44e-9, el valor en el eje se muestra como 4.4 con un + 1e-8 como compensación. ¿Hay alguna forma de forzar que el eje muestre 44 con un desplazamiento + 1e-9?
Lo mismo ocurre con mi eje x donde el eje muestra + 5.54478e4, donde preferiría que mostrara un desplazamiento de +55447 (número entero, sin decimal; el valor aquí está en días).
He intentado un par de cosas como esta:
p = axes.plot(x,y)
p.ticklabel_format(style='plain')
para el eje x, pero esto no funciona, aunque probablemente lo esté usando incorrectamente o malinterpretando algo de los documentos, ¿alguien puede señalarme en la dirección correcta?
Gracias Jonathan
Intenté hacer algo con formateadores pero aún no he encontrado ninguna solución ...:
myyfmt = ScalarFormatter(useOffset=True)
myyfmt._set_offset(1e9)
axes.get_yaxis().set_major_formatter(myyfmt)
y
myxfmt = ScalarFormatter(useOffset=True)
myxfmt.set_portlimits((-9,5))
axes.get_xaxis().set_major_formatter(myxfmt)
En una nota al margen, estoy realmente confundido en cuanto a dónde reside realmente el objeto 'número de compensación' ... ¿es parte de los ticks mayores / menores?
fuente
set_units
? matplotlib.sourceforge.net/api/… (No puedo probarlo porque no tengo matplotlib aquí.)rcParams
apagar si está apagado por defecto:rcParams["axes.formatter.useoffset"] = False
como aquí: stackoverflow.com/questions/24171064/…Respuestas:
Tuve exactamente el mismo problema, y estas líneas solucionaron el problema:
fuente
ax.get_yaxis().get_major_formatter().set_useOffset(False)
from matplotlib.ticker import ScalarFormatter
código de @Gonzalo funcione o simplemente use la solución deUna solución mucho más sencilla es simplemente personalizar las etiquetas de las marcas. Toma este ejemplo:
Observe cómo en el caso del eje y, multipliqué los valores y
1e9
luego mencioné esa constante en la etiqueta yEDITAR
Otra opción es falsificar el multiplicador de exponentes agregando manualmente su texto en la parte superior de la gráfica:
EDIT2
También puede formatear el valor de desplazamiento del eje x de la misma manera:
fuente
Tienes que crear una subclase
ScalarFormatter
para hacer lo que necesitas ..._set_offset
solo agrega una constante, quieres establecerScalarFormatter.orderOfMagnitude
. Desafortunadamente, la configuración manualorderOfMagnitude
no hará nada, ya que se restablece cuandoScalarFormatter
se llama a la instancia para formatear las etiquetas de marca del eje. No debería ser tan complicado, pero no puedo encontrar una manera más fácil de hacer exactamente lo que quieres ... Aquí tienes un ejemplo:Lo que produce algo como:
Considerando que, el formato predeterminado se vería así:
¡Espero que esto ayude un poco!
Editar: Por lo que vale, tampoco sé dónde reside la etiqueta de compensación ... Sería un poco más fácil configurarla manualmente, pero no pude averiguar cómo hacerlo ... Tengo la sensación que tiene que haber una manera más fácil que todo esto. ¡Aunque funciona!
fuente
Similar a la respuesta de Amro, puede usar FuncFormatter
fuente
La solución de Gonzalo comenzó a funcionar para mí después de haber agregado
set_scientific(False)
:fuente
Como se ha señalado en los comentarios y en esta respuesta , el desplazamiento puede desactivarse globalmente, haciendo lo siguiente:
fuente
Creo que una forma más elegante es utilizar el formateador de ticker. Aquí hay un ejemplo para xaxis y yaxis:
fuente
Para la segunda parte, sin restablecer manualmente todos los ticks nuevamente, esta fue mi solución:
obviamente, puede configurar la cadena de formato a lo que desee.
fuente