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

问题描述 投票:33回答:2

在熊猫,我正在做:

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

p_df是一个dataframe对象。

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

python pandas plot
2个回答
56
投票

版本1:

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

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)

这是结果:

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

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

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


8
投票

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

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

# data to create an example data frame
classes = ["c1"] * 5 + ["c2"] * 5
vals = [1,3,5,1,3] + [2,6,7,5,2]
# the data frame 
df = pd.DataFrame({"cls": classes, "indices":idx, "vals": vals})

# this is to plot the kde
sns.kdeplot(df.vals[df.cls == "c1"],label='c1');
sns.kdeplot(df.vals[df.cls == "c2"],label='c2');

# beautifying the labels
plt.xlabel('value')
plt.ylabel('density')
plt.show()

这导致以下图像。

Resulting image from the code given above.

© www.soinside.com 2019 - 2024. All rights reserved.