Подтвердить что ты не робот

Вычисление сгруппированных данных на одном и том же участке с использованием Pandas

В Pandas, я делаю:

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

p_df - объект dataframe.

Однако это создает два графика, по одному для каждого класса. Как заставить один сюжет использовать оба класса в одном и том же сюжете?

4b9b3361

Ответ 1

Версия 1:

Вы можете создать свою ось, а затем использовать ключевое слово ax в DataFrameGroupBy.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)

Это результат:

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

Ответ 2

Другой подход будет использовать модуль 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.

Ответ 3

Может быть, вы можете попробовать это:

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

Ответ 4

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