我想知道是否可以创建一个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
结果:
我正在使用datasets/Adult" rel="noreferrer">UCI machine learning repository中众所周知的成人数据集。熊猫数据框的创建方式如下:
# 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轴上的标签,因为条的高度必须取决于组。
我可能很困惑。你的输出和
在我看来,只是列的顺序。
你似乎很在意,因为你通过了
sort=False
。但是,在您的代码中,顺序是由偶然性唯一决定的(字典的迭代顺序甚至在Python 3.5中从run到run都发生了变化)。Seaborn没有提供这种现成的东西,这让我很困惑。
不过,调整源代码以得到您想要的东西还是相当容易的。 下面的代码具有“percentageplot(x,hue,data)”功能,其工作原理与sns.countplot类似,但对每组的每个条进行规范(即将每个绿色条的值除以所有绿色条的总和)
事实上,它改变了这一点(很难解释,因为苹果和安卓的N不同): sns.countplot 在这一点上(标准化后的条形图反映了苹果和安卓的总体比例): Percentageplot
希望这有帮助!!
可以使用库Dexplot进行计数,也可以对任何变量进行规格化以获取相对频率。
将
aggplot
字符串/分类变量传递给agg
参数,它将自动生成所有唯一值计数的条形图。使用hue
按另一个变量细分计数。请注意,Dexplot会自动包装x-tick标签。使用
normalize
参数规范化任何变量(或变量与元组的组合)上的计数。您还可以使用"all"
对总计计数进行规范化。相关问题 更多 >
编程相关推荐