如何使用Seaborn结合twinx在柱状图上叠加折线图并解决X轴不匹配问题
X轴不对齐的根本原因
Seaborn不同图表类型对X轴变量的默认处理逻辑存在差异,是出现错位的核心诱因:
seaborn.barplot()是分类图表,无论传入的X轴字段week_number是数值还是字符串类型,都会默认将其作为分类变量处理,按数据行的出现顺序分配从0开始的连续整数作为实际绘图坐标,和week_number的实际数值无关。seaborn.lineplot()是数值关系图表,默认会将传入的X轴字段作为数值型变量处理,直接使用week_number的实际数值作为绘图坐标。
如果你的week_number不是从0开始的连续整数(比如从1开始计数、中间存在缺测周数),两种图表的X轴坐标映射关系就会完全不匹配,最终出现叠加错位的问题。
另外你代码中的fig.subplots_adjust参数配置错误,left/bottom/right/top的取值为画布的相对比例,合法范围是0~1,你设置的7、9等数值远大于合法范围,会将绘图区域挤压到画布可视范围外,进一步放大坐标错位的视觉表现。
修复方案
- 统一两类图表的X轴坐标映射,最简单的方式是将
week_number转为分类类型后再传入绘图函数:
# 预处理数据,将周数转为分类类型 bird_chem_df['week_number'] = bird_chem_df['week_number'].astype('category')
- 修正画布边距配置为合法值:
fig.subplots_adjust(left=0.12, bottom=0.1, right=0.88, top=0.9, wspace=0.4, hspace=0.5)
- 如果修改后依然存在错位,可以直接使用Matplotlib原生接口绘图,主动指定X轴坐标,完全规避Seaborn的默认逻辑差异:
# 循环内绘图逻辑替换为以下代码 weeks = bird_chem_df['week_number'].values x_coords = range(len(weeks)) # 绘制柱状图 col.bar(x_coords, bird_chem_df[target_chemical], color='lightsteelblue') col.set_xticks(x_coords) col.set_xticklabels(weeks) col.set_ylim(target_chemicals_display[target_chemical]) # 绘制折线图 bird = col.twinx() bird.plot(x_coords, bird_chem_df['total_bird_deaths'], color='red')
内容的提问来源于stack exchange,提问作者Adib
相关产品推荐
相关产品推荐

