【问题标题】:Plot a pandas dataframe grouped by column绘制按列分组的熊猫数据框
【发布时间】:2015-11-27 05:55:11
【问题描述】:

我有以下熊猫数据框'df':

---------------------------------------------------
             C1     C2     C3      C4      Type
---------------------------------------------------
    Name 
---------------------------------------------------
     x1       a1     b1      c1      d1     'A'
     x2       a2     b2      c2      d2     'A'
     x3       a3     b3      c3      d3     'B'
     x4       a4     b4      c4      d4     'B'
     x5       a5     b5      c5      d5     'A'
     x6       a6     b6      c6      d6     'B'
     x7       a7     b7      c7      d7     'B'
---------------------------------------------------

此数据框中有 6 列:Name, C1, C2, C3, C4, and Type。我想使用按“类型”列分组的这个数据框生成两个线图(单独的图 - 不是同一图上的两条线)。基本上,我想绘制 C1 相对于按类型分组的名称的值。所以,在一张图上,我想在另一张图上有(x1, c1), (x2, c2), (x5, c5) on one plot, and (x3,c3), (x4, c4), (x6,c6), and (x7,c7)

请注意,名称和其他列位于不同的行中。

我在 SO 上发现了一个类似的问题,用于绘制箱线图 here,因此我尝试将其修改为线图。我尝试使用df.plot(column='C1', by='Type'),但似乎没有属性'column' for a plot()

关于如何实现我的目标有什么想法吗?

【问题讨论】:

  • 也许使用df.groupby()
  • 你希望这个情节如何?您提供的这些 y 值不是标量。
  • @Oz123 y 值是标量;我仅将 'c1,c2,...,c6' 用于演示目的。
  • @furas:我尝试使用 ``df[df.columns[0]].plot(groupby='Type')'' 但这会返回相同的错误 - 'no line property 'groupby' '
  • 我在考虑 df.groupby() 而不是 plot(groupby) 在绘制之前对元素进行分组。 pandas.pydata.org/pandas-docs/stable/generated/…

标签: python pandas matplotlib plot


【解决方案1】:

可以将“Type”列添加到索引中,然后将其unstack,以便C1的值根据Type的值分成两列,然后将它们绘制出来,例如:

import pandas
df = pandas.DataFrame({'Values': randn(10), 'Categories': list('AABABBABAB')}, index=range(10))
df.set_index('Categories', append=True).unstack().interpolate().plot(subplots=True)

请注意,对于线图,您需要 'interpolate()'。

或者,您可以根据“类型”的值(在这些示例中为“类别”)选择数据并单独绘制它们,例如:

fig, axes = plt.subplots(ncols=2)
df[df.Categories=='A'].Values.plot(ax=axes[0])
df[df.Categories=='B'].Values.plot(ax=axes[1])

【讨论】:

  • 第一种方法建议您没有为我工作,但第二种方法肯定可以!非常感谢!您能否建议一种方法,不使用实际列值作为 x-tick 标签,而是使用从 1 到 n 的数字列表?
【解决方案2】:

以下答案基于 faltarell 的第二种方法,但适用于任意数量的类别。

设置:

import pandas
import matplotlib.pyplot as plt
from numpy.random import randn
df = pandas.DataFrame({'Values': randn(10), 
                       'Categories': list('AABABBABAB')},
                       index=range(10))

画图:

categories = df['Categories'].unique()

fig, axes = plt.subplots(ncols=len(categories))

for i, category in enumerate(categories):
    df[df['Categories'] == category]['Values'].plot.line(ax=axes[i])
    axes[i].set_title(category)

您可以使用以下标记线制作类似的单图:

fig, ax= plt.subplots()

for category in df['Categories'].unique():
    df[df['Categories'] == category]['Values'].plot.line(ax=ax, label=category)

plt.legend()

【讨论】:

    猜你喜欢
    • 2019-12-14
    • 2020-07-09
    • 1970-01-01
    • 2017-06-09
    • 2018-07-19
    • 2017-07-08
    • 2021-10-16
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多