我想知道是否可以创建一个Seaborn计数图,但不是在y轴上显示实际计数,而是显示其组内的相对频率(百分比)(如hue
参数所指定的)。
我用下面的方法解决了这个问题,但我不能想象这是最简单的方法:
# Plot percentage of occupation per income class
grouped = df.groupby(['income'], sort=False)
occupation_counts = grouped['occupation'].value_counts(normalize=True, sort=False)
occupation_data = [
{'occupation': occupation, 'income': income, 'percentage': percentage*100} for
(income, occupation), percentage in dict(occupation_counts).items()
]
df_occupation = pd.DataFrame(occupation_data)
p = sns.barplot(x="occupation", y="percentage", hue="income", data=df_occupation)
_ = plt.setp(p.get_xticklabels(), rotation=90) # Rotate labels
结果:
我使用的是来自UCI machine learning repository的众所周知的成人数据集。pandas数据框是这样创建的:
# Read the adult dataset
df = pd.read_csv(
"data/adult.data",
engine='c',
lineterminator='\n',
names=['age', 'workclass', 'fnlwgt', 'education', 'education_num',
'marital_status', 'occupation', 'relationship', 'race', 'sex',
'capital_gain', 'capital_loss', 'hours_per_week',
'native_country', 'income'],
header=None,
skipinitialspace=True,
na_values="?"
)
This question是相关的,但没有使用hue
参数。在我的例子中,我不能只改变y轴上的标签,因为条形图的高度必须取决于组。
7条答案
按热度按时间xwmevbvl1#
使用较新版本的seaborn,您可以执行以下操作:
输出
更新:条形图顶部也显示百分比
如果你也想要百分比,你可以这样做:
ejk8hzay2#
我可能会搞混了。你的输出和
在我看来,只是列的顺序。
你似乎很关心这个问题,因为你传递了
sort=False
。但是,在你的代码中,顺序是偶然唯一确定的(在Python 3.5中,字典的迭代顺序甚至会随着运行的不同而变化)。vcirk6k63#
您可以通过设置以下属性来对
sns.histplot
执行此操作:stat = 'density'
(这将使y轴成为密度而不是计数)common_norm = False
(这将独立归一化每个密度)请参见下面的简单示例:
3mpgtkmj4#
您可以使用library Dexplot进行计数以及对任何变量进行归一化以获得相对频率。
向
count
函数传递你想计数的变量名,它会自动生成一个所有唯一值的计数的条形图。使用split
将计数细分为另一个变量。注意,Dexplot会自动 Package x-tick标签。使用
normalize
参数对任何变量(或变量与列表的组合)的计数进行归一化。您还可以使用True
对计数的总计进行归一化。dxp.count('occupation ',data=df,split='income',normalize='income')
z3yyvxxp5#
令我困惑的是,Seaborn没有提供任何这样的开箱即用的东西。
下面的代码带有函数“percentageplot(x,hue,data)”,它的工作方式与sns.countplot类似,但对每组的每个条进行了归一化(即,将每个绿色条的值除以所有绿色条的总和)。
实际上,它变成了这个(很难解释,因为苹果与Android的N不同):sns.countplot到这个(标准化,以便酒吧反映苹果,与Android的总比例):Percentageplot
希望这有帮助!!
fruv7luv6#
您可以使用estimator关键字为seaborn countplot中的条形高度(沿着y轴)提供估计值。
上面的代码片段来自https://github.com/mwaskom/seaborn/issues/1027
他们有一个关于如何在计数图中提供百分比的完整讨论。这个答案是基于上面链接的同一个线程。
在您的特定问题的上下文中,您可能会这样做:
上面的代码对我有用(在具有不同属性的不同数据集上)。注意,您需要为y输入一些数值列,否则,它会给出错误:“ValueError:
x
和y
变量似乎都不是数字。mf98qq947#
从this answer开始,使用“概率”效果最好。
摘自sns.histplot文档中的“stat”参数:
要在每个箱中计算的聚合统计量。