Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

1.6K
Vistas
Advertencia para el usuario: FixedFormatter solo debe usarse junto con FixedLocator

He usado durante mucho tiempo pequeñas subrutinas para formatear los ejes de los gráficos que estoy trazando. Un par de ejemplos:

 def format_y_label_thousands(): # format y-axis tick labels formats ax = plt.gca() label_format = '{:,.0f}' ax.set_yticklabels([label_format.format(x) for x in ax.get_yticks().tolist()]) def format_y_label_percent(): # format y-axis tick labels formats ax = plt.gca() label_format = '{:.1%}' ax.set_yticklabels([label_format.format(x) for x in ax.get_yticks().tolist()])

Sin embargo, después de una actualización de matplotlib ayer, recibo la siguiente advertencia al llamar a cualquiera de estas dos funciones:

 UserWarning: FixedFormatter should only be used together with FixedLocator ax.set_yticklabels([label_format.format(x) for x in ax.get_yticks().tolist()])

¿Cuál es la razón de tal advertencia? No pude resolverlo mirando la documentación de matplotlib.

over 4 years ago · Hanz Gallego
5 Respuestas
Responde la pregunta

0

SOLUCIÓN ALTERNA:

La forma de evitar la advertencia es usar FixedLocator (que es parte de matplotlib.ticker). A continuación muestro un código para trazar tres gráficos. Formato sus ejes de diferentes maneras. Tenga en cuenta que "set_ticks" silencia la advertencia, pero cambia las ubicaciones/etiquetas reales de las marcas (me tomó un tiempo darme cuenta de que FixedLocator usa la misma información pero mantiene intactas las ubicaciones de las marcas). Puede jugar con las x/y para ver cómo cada solución podría afectar la salida.

 import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import matplotlib.ticker as mticker mpl.rcParams['font.size'] = 6.5 x = np.array(range(1000, 5000, 500)) y = 37*x fig, [ax1, ax2, ax3] = plt.subplots(1,3) ax1.plot(x,y, linewidth=5, color='green') ax2.plot(x,y, linewidth=5, color='red') ax3.plot(x,y, linewidth=5, color='blue') label_format = '{:,.0f}' # nothing done to ax1 as it is a "control chart." # fixing yticks with "set_yticks" ticks_loc = ax2.get_yticks().tolist() ax2.set_yticks(ax1.get_yticks().tolist()) ax2.set_yticklabels([label_format.format(x) for x in ticks_loc]) # fixing yticks with matplotlib.ticker "FixedLocator" ticks_loc = ax3.get_yticks().tolist() ax3.yaxis.set_major_locator(mticker.FixedLocator(ticks_loc)) ax3.set_yticklabels([label_format.format(x) for x in ticks_loc]) # fixing xticks with FixedLocator but also using MaxNLocator to avoid cramped x-labels ax3.xaxis.set_major_locator(mticker.MaxNLocator(3)) ticks_loc = ax3.get_xticks().tolist() ax3.xaxis.set_major_locator(mticker.FixedLocator(ticks_loc)) ax3.set_xticklabels([label_format.format(x) for x in ticks_loc]) fig.tight_layout() plt.show()

GRÁFICOS DE SALIDA:

Gráficos de muestra

Obviamente, tener un par de líneas de código inactivas como la de arriba (básicamente obtengo los yticks o xticks y los configuro nuevamente) solo agrega ruido a mi programa. Preferiría que se eliminara la advertencia. Sin embargo, mire algunos de los "informes de errores" (de los enlaces en los comentarios arriba/abajo; el problema no es realmente un error: es una actualización que está generando algunos problemas), y los contribuyentes que administran matplotlib tienen sus razones para mantener la advertencia.

VERSIÓN ANTERIOR DE MATPLOTLIB: si usa su consola para controlar las salidas críticas de su código (como lo hago yo), los mensajes de advertencia pueden ser problemáticos. Por lo tanto, una forma de retrasar el tener que lidiar con el problema es degradar matplotlib a la versión 3.2.2. Uso Anaconda para administrar mis paquetes de Python, y aquí está el comando que se usa para degradar matplotlib:

 conda install matplotlib=3.2.2

Es posible que no todas las versiones enumeradas estén disponibles. Por ejemplo, no se pudo instalar matplotlib 3.3.0 aunque aparece en la página de lanzamientos de matplotlib: https://github.com/matplotlib/matplotlib/releases

over 4 years ago · Hanz Gallego Denunciar

0

solo usa axis.set_xticks([labels])

over 4 years ago · Hanz Gallego Denunciar

0

Si alguien llega aquí usando la función axes.xaxis.set_ticklabels() (o el equivalente de yaxis), no necesita usar FixedLocator, puede evitar esta advertencia usando axes.xaxis.set_ticks(values_list) ANTES axes.xaxis.set_ticklabels(labels_list) .

over 4 years ago · Hanz Gallego Denunciar

0

De acuerdo con esta página matplotlib

 # FixedFormatter should only be used together with FixedLocator. # Otherwise, one cannot be sure where the labels will end up.

Esto significa que uno debe hacer

 positions = [0, 1, 2, 3, 4, 5] labels = ['A', 'B', 'C', 'D', 'E', 'F'] ax.xaxis.set_major_locator(ticker.FixedLocator(positions)) ax.xaxis.set_major_formatter(ticker.FixedFormatter(labels))

Pero el problema también persistía con ticker.LogLocator , incluso si las etiquetas se pasaban a ticker.FixedFormatter . Así que la solución en este caso fue

  1. Definir una función de formateador

     # FuncFormatter can be used as a decorator @ticker.FuncFormatter def major_formatter(x, pos): return f'{x:.2f}'
  2. y pasar la función del formateador al FixedFormatter

     ax.xaxis.set_major_locator(ticker.LogLocator(base=10, numticks=5)) ax.xaxis.set_major_formatter(major_formatter)

Vea el enlace de arriba para más detalles.

over 4 years ago · Hanz Gallego Denunciar

0

La solución más simple es suprimir las advertencias (esto incluye UserWarning):

 import warnings warnings.filterwarnings("ignore")

El caso de uso sería si no desea que su cuaderno jupyter en github se vea destrozado con mensajes de advertencia. A diferencia de la mayoría de las advertencias, esta se sigue repitiendo si estás en un bucle (python 3.7).

over 4 years ago · Hanz Gallego Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda