基于性别分组的问卷答案频次可视化实现问询
基于性别分组的问卷答案频次可视化实现方案
嘿,太懂你这种找分类数据可视化例子碰壁的郁闷了!我之前也踩过类似的坑,其实针对你这个需求,不管用Seaborn还是直接用Pandas+Matplotlib都能轻松搞定簇状或堆叠柱状图,下面给你一步步拆解实现:
第一步:完整数据准备(你已经写好的,我整合到完整代码里啦)
首先把你的原始数据和依赖库导入写全,方便直接运行:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 你的问卷数据 answers = ['A', 'B', 'A', 'B', 'A', 'A', 'B', 'B', 'B', 'A', 'C', 'B', 'A', 'C'] genders = ['M', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'M', 'F', 'M', 'M', 'F', 'M'] df = pd.DataFrame({'Answer': answers, 'Gender': genders})
方案一:簇状柱状图(两种实现方式)
簇状图最适合对比不同性别下同一答案的频次差异,有两种简单的实现方式:
方式1:Pandas 交叉表统计+直接绘图
核心是先用pd.crosstab统计每个性别下各答案的频次,然后直接调用plot方法:
# 1. 统计每个性别对应各答案的频次 freq_table = pd.crosstab(df['Gender'], df['Answer']) # 2. 绘制簇状柱状图 freq_table.plot(kind='bar', figsize=(8, 5), rot=0, colormap='Set2') plt.title('问卷答案频次(按性别分组·簇状)') plt.xlabel('性别') plt.ylabel('频次') plt.legend(title='答案选项') plt.tight_layout() # 自动调整布局避免标签被截断 plt.show()
方式2:Seaborn countplot 实现
如果你更习惯用Seaborn,直接用countplot的hue参数就能实现分组,不用手动统计频次:
plt.figure(figsize=(8, 5)) # x轴设为性别,hue按答案分组 sns.countplot(data=df, x='Gender', hue='Answer', palette='Set2') plt.title('问卷答案频次(按性别分组·簇状)') plt.xlabel('性别') plt.ylabel('频次') plt.legend(title='答案选项') plt.tight_layout() plt.show()
方案二:堆叠柱状图实现
要是想展示每个性别下各答案的占比结构,堆叠柱状图就很合适,同样基于之前统计的频次表:
# 绘制堆叠柱状图 freq_table.plot(kind='bar', stacked=True, figsize=(8, 5), rot=0, colormap='Set2') plt.title('问卷答案频次(按性别分组·堆叠)') plt.xlabel('性别') plt.ylabel('频次') # 把图例放到图外面,避免挡住柱子 plt.legend(title='答案选项', bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
一些额外小技巧
- 要是想把频次换成百分比占比(比如每个性别下各答案的占比),可以先对频次表做归一化:
# 计算每个性别下各答案的百分比 freq_pct = freq_table.div(freq_table.sum(axis=1), axis=0) * 100 # 然后用同样的plot方法绘制即可,记得把ylabel改成"占比(%)" - 调整配色的话,Seaborn可以用
palette参数选内置配色,Pandas plot可以用colormap参数 - 要是想给柱子加上数值标签(把频次数字标在柱子上),可以循环遍历每个柱子添加文本,这个需要的话也可以再给你补充~
这样应该就能完美满足你的需求啦,其实分类数据可视化的核心就是先把频次统计清楚,剩下的绘图步骤和常规柱状图没差哦😉
内容来源于stack exchange
相关产品推荐
相关产品推荐

