パンダで、私はやっています:
bp = p_df.groupby('class').plot(kind='kde')
p_df
はdataframe
オブジェクトです。
ただし、これはクラスごとに1つずつ、2つのプロットを生成しています。同じプロット内の両方のクラスで1つのプロットを強制するにはどうすればよいですか?
軸を作成してから、 DataFrameGroupBy.plot
のax
キーワードを使用して、これらの軸にすべてを追加できます。
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)
これが結果です:
残念ながら、ここでは凡例のラベル付けはあまり意味がありません。
別の方法は、グループをループし、曲線を手動でプロットすることです。
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()
これにより、凡例を簡単に制御できます。これが結果です:
別のアプローチは、seaborn
モジュールを使用することです。これにより、次のように軸を保持する変数を指定せずに、同じ軸に2つの密度推定値がプロットされます(他の回答のデータフレーム設定を使用)。
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()
これにより、次の画像が表示されます。
たぶんあなたはこれを試すことができます:
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()
import matplotlib.pyplot as plt
p_df.groupby('class').plot(kind='kde', ax=plt.gca())