matplotlib 如何分别规范化每个通讯组[重复]

68bkxrlz  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(101)

此问题在此处已有答案

How to plot percentage with seaborn distplot / histplot / displot(3个答案)
8天前关闭。
假设我有一个框架,比如:

CATEGORY  Value
a          v1
a          v2
a          v3
a          v4
a          v5
b          v6
b          v7
b          v8

字符串
现在,如果我想按类别绘制这个分布,我可以使用这样的东西:

sns.histplot(data,"Value",hue="CATEGORY",stat="percent").


这里的问题是类别“a”代表样本的5/8,而“b”代表样本的3/8。直方图将反映这一点。我想以一种方式绘制每个直方图的面积为1,而不是5/8和3/8。
下面是它现在的样子的一个例子
x1c 0d1x的数据
但每一个领域都应该是一个。
我想也许可以按类别迭代,一个一个地绘制

iibxawm4

iibxawm41#

根据复制品的this answer,使用common_norm=False
参见seaborn histplot and displot output doesn't match
这并不特定于stat='percent'。其他选项包括'frequency''probability''density'

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

fig, axes = plt.subplots(nrows=2, figsize=(20, 10), tight_layout=True)

sns.histplot(data=tips, x='total_bill', hue='day', stat='percent', multiple='dodge', bins=30, common_norm=True, ax=axes[0])
sns.histplot(data=tips, x='total_bill', hue='day', stat='percent', multiple='dodge', bins=30, common_norm=False, ax=axes[1])

axes[0].set_title('common_norm=True', fontweight='bold')
axes[1].set_title('common_norm=False', fontweight='bold')

handles = axes[1].get_legend().legend_handles

for ax in axes:
    for c in ax.containers:
        ax.bar_label(c, fmt=lambda x: f'{x:0.2f}%' if x > 0 else '', rotation=90, padding=3, fontsize=8, fontweight='bold')
    ax.margins(y=0.15)
    ax.spines[['top', 'right']].set_visible(False)
    ax.get_legend().remove()

_ = fig.legend(title='Day', handles=handles, labels=tips.day.cat.categories.tolist(), bbox_to_anchor=(1, 0.5), loc='center left', frameon=False)

字符串


的数据

sns.displot

g = sns.displot(data=tips, kind='hist', x='total_bill', hue='day', stat='percent', multiple='dodge', bins=30, common_norm=False, height=5, aspect=4)

ax = g.axes.flat[0]  # ax = g.axes[0][0] also works

for c in ax.containers:
    ax.bar_label(c, fmt=lambda x: f'{x:0.2f}%' if x > 0 else '', rotation=90, padding=3, fontsize=8, fontweight='bold')


相关问题