Han*_*gon 13 matplotlib histogram pandas
如何使用group by绘制带有pandas DataFrame.hist()的直方图?我有一个包含5列的数据框:"A","B","C","D"和"Group"
有两个组类:"是"和"否"
使用:
df.hist()
Run Code Online (Sandbox Code Playgroud)
我得到了4列中每一列的直方图.
现在我想得到相同的4个图,但有蓝色条(group ="yes")和红色条(group ="no").
我试过这个没有成功:
df.hist(by = "group")
Run Code Online (Sandbox Code Playgroud)
Imp*_*est 12
如果您愿意使用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()
Run Code Online (Sandbox Code Playgroud)
Bra*_*mon 10
这不是最灵活的解决方法,但具体适用于您的问题.
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)
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式使其更通用:
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20061 次 |
| 最近记录: |