使用Pandas在同一图中绘制分组数据

时间:2015-02-03 06:54:23

标签: python pandas plot

在熊猫,我正在做:

bp = p_df.groupby('class').plot(kind='kde')

p_dfdataframe个对象。

然而,这产生了两个图,每个类一个。 如何在同一个图中强制同时使用两个类的一个图?

5 个答案:

答案 0 :(得分:56)

版本1:

您可以创建轴,然后使用DataFrameGroupBy.plotax关键字将所有内容添加到这些轴:

import matplotlib.pyplot as plt

p_df = pd.DataFrame({"class": [1,1,2,2,1], "a": [2,3,2,3,2]})
fig, ax = plt.subplots(figsize=(8,6))
bp = p_df.groupby('class').plot(kind='kde', ax=ax)

结果如下:

plot

不幸的是,传说的标签在这里没有多大意义。

版本2:

另一种方法是循环遍历组并手动绘制曲线:

classes = ["class 1"] * 5 + ["class 2"] * 5
vals = [1,3,5,1,3] + [2,6,7,5,2]
p_df = pd.DataFrame({"class": classes, "vals": vals})

fig, ax = plt.subplots(figsize=(8,6))
for label, df in p_df.groupby('class'):
    df.vals.plot(kind="kde", ax=ax, label=label)
plt.legend()

这样您就可以轻松控制图例。这是结果:

plot2

答案 1 :(得分:8)

另一种方法是使用context!.setStrokeColor(UIColor.red.cgColor)//or any UIColor 模块。这将绘制相同轴上的两个密度估计,而不指定用于保持轴的变量,如下所示(使用另一个答案中的一些数据框设置):

seaborn

这会产生以下图像。

Resulting image from the code given above.

答案 2 :(得分:1)

也许您可以尝试以下方法:

fig, ax = plt.subplots(figsize=(10,8))
classes = list(df.class.unique())
for c in classes:
    df2 = data.loc[data['class'] == c]
    df2.vals.plot(kind="kde", ax=ax, label=c)
plt.legend()

答案 3 :(得分:1)

import matplotlib.pyplot as plt
p_df.groupby('class').plot(kind='kde', ax=plt.gca())

答案 4 :(得分:0)

  • 有两种简单的方法可以在同一图中绘制每个组。
    1. 使用 pandas.DataFrame.groupby 时,应指定要绘制的列(例如聚合列)。
    2. 使用 seaborn.kdeplotseaborn.displot 并指定 hue 参数
  • 使用 pandas v1.2.4matplotlib 3.4.2seaborn 0.11.1
  • OP 特定于绘制 kde,但许多绘图类型(例如 kind='line'sns.lineplot 等)的步骤相同。

导入和示例数据

  • 对于示例数据,组位于 'kind' 列中,将绘制 kde'duration',忽略 'waiting'
import pandas as pd
import seaborn as sns

df = sns.load_dataset('geyser')

# display(df.head())
   duration  waiting   kind
0     3.600       79   long
1     1.800       54  short
2     3.333       74   long
3     2.283       62  short
4     4.533       85   long

使用 pandas.DataFrame.plot 绘图

  • 使用 .groupby.pivot 重塑数据

.groupby

  • 指定聚合列、['duration']kind='kde'
ax = df.groupby('kind')['duration'].plot(kind='kde', legend=True)

.pivot

ax = df.pivot(columns='kind', values='duration').plot(kind='kde')

使用 seaborn.kdeplot 绘图

  • 指定hue='kind'
ax = sns.kdeplot(data=df, x='duration', hue='kind')

使用 seaborn.displot 绘图

  • 指定 hue='kind'kind='kde'
fig = sns.displot(data=df, kind='kde', x='duration', hue='kind')

情节

enter image description here