web-dev-qa-db-fra.com

Comment formater le format du nombre d'axes en milliers avec une virgule dans matplotlib?

Comment puis-je changer le format des nombres sur l'axe des x pour qu'il ressemble à 10,000 au lieu de 10000? Idéalement, j'aimerais juste faire quelque chose comme ceci:

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

Voici le code:

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()
45
IcemanBerlin

Utilisation , as spécificateur de format :

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

Sinon, vous pouvez également utiliser str.format au lieu de format :

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

Avec 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()

enter image description here

64
falsetru

Le meilleur moyen que j'ai trouvé de faire cela est avec StrMethodFormatter:

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

Par exemple:

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()

enter image description here

17
AlexG

Je me retrouve toujours sur la même page chaque fois que j'essaie de le faire. Bien sûr, les autres réponses font le travail, mais ne sont pas faciles à retenir pour la prochaine fois! ex: importez ticker et utilisez lambda, custom def, etc.

Voici une solution simple si vous avez un axe nommé ax:

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

Si vous aimez hacky et court, vous pouvez également simplement mettre à jour les étiquettes

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

update_xlabels(ax)
update_xlabels(ax2)
8
DanT

Vous pouvez utiliser 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()

enter image description here

7
pad