HOWTO · Matplotlib
Matplotlib Tick Label en notación científica
Esta publicación le enseñará a usar Matplotlib ticklabel_format() para mostrar la etiqueta de ticks en notación científica.
En esta página
Para mostrar las etiquetas de las marcas en notación científica en Matplotlib, llama a ticklabel_format(style="sci", scilimits=(0, 0)) en los ejes que quieras dar formato. El ejemplo siguiente lo aplica al eje y de un gráfico con etiquetas; usa axis="both" para dar formato a ambos ejes.
Da formato a las etiquetas de las marcas con ticklabel_format()
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import logging
# The first font-cache build is a normal startup notice, not an execution error.
logging.getLogger("matplotlib.font_manager").setLevel(logging.ERROR)
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
x = np.linspace(0, 1_000_000, 100)
y = 22_000 * (x / 1_000_000) ** 10
ax.plot(x, y)
ax.set_xlabel("X values")
ax.set_ylabel("Y values")
ax.set_title("Scientific Notation in Matplotlib")
ax.ticklabel_format(axis="y", style="sci", scilimits=(0, 0))
fig.tight_layout()
plt.show()
print("Scientific notation enabled on the y-axis.")
Scientific notation enabled on the y-axis.
plt.show() abre el gráfico con sus etiquetas en un entorno interactivo de Matplotlib. La imagen muestra el mismo título, las mismas etiquetas y los mismos rangos de los ejes, además de una curva que crece rápidamente; el código y el estado impreso siguen siendo seleccionables.
ticklabel_format() es un método práctico de pyplot para configurar el formateador escalar que ya usa un eje. El valor de style es "sci" para la notación científica o "plain" para las etiquetas decimales habituales. Las opciones válidas para el eje son "x", "y" y "both"; el argumento se llama axis, en singular. En un gráfico orientado a objetos, llama a ax.ticklabel_format(...) en el objeto Axes correspondiente.
Elige el eje y cuándo aparece la notación científica
Usa axis="x" o axis="y" si solo quieres cambiar la presentación de un conjunto de marcas, o axis="both" si quieres cambiar ambos. La configuración predeterminada de scilimits deja que Matplotlib decida cuándo cambiar a notación científica. Los enteros de la tupla son umbrales de exponentes aplicados al rango del eje, no límites de valores numéricos: indican cuándo el formateador escalar cambia entre etiquetas decimales y científicas. El caso especial scilimits=(0, 0) fuerza la notación científica para las etiquetas de marcas escalares, lo que resulta útil si quieres mantener ese formato en todo el gráfico. Esto solo cambia el formato de las etiquetas; no modifica los datos subyacentes ni la ubicación de las marcas.
El ejemplo da formato explícitamente solo al eje y para mostrar cómo seleccionar un eje; Matplotlib puede elegir por su cuenta la notación científica para los valores grandes del eje x. Si das formato a ambos ejes, los dos conjuntos de marcas siguen la política de formato escalar indicada. Elige el eje según los valores y la comparación que necesite hacer el lector.
Personaliza la notación científica con ScalarFormatter
Usa ScalarFormatter cuando necesites configurar directamente el formateador, por ejemplo, para dar estilo de texto matemático al exponente o establecer límites de potencias. Crea una instancia con ScalarFormatter(useMathText=True) y luego asígnala con ax.yaxis.set_major_formatter(formatter). Para ambos ejes, configura cada uno por separado. Para controlar el rango, establece formatter.set_powerlimits((m, n)); formatter.set_scientific(True) activa explícitamente la notación científica. Este es el formateador escalar estándar que utiliza ticklabel_format(), por lo que es una opción natural para marcas numéricas convencionales cuando se necesita más control sobre la presentación de los exponentes.
Define etiquetas de marcas personalizadas con FuncFormatter
Usa FuncFormatter cuando necesites una regla de formato personalizada para las etiquetas, como añadir unidades o elegir una cantidad fija de cifras significativas. Su función de retorno recibe el valor de la marca y su posición, normalmente mediante una definición como def format_tick(value, position): ..., y devuelve la etiqueta como una cadena. Por ejemplo, FuncFormatter(lambda value, position: f"{value:.2e}") expresa cada valor en notación científica; asígnalo al eje y con ax.yaxis.set_major_formatter(...). Puedes ignorar el argumento de posición si la etiqueta depende solo del valor. A diferencia de ScalarFormatter, esta función define todo el texto de la etiqueta, así que no coordina automáticamente un exponente común ni el estilo de texto matemático.
Soluciona problemas con el comportamiento del formateador
Si ticklabel_format() genera un AttributeError, revisa el formateador del eje: el método configura un ScalarFormatter y no se aplica a todas las clases de formateadores. Esto puede ocurrir después de asignar un FuncFormatter o un formateador de fechas o logarítmico. Llama a ticklabel_format() antes de sustituir el formateador, o usa directamente ScalarFormatter si necesitas restablecer el formato escalar. No des por hecho que todas las clases de formateadores aceptan las mismas opciones.
En un eje logarítmico, la escala y su formateador determinan la ubicación y las etiquetas de las marcas. Una configuración de formateador escalar que funciona en un eje lineal no es una solución universal para ejes logarítmicos; usa el formateador adecuado para la escala, salvo que tengas un motivo concreto para sustituirlo, y revisa las marcas resultantes. Si aparece un exponente inesperado, comprueba qué eje seleccionaste, qué escala tiene y qué formateador está asignado antes de ajustar scilimits.