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

20 投票
4 回答
45097 浏览
提问于 2025-04-18 08:51

我有一个数据表,里面用的是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 个回答

1

你可以根据不同的组来添加图例,方法是:

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

我觉得将这些数据绘制在同一张图上最简单的方法是把它转换一下格式,让每个“模板”值变成一列:

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

你可以使用groupby这个方法:

data.groupby("template").plot(x="date", y="score")
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()

撰写回答