J'ai un complot existant qui a été créé avec des pandas comme celui-ci:
df['myvar'].plot(kind='bar')
L'axe y est au format flottant et je veux changer l'axe y en pourcentages. Toutes les solutions que j'ai trouvées utilisent la syntaxe ax.xyz et je ne peux placer du code que sous la ligne ci-dessus qui crée le tracé (je ne peux pas ajouter ax = ax à la ligne ci-dessus.)
Comment puis-je formater l'axe des y sous forme de 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 des x
python
pandas
matplotlib
plot
Chris
la source
la source
Réponses:
C'est quelques mois de retard, mais j'ai créé PR # 6251 avec matplotlib pour ajouter une nouvelle
PercentFormatter
classe. Avec cette classe, vous n'avez besoin que d'une ligne pour reformater votre axe (deux si vous comptez l'importation dematplotlib.ticker
):PercentFormatter()
accepte trois arguments,xmax
,decimals
,symbol
.xmax
vous permet de définir la valeur qui correspond à 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%. Fais justePercentFormatter(1.0)
.Les deux autres paramètres vous permettent de définir le nombre de chiffres après la virgule décimale et le symbole. Ils sont respectivement par défaut
None
et'%'
.decimals=None
définit automatiquement le nombre de points décimaux en fonction de la quantité d'axes que vous affichez.Mettre à jour
PercentFormatter
a été introduit dans Matplotlib proprement dit dans la version 2.1.0.la source
from matplotlib.ticker import mtick
et supposé que lemtick
"module" était supprimé.pandas dataframe plot renverra le
ax
pour vous, et vous pourrez alors commencer à manipuler les axes comme vous le souhaitez.la source
matplotlib.ticker
des formateurs de fonctions!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 à la
FuncFormatter
place (et j'ai également supprimé les zéros de fin non nécessaires comme suggéré ici ):De manière générale, je recommanderais d'utiliser
FuncFormatter
pour le formatage des étiquettes: c'est fiable et polyvalent.la source
ax.yaxis.set_major_formatter(FuncFormatter('{0:.0%}'.format))
. AKA pas besoin de lambda, laissez le format faire le travail.'{0:.0%}'.format
crée une fonction de formatage . Le0
signe avant les deux points indique au formateur de remplacer les accolades et son contenu par le premier argument passé à la fonction. La partie après les deux points,,.0%
indique au formateur comment rendre la valeur. Le.0
spécifie 0 décimale et%
spécifie le rendu en pourcentage.Pour ceux qui recherchent le one-liner rapide:
Ou si vous utilisez Latex comme formateur de texte d'axe, vous devez ajouter une barre oblique inverse '\'
la source
Je propose une méthode alternative utilisant
seaborn
Code de travail:
la source
Je suis en retard dans le jeu mais je me rends juste compte de ceci:
ax
peut être remplacé parplt.gca()
pour ceux qui n'utilisent pas d'axes et juste des sous-intrigues.En écho à la réponse de @Mad Physicist, en utilisant le package,
PercentFormatter
ce serait:la source