pandas DataFrame.hist()でgroup byを使用してヒストグラムをプロットする方法は?「A」、「B」、「C」、「D」の5列のデータフレームがあります。 "グループ"
「はい」と「いいえ」の2つのグループクラスがあります。
使用:
df.hist()
4つの列それぞれの履歴を取得します。
次に、同じ4つのグラフを取得しますが、青いバー(group = "yes")と赤いバー(group = "no")を使用します。
私は成功せずにこれを試しました:
df.hist(by = "group")
これは最も柔軟な回避策ではありませんが、具体的にはあなたの質問に役立ちます。
_def sephist(col):
yes = df[df['group'] == 'yes'][col]
no = df[df['group'] == 'no'][col]
return yes, no
for num, alpha in enumerate('abcd'):
plt.subplot(2, 2, num)
plt.hist(sephist(alpha)[0], bins=25, alpha=0.5, label='yes', color='b')
plt.hist(sephist(alpha)[1], bins=25, alpha=0.5, label='no', color='r')
plt.legend(loc='upper right')
plt.title(alpha)
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)
_
あなたはこれをより一般的にすることができます:
df
およびby
パラメータをsephist
に追加:def sephist(df, by, col)
for num, alpha in enumerate(df.columns)
_matplotlib.pyplot.hist
_ の最初の引数は
同じ長さである必要がない単一の配列または一連の配列のいずれか
...代替は次のようになります:
_for num, alpha in enumerate('abcd'):
plt.subplot(2, 2, num)
plt.hist((sephist(alpha)[0], sephist(alpha)[1]), bins=25, alpha=0.5, label=['yes', 'no'], color=['r', 'b'])
plt.legend(loc='upper right')
plt.title(alpha)
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)
_
Seabornを使用できる場合は、seaborn.FacetGrid
を使用して、複数のサブプロットと各サブプロット内の複数の変数を含むプロットを簡単に作成できます。
import numpy as np; np.random.seed(1)
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.randn(300,4), columns=list("ABCD"))
df["group"] = np.random.choice(["yes", "no"], p=[0.32,0.68],size=300)
df2 = pd.melt(df, id_vars='group', value_vars=list("ABCD"), value_name='value')
bins=np.linspace(df2.value.min(), df2.value.max(), 10)
g = sns.FacetGrid(df2, col="variable", hue="group", palette="Set1", col_wrap=2)
g.map(plt.hist, 'value', bins=bins, ec="k")
g.axes[-1].legend()
plt.show()