📅  最后修改于: 2023-12-03 15:23:18.995000             🧑  作者: Mango
在数据可视化中,展示数值的数量是一个基本需求。在 seaborn 中,通过 countplot 方法可以轻松地绘制分类变量的频率分布图。但是,有时候我们需要展示数据的百分比而非数量。本文将介绍如何在 seaborn countplot 中显示百分比。
我们将使用 seaborn 内置的 tips 数据集作为示例数据。该数据集包含了一家餐厅的顾客消费数据,包括消费金额、小费金额、性别、吸烟习惯、用餐时间等信息。我们将使用该数据集中的性别和吸烟习惯两个变量作为分类变量进行展示。
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset('tips')
首先让我们看一下基础的 countplot 显示效果。
sns.countplot(data=tips, x='sex', hue='smoker')
plt.show()
如上图所示,我们使用 countplot 绘制了性别和吸烟习惯的频率分布图。其中,x 轴为性别变量,hue 参数为吸烟习惯变量,即在 x 轴男女柱状图中,每个性别下又根据吸烟习惯分成了两个颜色。
为了在 countplot 中显示百分比,我们需要对 countplot 绘图进行一定的处理,即对每个柱子中的数量进行计算,并用总数求得每个分类变量的百分比。下面是示例代码:
total = float(len(tips)) # 总样本数
# 为了建立图例,我们需要手动创建一个列表来保存每种情况下的数量。
# 我们将在后面用这个列表来创建图例。
counts = []
for i in tips.sex.unique():
for j in tips.smoker.unique():
count = len(tips[(tips['sex'] == i) & (tips['smoker'] == j)])
counts.append(count)
pct_string = '{:0.1f}%'.format(100 * count / total)
plt.annotate(pct_string, xy=(i, count), ha='center', va='bottom')
sns.countplot(data=tips, x='sex', hue='smoker')
# 创建图例
smoker_labels = ['Non-Smoker', 'Smoker']
legend_data = []
for ind, smoker in enumerate(smoker_labels):
legend_data.append(plt.Line2D([0], [0], color=sns.color_palette()[ind], lw=4))
plt.legend(legend_data, smoker_labels)
# 调整 y 轴标签
plt.ylim(0, max(counts) * 1.1)
plt.show()
运行上面的代码,我们可以得到如下图所示的结果:
可以看到,在每个柱子上方,我们使用 annotate 方法打印出了各自的百分比。在绘制柱状图时,我们需要手动处理一下图例,另外还需要调整 y 轴的标签。不过,在处理后,我们可以清晰地看到每个分类变量下,不同吸烟习惯的数量,并且知道了它们所占的百分比。
通过本文的介绍,我们了解了如何在 seaborn countplot 中显示百分比。在展示数据时,精准地描述数据的数量和比例是至关重要的,这可以让我们更好地理解数据背后的含义。我们可以使用 seaborn countplot 对分类数据进行可视化展示,并在此基础上对数据进行百分比计算和展示,反映数据真实含义。