如何在同一画布中展示类别单独与整体箱线图并对齐坐标轴
实现类别+整体时间点的双箱线图布局
需求说明
需要绘制两组箱线图并实现共用X轴的对比布局:
- 上方:9个类别分别对应T1、T2两个时间点的横向箱线图,使用自定义类别排序
- 下方:展示T1、T2整体数据的横向箱线图
错误分析
你之前的子图代码出现语法错误,是因为给sns.boxplot的参数额外包裹了一层括号,正确写法应直接传递参数,无需外层括号。另外注意原DataFrame中T1、T2列是字符串类型,必须先转为数值型才能正确绘制箱线图。
完整实现代码
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 1. 创建DataFrame并转换数值类型 data = {'Category': ['waschen','anziehen','lesen', 'putzen', 'zahnpflege', 'essen', 'hobby', 'schlafen', 'spazieren', 'waschen', 'anziehen','lesen', 'putzen', 'zahnpflege', 'essen', 'hobby', 'schlafen', 'spazieren'], 'T1': ['1', '6', '5','8', '4', '7', '5', '7', '1', '7', '3', '2', '1', '4', '7', '5', '7', '1'], 'T2':['3', '7', '7','9', '8', '10', '8', '9', '3', '10', '9', '5', '3', '8', '9', '6', '7', '5']} df = pd.DataFrame(data) # 将T1、T2转为数值型,确保箱线图统计量计算正确 df['T1'] = df['T1'].astype(int) df['T2'] = df['T2'].astype(int) # 2. 创建上下布局的子图,启用X轴共用 fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(10, 8), sharex=True) # 3. 绘制上方类别分组箱线图 category_order = ['waschen', 'anziehen', 'zahnpflege', 'putzen', 'schlafen', 'essen', 'lesen', 'hobby', 'spazieren'] melted_df = df.melt(id_vars='Category', var_name='variable', value_name='value') sns.boxplot(y='Category', x='value', hue='variable', data=melted_df, palette='Blues', order=category_order, ax=ax1) ax1.set_title('各类别T1/T2数据对比') ax1.legend(title='时间点') # 4. 绘制下方整体时间点箱线图 overall_melted = df.melt(var_name='variable', value_name='value') sns.boxplot(x='value', y='variable', data=overall_melted, palette='Reds', ax=ax2) ax2.set_title('T1/T2整体数据对比') # 调整子图间距,避免标题与图表重叠 plt.tight_layout() plt.show()
关键说明
- 数值类型转换:原数据中T1、T2为字符串格式,必须转为数值型才能让箱线图正确计算中位数、四分位数等统计量
- 子图参数:
sharex=True确保两个子图共用X轴刻度,实现精准对齐对比 - 轴绑定:通过
ax参数将每个sns.boxplot指定到对应子图,避免语法错误
内容的提问来源于stack exchange,提问作者Kajette
相关产品推荐
相关产品推荐

