web-dev-qa-db-ja.com

pandasおよびmatplotlibを使用して複数の折れ線グラフをプロットする

pandasデータフレームに次のデータがあります

       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

毎日5つのテンプレートがあり、各テンプレートにはスコアがあります。

同じ図に、x軸に日付を、y軸にスコアを、各テンプレートの個別の折れ線グラフをプロットします。

Matplotlibを使用してこれを行うことは可能ですか?

19
Sudar

次のようなアプローチを使用できます。各テンプレートの値に従ってデータフレームを単純にスライスし、その後プロットの日付とスコアを使用できます。

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

Groupbyメソッドを使用できます。

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

同じグラフ上のすべての線でこのデータをプロットする最も簡単な方法は、各「テンプレート」値が列になるようにピボットすることだと思います。

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

以下に従って、グループに応じて凡例を追加できます。

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