我想知道是否可以创建 Seaborn 计数图,但不是显示 y 轴上的实际计数,而是显示其组内的相对频率(百分比)(如
hue
参数指定)。
I使用以下方法解决了这个问题,但我无法想象这是最简单的方法:
# 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 机器学习存储库中众所周知的成人数据集|| |。 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="?"
)
有点相关,但没有使用
参数。就我而言,我不能只更改 y 轴上的标签,因为条形的高度必须取决于组。
hue
parameter. And in my case I cannot just change the labels on the y-axis, because the height of the bar must depend on the group.
无需手动计算和准备百分比数据以在 Seaborn 中使用。Seaborn 的
countplot
函数中内置了一个更直接的解决方案,可以实现这一点。可以使用
estimator
参数结合 NumPy 的
mean
函数来完成此操作。由于每个条形表示“hue”类别中存在的总值的百分比,因此平均值在本质上计算了该特定“hue”级别的出现次数。
以下是使用的数据集实现此操作的方法:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# 读取成人数据集
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="?"
)
# 使用 countplot 并使用 estimator 作为百分比
p = sns.countplot(
data=df,
x="occupation",
hue="income",
estimator=lambda x: len(x) / len(df) * 100
)
_ = plt.setp(p.get_xticklabels(), rotation=90) # 旋转标签
plt.ylabel("Percentage")
plt.show()
在本代码中:
-
我们直接将原始数据框
df
传递给sns.countplot
。 -
x
参数设置为“occupation”,hue
参数设置为“income”,这与的示例相同。 -
技巧在于
estimator
参数。我们将其设置为一个 lambda 函数,该函数计算给定“hue”级别内每个职业的百分比。它计算特定“hue”级别中“occupation”计数(len(x)
)与其在完整数据集中的总数(len(df)
)的比率,然后乘以 100 以获得百分比。
这将在每个“income”组内提供归一化的计数,并有效地显示每个职业的相对频率,而无需手动预处理数据。
标签:python,pandas,seaborn,countplot From: 34615854