web-dev-qa-db-fra.com

Formater l’axe y en pourcentage

J'ai une parcelle existante qui a été créée avec pandas comme ceci:

df['myvar'].plot(kind='bar')

L'axe des y est au format float et je souhaite le modifier en pourcentage. Toutes les solutions que j'ai trouvées utilisent la syntaxe ax.xyz et . Je ne peux que placer du code sous la ligne ci-dessus qui crée le tracé (je ne peux pas ajouter ax = ax à la ligne ci-dessus.)

Comment formater l’axe des y en pourcentages sans changer la ligne ci-dessus?

Voici la solution que j'ai trouvée mais nécessite que je redéfinisse l'intrigue :

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

data = [8,12,15,17,18,18.5]
perc = np.linspace(0,100,len(data))

fig = plt.figure(1, (7,4))
ax = fig.add_subplot(1,1,1)

ax.plot(perc, data)

fmt = '%.0f%%' # Format you want the ticks, e.g. '40%'
xticks = mtick.FormatStrFormatter(fmt)
ax.xaxis.set_major_formatter(xticks)

plt.show()

Lien vers la solution ci-dessus: Pyplot: utilisation du pourcentage sur l’axe x

76
Chris

pandas dataframe plot retournera la ax pour vous, et vous pourrez alors commencer à manipuler les axes comme vous le souhaitez.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(100,5))

# you get ax from here
ax = df.plot()
type(ax)  # matplotlib.axes._subplots.AxesSubplot

# manipulate
vals = ax.get_yticks()
ax.set_yticklabels(['{:,.2%}'.format(x) for x in vals])

enter image description here

107
Jianxun Li

La solution de Jianxun a fait le travail pour moi mais a cassé l'indicateur de valeur y en bas à gauche de la fenêtre.

J'ai fini par utiliser FuncFormatterinstead (et j'ai également supprimé les zéros non nécessaires comme suggéré ici ):

import pandas as pd
import numpy as np
from matplotlib.ticker import FuncFormatter

df = pd.DataFrame(np.random.randn(100,5))

ax = df.plot()
ax.yaxis.set_major_formatter(FuncFormatter(lambda y, _: '{:.0%}'.format(y))) 

De manière générale, je vous recommande d'utiliser FuncFormatter pour le formatage des étiquettes: c'est fiable et polyvalent.

enter image description here

65
erwanp

Cela fait quelques mois de retard, mais j’ai créé PR # 6251 avec matplotlib pour ajouter une nouvelle classe PercentFormatter. Avec cette classe, vous n'avez besoin que d'une ligne pour reformater votre axe (deux si vous comptez l'importation de matplotlib.ticker):

import ...
import matplotlib.ticker as mtick

ax = df['myvar'].plot(kind='bar')
ax.yaxis.set_major_formatter(mtick.PercentFormatter())

PercentFormatter() accepte trois arguments, xmax, decimals, symbol. xmax vous permet de définir la valeur correspondant à 100% sur l'axe. C'est bien si vous avez des données de 0,0 à 1,0 et que vous souhaitez les afficher de 0% à 100%. Il suffit de faire PercentFormatter(1.0).

Les deux autres paramètres vous permettent de définir le nombre de chiffres après le point décimal et le symbole. La valeur par défaut est None et '%', respectivement. decimals=None définira automatiquement le nombre de points décimaux en fonction de la quantité d'axes que vous affichez.

53
Mad Physicist

Pour ceux qui recherchent le one-liner rapide:

plt.gca().set_yticklabels(['{:.0f}%'.format(x*100) for x in plt.gca().get_yticks()]) 

Ou si vous utilisez Latex comme formateur de texte d'axe, vous devez ajouter une barre oblique inverse '\'

plt.gca().set_yticklabels(['{:.0f}\%'.format(x*100) for x in plt.gca().get_yticks()]) 
25
np8