使用pandas和matplotlib绘制多个折线图

时间:2014-06-06 11:02:21

标签: python matplotlib plot pandas

我在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执行此操作?

4 个答案:

答案 0 :(得分:52)

您可以使用groupby方法:

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

答案 1 :(得分:15)

我认为使用同一图表上的所有行绘制此数据的最简单方法是将其旋转,使每个“模板”值为一列:

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()

答案 2 :(得分:11)

您可以使用类似下面的方法。您可以根据每个模板的值对数据帧进行切片,然后使用图表的日期和分数。

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()

答案 3 :(得分:2)

您可以根据以下组添加图例:

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