Cambiar la escala de los ejes x en matplotlib

93

Creé esta trama usando Matlab

ingrese la descripción de la imagen aquí

Usando matplotlib, el eje x dibuja números grandes como 100000, 200000, 300000. Me gustaría tener algo como 1, 2, 3 y 10 ^ 5 para indicar que en realidad es 100000, 200000, 300000.

¿Existe una forma sencilla de crear tal escala en matplotlib?

Águila
fuente

Respuestas:

145

Intente usar matplotlib.pyplot.ticklabel_format:

import matplotlib.pyplot as plt
...
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))

Esto aplica la notación científica (es decir a x 10^b) a las marcas de graduación del eje x

Chris
fuente
9
¿Es posible agregar un desplazamiento? (por ejemplo, en lugar de 0.0, 0.5, 1.0, 1.5, ... y x 10 ^ b será 0, 5, 10, 15, ... y x 10 ^ {b-1})
Eagle
24
ticklabel_formattambién es un método para los objetos de los ejes, puede probar algo comoax.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
Covich
¿Cómo puede funcionar esto si tiene una subparcela de, digamos, 2 parcelas?
FaCoffee
2
@Eagle lo siento, su pregunta de seguimiento sobre la adición de una compensación era a lo que me refería. mi eje x es [0.1, 0.2, ...]y preferiría [1, 2, ...]con un exponente ajustado. ¿Pudiste encontrar una solución para eso?
trianta2
@Eagle También estoy interesado en la pregunta que mencionó trianta2
Ben Usman
15

Esta no es tanto una respuesta a su pregunta original como a una de las consultas que tenía en el cuerpo de su pregunta.

Un pequeño preámbulo, para que mi denominación no parezca extraña:

import matplotlib
from matplotlib import rc
from matplotlib.figure import Figure
ax = self.figure.add_subplot( 111 )

Como se ha mencionado, puede usar ticklabel_format para especificar que matplotlib debe usar la notación científica para valores grandes o pequeños:

ax.ticklabel_format(style='sci',scilimits=(-3,4),axis='both')

Puede afectar la forma en que esto se muestra usando los indicadores en rcParams (de matplotlib import rcParams) o configurándolos directamente. No he encontrado una forma más elegante de cambiar entre la notación científica '1e' y 'x10 ^' que:

ax.xaxis.major.formatter._useMathText = True

Esto debería darle más Matlab-esc y, de hecho, posiblemente una mejor apariencia. Creo que lo siguiente debería hacer lo mismo:

rc('text', usetex=True)
Weir_Doe
fuente
11

El formateador escalar admite la recopilación de exponentes. Los documentos son los siguientes:

class matplotlib.ticker.ScalarFormatter (useOffset = True, useMathText = False, useLocale = None) Bases: matplotlib.ticker.Formatter

La ubicación de la marca es un número simple y antiguo. Si useOffset == True y el rango de datos es mucho más pequeño que el promedio de datos, entonces se determinará un desplazamiento de manera que las etiquetas de marca sean significativas. La notación científica se usa para datos <10 ^ -n o datos> = 10 ^ m, donde nym son los límites de potencia establecidos usando set_powerlimits ((n, m)). Los valores predeterminados para estos se controlan mediante el parámetro rc axes.formatter.limits.

tu técnica sería:

from matplotlib.ticker import ScalarFormatter
xfmt = ScalarFormatter()
xfmt.set_powerlimits((-3,3))  # Or whatever your limits are . . .
{{ Make your plot }}
gca().xaxis.set_major_formatter(xfmt)

Para que el exponente se muestre en el formato x10^5, cree una instancia de ScalarFormatter con useMathText=True.

Después de la imagen

También puede utilizar:

xfmt.set_useOffset(10000)

Para obtener un resultado como este:

ingrese la descripción de la imagen aquí

Carl F.
fuente
3
Cree una instancia de ScalarFormatter con useMathText=Truepara obtener x10^4.
Hasta Hoffmann
9

Encuentro la solución simple

pylab.ticklabel_format(axis='y',style='sci',scilimits=(1,4))
cunzhang
fuente