【问题标题】:Plotting multiple columns after a groupBy in pandas在熊猫中的 groupBy 之后绘制多列
【发布时间】:2018-09-26 11:35:25
【问题描述】:

给定一个df 的形式

df = pd.DataFrame(
    {
    "date": [datetime.datetime(2018, 1, x) for x in range(1, 8)],    
    "label": ["A", "A", "B", "B", "C", "A", "C"],
    "value1": [1, 22, 3, 4, 5, 6, 7],
    "value2": [10, 4, 30, 5, 6, 8, 9]
    }
)
df.set_index('date', inplace=True)

我想要一个包含所有 6 行的图:每个组的 value1value2 的值。我浏览了其他答案,但找不到正确的方法。我拥有的最好的是

fig, ax = plt.subplots()
for label, df in grouped:
    df.plot(ax=ax, label="Value for {}".format(label))
plt.legend()

产生这个结果:

这里有两个问题(概率相同):

  • 我似乎无法控制标签文本
  • 标签现在没有用了,因为它没有提供信息

有什么想法吗?

【问题讨论】:

标签: pandas pandas-groupby


【解决方案1】:

也许只是使用坐标轴来绘制而不是 DataFrame 并明确提及您要绘制的内容?

grouped = df.groupby('label')
fig, ax = plt.subplots()
for label, df2 in grouped:
    ax.plot(df2['value1'], label=label+' value1')
    ax.plot(df2['value2'], label=label+' value2')
plt.xticks(rotation=30)
plt.xlabel(df.index.name)
plt.legend()

或者,如果您不想多次将其写出来,只需提前指定要绘制的列,然后使用另一个循环。

plot_vals = ['value1', 'value2']

fig, ax = plt.subplots()
for label, df2 in grouped:
    for col in df2.columns[df2.columns.isin(plot_vals)]:
        ax.plot(df2[col], label=label+ ' ' + col)
plt.xticks(rotation=30)
plt.xlabel(df.index.name)
plt.legend()

【讨论】:

  • 出于某种原因,我认为 matplotlib 有一个更简单的 pandas 版本。我可能需要开始重新考虑这个
  • 它对于某些事情当然非常有用。例如,使用 pandas 功能,您无需显式指定旋转或轴标签。但是当事情不能完全按照你的意愿工作时,matplotlib 总是最容易依赖的。
  • 你可以使用df.pivot(columns='label').interpolate().plot(),但是分数会扩大,这个答案可能是最好的方法,因为答案模仿了你想要的情节
猜你喜欢
  • 2020-03-25
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
相关资源
最近更新 更多