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
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])
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 FuncFormatter
instead (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.
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.
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()])