如何在单个图表中并排展示多组箱线图(选民投票场景)
并排多政党箱线图实现方案
没问题!要在同一图表中展示不同政策领域下三个政党的投票可能性并排箱线图,核心是先把数据整理成长格式,再用Seaborn的boxplot函数轻松实现——它自带的分组逻辑完美适配你的需求。
一、数据格式准备
首先确保你的数据是长格式(每一行对应单条选民记录),包含三个核心字段:
policy_area:选民认为重要的政策领域(x轴)party:政党名称(分组依据)likelihood_to_vote:投票给该政党的可能性(y轴)
如果你的原始数据是宽格式(比如每列对应一个政党的投票可能性),可以用Pandas的melt函数快速转换:
import pandas as pd # 示例宽格式数据(模拟你的选民调查数据) wide_survey_data = pd.DataFrame({ "policy_area": ["经济", "医疗", "教育", "环境"] * 30, # 每个政策领域30条样本 "政党X": [8, 5, 7, 6] * 30, "政党Y": [4, 7, 3, 8] * 30, "政党Z": [6, 8, 5, 7] * 30 }) # 转换为长格式 long_survey_data = wide_survey_data.melt( id_vars="policy_area", # 保留作为x轴的字段 var_name="party", # 新的分组字段名(政党) value_name="likelihood_to_vote" # 新的y轴字段名(投票可能性) )
二、绘制并排箱线图
用Seaborn的boxplot函数,通过hue参数指定政党分组,它会自动在同一政策领域下并排展示不同政党的箱线图:
import seaborn as sns import matplotlib.pyplot as plt # 设置绘图风格,让图表更美观 sns.set_style("whitegrid") # 创建画布,调整大小 plt.figure(figsize=(12, 7)) # 绘制箱线图 sns.boxplot( x="policy_area", y="likelihood_to_vote", hue="party", data=long_survey_data, palette="Set2", # 指定配色方案 width=0.7, # 调整箱线图宽度,让并排效果更协调 fliersize=4 # 调整异常点大小 ) # 添加图表标题和轴标签 plt.title("不同政策领域下,选民对各政党的投票可能性分布", fontsize=15, pad=20) plt.xlabel("政策领域", fontsize=12) plt.ylabel("投票给该政党的可能性", fontsize=12) # 调整图例位置,避免遮挡图表 plt.legend(title="政党", bbox_to_anchor=(1.02, 1), loc="upper left") # 自动调整布局,防止轴标签被截断 plt.tight_layout() # 展示图表 plt.show()
关键细节说明
hue参数是实现并排的核心:它会将同一x轴类别(政策领域)下的不同hue分组(政党)的箱线图横向并排,而非堆叠,完全符合你的需求。- 长格式数据是前提:Seaborn依赖这种格式自动识别分组逻辑,不需要手动计算每个箱线图的x轴位置,大大简化了代码。
- 如果偏好Matplotlib原生实现,需要手动计算每个箱线图的偏移位置(比如给每个政策领域分配基准x值,每个政党偏移±0.2),但Seaborn的封装方案更高效简洁。
内容的提问来源于stack exchange,提问作者Dr. Fabian Habersack
相关产品推荐
相关产品推荐

