Je suis nouveau dans Python et j'essaie actuellement de tracer les données dans le dataframe avec un graphique à barres et une ligne.
[Environnement]
OS: Windows 7 - 64bit
Visual Studio Code 1.45.1
Python 2020.6.91350
Voici les données de base au format csv et elles sont lues par le code ci-dessous.
[testData.csv]
year,ordered,sold,YoY-ordered,YoY-sold
2015,100,80,0.1,-0.05
2016,120,100,0.2,0.25
2017,100,130,-0.166666667,0.3
2018,80,90,-0.2,-0.307692308
2019,90,95,0.125,0.055555556
2020,100,90,0.111111111,-0.052631579
[code.py]
import matplotlib as mplt
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
df = pd.read_csv('./testData.csv')
df=df.set_index("year")
idxO = "ordered"
idxS = "sold"
idxOYoY = "YoY-ordered"
idxSYoY = "YoY-sold"
fig = plt.figure(figsize=(12,5))
fig.suptitle("title")
ax1 = fig.add_subplot()
ax2 = ax1.twinx()
ax1.set_ylabel("Ordered, Sold")
ax2.set_ylabel("YoY")
df[[idxO, idxS]].plot(ax=ax1,kind="bar", color=["black","gray"])
df[[idxOYoY, idxSYoY]].plot(ax=ax2,kind="line", marker="o", color=["blue","lightblue"])
handler1, label1 = ax1.get_legend_handles_labels()
handler2, label2 = ax2.get_legend_handles_labels()
ax1.legend(handler1 + handler2, label1 + label2)
ax2.get_legend().remove()
plt.show()
Il donne le graphique ci-dessous.
J'ai trouvé que je peux obtenir le graphique que je veux, à l'exception des valeurs de l'axe des x, si je ne fixe pas l'année comme index du dataframe (commenté df=df.set_index("year"))
.
Ce que je veux faire, c'est créer le tracé avec le bon index (année) pour l'axe des x.
2 réponses
- Ce type de tracé se crée facilement avec
pandas.DataFrame.plot
et.twinx()
- Comme indiqué dans le code ci-dessous, toutes les informations d'étiquette peuvent être définies dans le tracé
-
matplotlib.axes.Axes
est renvoyé, alors attribuez le tracer versax
, puis créerax2
.
'year'
n'est pas défini comme index dans le code suivant
import pandas as pd
import matplotlib.pyplot as plt
# test data
data = {'year': [2015, 2016, 2017, 2018, 2019, 2020], 'ordered': [100, 120, 100, 80, 90, 100], 'sold': [80, 100, 130, 90, 95, 90], 'YoY-ordered': [0.1, 0.2, -0.166666667, -0.2, 0.125, 0.111111111], 'YoY-sold': [-0.05, 0.25, 0.3, -0.307692308, 0.055555556, -0.052631579]}
df = pd.DataFrame(data)
# display(df)
year ordered sold YoY-ordered YoY-sold
0 2015 100 80 0.100000 -0.050000
1 2016 120 100 0.200000 0.250000
2 2017 100 130 -0.166667 0.300000
3 2018 80 90 -0.200000 -0.307692
4 2019 90 95 0.125000 0.055556
5 2020 100 90 0.111111 -0.052632
# plot the bars with a pandas.DataFrame.plot and assign the plot to ax
ax = df.plot.bar(x='year', y=['ordered', 'sold'], ylabel='Ordered / Sold', xlabel='Year', color=['black', 'gray'], figsize=(12, 5))
# create ax2
ax2 = ax.twinx()
# plot the lines
df.plot(x='year', y=['YoY-ordered', 'YoY-sold'], marker='o', ylabel='YoY', color=['blue', 'lightblue'], ax=ax2)
# locate the legend
ax.legend(loc="upper left")
ax2.legend(loc='upper right')
plt.show()
Code de l'OP
- D'ailleurs, j'ai aussi exécuté votre code, avec
'year'
comme index de dataframe, et il trace sans problème. - Tout le code a été testé dans JupyterLab, Spyder, un interpréteur python nu et PyCharm Pro 2020.3.2, avec
pandas 1.2.0
etmatplotlib 3.3.2
. - J'utilise la distribution Anaconda, que je recommande, et je mets à jour chaque semaine avec
conda update --all
, sinon vous devrez mettre à jour avecpip
Je préfère convertir les colonnes de dataframe en listes:
...
#covert dataframe columns to lists
years = df[0].to_numpy().tolist()[1:]
ordered = df[1].to_numpy().tolist()[1:]
sold = df[2].to_numpy().tolist()[1:]
YoY_ordered = df[3].to_numpy().tolist()[1:]
YoY_sold = df[4].to_numpy().tolist()[1:]
fig = plt.figure(figsize=(12,5))
fig.suptitle("title")
ax1 = fig.add_subplot()
ax2 = ax1.twinx()
ax1.set_ylabel("Ordered, Sold")
ax2.set_ylabel("YoY")
year_indexes = np.arange(len(years))
WIDTH = 0.25
ax1.bar(year_indexes - WIDTH/2, ordered, width=WIDTH, color="orange", label="Ordered")
ax1.bar(year_indexes + WIDTH/2, sold, width=WIDTH, color="blue", label="Sold")
ax2.plot(year_indexes, YoY_ordered, color = "red", label = "YoY_ordered")
ax2.plot(year_indexes, YoY_sold, color = "green", label = "YoY_sold")
plt.xticks(year_indexes,years)
ax1.legend(loc = "upper left")
ax2.legend()
plt.show()
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.