【问题标题】:Plotting multiple line graph using pandas and matplotlib使用 pandas 和 matplotlib 绘制多条线图
【发布时间】:2014-07-27 15:10:10
【问题描述】:

我在熊猫数据框中有以下数据

       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 做到这一点?

【问题讨论】:

标签: python matplotlib plot pandas


【解决方案1】:

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

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

【讨论】:

  • 这也很棒。到处搜索,这是对如何将枢轴与绘图一起使用的最佳解释。我有两件事要包括在 x 轴上。就我而言,我想要月份和日期,它们是我的数据框中的单独列。所以我使用了 "index=['month','day']" 将两者都放在 x 轴上。谢谢!
  • 我更喜欢这个而不是公认的解决方案,因为:1. 无需单独定义 ax,2. 使用不同轴和分组的统一方式
【解决方案2】:

您可以根据组添加图例:

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

【讨论】:

  • 其实一般情况下你是做不到的。 pr['template'] = [0,1,2,3,4,0,1,2,3,4] 在问题的情况下,所以它似乎有效。但是,通常pr['template'] 的前 4 个元素不会以正确的顺序包含每个标签。例如,如果您在绘图之前对数据进行排序,则 pr['template'][:4] = [0,0,1,1].
【解决方案3】:

可以使用groupby方法:

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

【讨论】:

  • 哇!!这非常清晰,可以完成工作。我从来没有想过我也可以按模板分组。如果我没有接受上一个答案,我会接受这个答案。
  • 有没有办法让组填充图例?
  • 要将它们放在一个数字上,我必须这样做fig, ax = plt.subplots(1,1); data.groupby("template").plot(x="date", y="score", ax=ax)。似乎应该有更好的方法来做到这一点,并自动获得正确的图例。
  • 我使用 plt.legend([v[0] for v in pr.groupby('template')['template']]) 填充了图例,这很混乱,但它可以工作(groupby 返回数据帧的迭代器,在每个数据帧内,'template' 的所有值都是相同的,所以我们只取首先)。
  • 这很棒,它是“小倍数”类型图表的开始,每个 groupby 事物(在本例中为“模板”)都有自己的图表。只需要调整它们的大小,使它们更小。不错。
【解决方案4】:

您可以使用类似以下的方法。您可以根据每个模板的值简单地对数据框进行切片,然后将日期和分数用于绘图。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 2017-01-02
    • 2018-05-27
    • 2015-10-09
    • 2019-10-17
    • 2021-12-29
    • 2019-06-24
    • 2016-09-26
    相关资源
    最近更新 更多