Matplotlib同图绘制堆叠柱状图与折线图出现覆盖问题如何解决
问题根源
堆叠柱状图和折线图无法对齐、互相覆盖的核心原因是pandas两种图表的x轴坐标逻辑不一致:
- 柱状图绘制时会自动将分类索引转换为从0开始的整数作为实际x坐标
- 折线图默认直接使用索引的原始值作为x坐标,两者坐标体系不匹配导致错位/覆盖
解决方案代码
import seaborn as sns import matplotlib.pyplot as plt from datetime import datetime as dt import pandas as pd target_data = pd.read_csv('Target_levels.csv') actual_data = pd.read_csv('Actual_Levels.csv') actual_data['MTH'] = pd.to_datetime(actual_data['MTH'],format='%Y%m') actual_data['PERIOD'] = actual_data['MTH'].dt.to_period("m") actual_data.set_index('PERIOD',inplace=True) actual_data.drop('MTH',axis=1,inplace=True) target_data['MTH'] = pd.to_datetime(target_data['MTH'],format='%Y%m') target_data['PERIOD'] = target_data['MTH'].dt.to_period("m") target_data.set_index('PERIOD',inplace=True) target_data.drop('MTH',axis=1,inplace=True) fig, ax1 = plt.subplots(figsize = (10, 10)) # 绘制堆叠柱状图 actual_data.plot(kind = 'bar', stacked = True, ax = ax1) # 创建次轴放置折线(数值范围接近可直接复用ax1) ax2 = ax1.twinx() # 强制指定折线图x坐标为和柱状图一致的整数序列,保证对齐 target_data.plot(x=range(len(target_data)), ax = ax2, alpha = 0.5, marker='o') # 重置x轴刻度标签为原始月份周期 ax1.set_xticks(range(len(actual_data))) ax1.set_xticklabels(actual_data.index) # 调整图例位置避免重叠 ax1.legend(loc='upper left') ax2.legend(loc='upper right') plt.show()
核心修改说明
- 绘制折线图时手动传入
x=range(len(target_data)),让折线的x坐标和柱状图完全对齐 - 重置x轴刻度标签,保证显示为原始的月份周期,而非无意义的整数
- 折线图默认放置在独立次轴,避免两组数据数值范围差异大导致的显示问题,不需要次轴可直接删除ax2相关代码,将折线绘制在ax1上即可
- 补充图例位置设置,避免两组图例互相遮挡
内容的提问来源于stack exchange,提问作者JP1999JP
相关产品推荐
相关产品推荐

