Cómo formatear el formato de número de eje a miles con una coma

3 minutos de lectura

avatar de usuario
IcemanBerlín

¿Cómo puedo cambiar el formato de los números en el eje x para que sean como 10,000 en vez de 10000? Idealmente, me gustaría hacer algo como esto:

x = format((10000.21, 22000.32, 10120.54), "#,###")

Aquí está el código:

import matplotlib.pyplot as plt

# create figure instance
fig1 = plt.figure(1)
fig1.set_figheight(15)
fig1.set_figwidth(20)

ax = fig1.add_subplot(2,1,1)

x = 10000.21, 22000.32, 10120.54

y = 1, 4, 15
ax.plot(x, y)

ax2 = fig1.add_subplot(2,1,2)

x2 = 10434, 24444, 31234
y2 = 1, 4, 9
ax2.plot(x2, y2)

fig1.show()

  • Posible duplicado de Matplotlib: formato de número separado por comas para el eje

    – Rafael

    24/04/2017 a las 20:05

avatar de usuario
falsedad

Usar , como especificador de formato:

>>> format(10000.21, ',')
'10,000.21'

Alternativamente, también puede usar str.format en vez de format:

>>> '{:,}'.format(10000.21)
'10,000.21'

Con matplotlib.ticker.FuncFormatter:

...
ax.get_xaxis().set_major_formatter(
    matplotlib.ticker.FuncFormatter(lambda x, p: format(int(x), ',')))
ax2.get_xaxis().set_major_formatter(
    matplotlib.ticker.FuncFormatter(lambda x, p: format(int(x), ',')))
fig1.show()

ingrese la descripción de la imagen aquí

  • Gracias falsetru, la adaptación de sus líneas de código en matplot.ticker.FuncFormatter funcionó.

    – IcemanBerlín

    22 de septiembre de 2014 a las 14:05

  • @IcemanBerlin, de nada. Por cierto, usé int para quitar decimales. Si quieres quedártelo, déjalo int.

    – falsetru

    22 de septiembre de 2014 a las 14:07


  • fue perfecto, quería excluir decimales, probablemente no debería haberlos tenido en el ejemplo. Sin embargo, me preguntaba qué los dejó, así que gracias de nuevo.

    – IcemanBerlín

    22/09/2014 a las 14:20

avatar de usuario
Alex

La mejor manera que he encontrado para hacer esto es con StrMethodFormatter:

import matplotlib as mpl
ax.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter('{x:,.0f}'))

Por ejemplo:

import pandas as pd
import requests
import matplotlib.pyplot as plt
import matplotlib as mpl

url="https://min-api.cryptocompare.com/data/histoday?fsym=BTC&tsym=USDT&aggregate=1"
df = pd.DataFrame({'BTC/USD': [d['close'] for d in requests.get(url).json()['Data']]})

ax = df.plot()
ax.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter('{x:,.0f}'))
plt.show()

ingrese la descripción de la imagen aquí

Siempre me encuentro en esta misma página cada vez que trato de hacer esto. Claro, las otras respuestas hacen el trabajo, ¡pero no son fáciles de recordar para la próxima vez! ej: importar ticker y usar lambda, definición personalizada, etc.

Aquí hay una solución simple si tiene un eje llamado ax:

ax.set_yticklabels(['{:,}'.format(int(x)) for x in ax.get_yticks().tolist()])

  • Agradable… de una sola línea, y todavía bastante legible. Además, es fácil de modificar, por ejemplo, agregando un signo de dólar: ...'${:,}'...

    – José

    4 de agosto de 2019 a las 22:14


  • Me gusta mucho, funciona muy bien. Tuve que ponerlo después de mi range setter, ax.xaxis.set_major_locator(plt.MaxNLocator(20))

    – Herramientas de búsqueda-Avi

    15 de noviembre de 2019 a las 22:13

Respuesta corta sin importar matplotlib as mpl

plt.gca().yaxis.set_major_formatter(plt.matplotlib.ticker.StrMethodFormatter('{x:,.0f}'))

Modificado de la respuesta de @AlexG

Si te gusta lo hacky y lo corto, también puedes actualizar las etiquetas.

def update_xlabels(ax):
    xlabels = [format(label, ',.0f') for label in ax.get_xticks()]
    ax.set_xticklabels(xlabels)

update_xlabels(ax)
update_xlabels(ax2)

Puedes usar matplotlib.ticker.funcformatter

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as tkr


def func(x, pos):  # formatter function takes tick label and tick position
    s="%d" % x
    groups = []
    while s and s[-1].isdigit():
        groups.append(s[-3:])
        s = s[:-3]
    return s + ','.join(reversed(groups))

y_format = tkr.FuncFormatter(func)  # make formatter

x = np.linspace(0,10,501)
y = 1000000*np.sin(x)
ax = plt.subplot(111)
ax.plot(x,y)
ax.yaxis.set_major_formatter(y_format)  # set formatter to needed axis

plt.show()

ingrese la descripción de la imagen aquí

avatar de usuario
jeffhale

x = [10000.21, 22000.32, 10120.54]

Podría usar una lista de comprensión para hacer una lista de etiquetas y luego pasarles el plt.xticks.

xlabels = [f'{label:,}' for label in x]
plt.xticks(x, xlabels)

  • ¡Esto funcionó para mí, para otro problema que no se puede resolver con StrMethodFormatter! Gracias

    – Dio Nik

    26 de febrero de 2021 a las 9:51

¿Ha sido útil esta solución?