You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:48:02