5 votes

Python Plotly : Formatage de l'axe des pourcentages

Je souhaite créer un diagramme à partir d'un dataframe pandas où les ticks des axes doivent être des pourcentages.

Avec matplotlib, il y a un formateur d'axes agréable qui calcule automatiquement le pourcentage de ticks sur la base de la valeur maximale donnée :

Exemple :

import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame( { 'images': np.arange(0, 355, 5) } )      # 70 items in total, max is 350

ax = df.plot()
ax.yaxis.set_major_formatter(pltticker.PercentFormatter(xmax=350))
loc = pltticker.MultipleLocator(base=50)     # locator puts ticks at regular intervals
ax.yaxis.set_major_locator(loc)

enter image description here


L'utilisation de matplotlib étant assez fastidieuse, je souhaite faire de même avec Plotly. Je n'ai trouvé que l'option permettant de formater les étiquettes en pourcentage - mais pas de "formateur automatique" qui calcule les coches et les pourcentages pour moi. Existe-t-il un moyen d'utiliser des pourcentages automatiques ou dois-je les calculer à la main à chaque fois (urgh) ?

import plotly.express as px
import pandas as pd

fig = px.line(df, x=df.index, y=df.images, labels={'index':'num of users', '0':'num of img'})
fig.layout.yaxis.tickformat = ',.0%'         # does not help
fig.show()

enter image description here

Merci de vos conseils.

4voto

jayveesea Points 1832

Je ne suis pas sûr qu'il y ait une option d'axe pour le pourcentage, MAIS il est relativement facile d'y arriver en divisant y par son maximum, y = df.y/df.y.max() . Ces types de calculs, effectués directement dans l'appel de tracé, sont très pratiques et je les utilise régulièrement.

REMARQUE : si vous avez la possibilité d'utiliser des valeurs négatives, cela devient plus compliqué (et plus laid). Quelque chose comme y=(df.y-df.y.min())/(df.y.max()-df.y.min()) peut s'avérer nécessaire et une solution plus générale.

Exemple complet :

import plotly.express as px
import pandas as pd

data = {'x': [0, 1, 2, 3, 4], 'y': [0, 1, 4, 9, 16]}
df = pd.DataFrame.from_dict(data)

fig = px.line(df, x=df.x, y=df.y/df.y.max())
#or# fig = px.line(df, x=df.x, y=(df.y-df.y.min())/(df.y.max()-df.y.min()))
fig.layout.yaxis.tickformat = ',.0%'
fig.show()

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X