如何解决在Python中使用摘要统计信息绘制多面条形图
是否有一种简洁的方法可以将Python中的摘要统计信息绘制为箱线图?下面的代码给出了每个均值的条形图,我想将每个条形图交换为箱线图。
我意识到我不需要进行总结,但是对于真实数据,仅绘制其中一个框就花费了很长时间(即使使用showfliers=False
也是如此);我不需要查看异常值,并且我还想为每个“ pc”添加一个“总体范围”栏(即跨所有群集)(对此的任何建议将不胜感激..我再次尝试从R转到python,仅获得这几行代码就花了很长时间)
import matplotlib.pyplot as plt
import seaborn as sns
out = pd.DataFrame({'cluster':['a']*100+['b']*100,'pc': ['w','x','y','z']*50,'value': np.random.normal(size=200)})
grouped = out.groupby(['cluster','pc'])
out = grouped.describe()
out = out.reset_index()
out.columns = [e[0] if e[0] != 'value' else e[1] for e in out.columns.tolist()]
#sns.catplot(x='cluster',y='mean',col='pc',kind='bar',data=out)
g = sns.FacetGrid(out,col="pc",col_wrap = 2)
g = g.map(plt.bar,"cluster","mean")
解决方法
您可以从摘要统计信息using Axes.bxp()
绘制箱线图。这需要封装在传递给map()
的自定义绘图函数中:
def my_bxp(**kwargs):
ax = plt.gca()
data = kwargs.pop('data')
color = kwargs.pop('color')
bxpstats = []
for _,row in data.iterrows():
print(row)
d = {'med': row.loc['50%'],'q1': row.loc['25%'],'q3': row.loc['75%'],'whislo': row.loc['min'],'whishi': row.loc['max'],'label': row.loc['cluster']}
bxpstats.append(d)
ax.bxp(bxpstats,showfliers=False,boxprops=dict(color=color),whiskerprops=dict(color=color),capprops=dict(color=color))
g = sns.FacetGrid(out,col="pc",col_wrap = 2)
g = g.map_dataframe(my_bxp)
请注意,为简单起见,我将晶须从min扩展到max,这不是通常的表示形式。如果需要的话,在计算摘要统计信息时可能需要计算适当的晶须范围。
,绘制完整原始数据的多个箱形图更加容易。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import random
df = pd.DataFrame({'cluster':['a']*100+['b']*100,'pc': ['w','x','y','z']*50,'value': np.random.normal(size=200)})
c = ['a']*25+['b']*25
df1 = pd.concat([pd.Series(c),df[df['pc'] == 'w']['value'].reset_index(drop=True),df[df['pc'] == 'x']['value'].reset_index(drop=True),df[df['pc'] == 'y']['value'].reset_index(drop=True),df[df['pc'] == 'z']['value'].reset_index(drop=True)],axis=1,ignore_index=True)
df1.columns = ['cluster','w','z']
fig,axes = plt.subplots(1,4,figsize=(8,4)
fig.subplots_adjust(wspace=0.3,hspace=0.4)
ax = sns.boxplot(x="cluster",y='w',data=df1,orient='v',ax=axes[0])
ax = sns.boxplot(x="cluster",y='x',ax=axes[1])
ax = sns.boxplot(x="cluster",y='y',ax=axes[2])
ax = sns.boxplot(x="cluster",y='z',ax=axes[3])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。