web-dev-qa-db-fra.com

Tracer un graphique à plusieurs lignes en utilisant pandas et matplotlib

J'ai les données suivantes dans un pandas dataframe

       date  template     score
0  20140605         0  0.138786
1  20140605         1  0.846441
2  20140605         2  0.766636
3  20140605         3  0.259632
4  20140605         4  0.497366
5  20140606         0  0.138139
6  20140606         1  0.845320
7  20140606         2  0.762876
8  20140606         3  0.261035
9  20140606         4  0.498010

Pour chaque jour, il y aura 5 modèles et chaque modèle aura un score.

Je veux tracer la date sur l'axe des x et marquer sur l'axe des y et un graphique linéaire séparé pour chaque modèle dans la même figure.

Est-il possible de le faire en utilisant matplotlib?

19
Sudar

Vous pouvez utiliser une approche comme la suivante. Vous pouvez simplement découper la trame de données en fonction des valeurs de chaque modèle, puis utiliser les dates et les scores pour le tracé.

from pandas import *
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime as dt

#The following part is just for generating something similar to your dataframe
date1 = "20140605"
date2 = "20140606"

d = {'date': Series([date1]*5 + [date2]*5), 'template': Series(range(5)*2),
'score': Series([random() for i in range(10)]) } 

data = DataFrame(d)
#end of dataset generation

fig, ax = plt.subplots()

for temp in range(5):
    dat = data[data['template']==temp]
    dates =  dat['date']
    dates_f = [dt.datetime.strptime(date,'%Y%m%d') for date in dates]
    ax.plot(dates_f, dat['score'], label = "Template: {0}".format(temp))

plt.xlabel("Date")
plt.ylabel("Score")
ax.legend()
plt.show()
11
markusian

Vous pouvez utiliser la méthode groupby:

data.groupby("template").plot(x="date", y="score")
52
Thomas Cokelaer

Je pense que la façon la plus simple de tracer ces données avec toutes les lignes sur le même graphique est de les faire pivoter de telle sorte que chaque valeur de "modèle" soit une colonne:

pivoted = pandas.pivot_table(data, values='score', columns='template', index='date')
# Now there will be an index column for date and value columns for 0,1,2,3,4
pivoted.plot()
15
Jon Hoffman

Vous pouvez ajouter la légende selon les groupes avec:

plt.legend(pr['template'], loc='best')
1
animalito