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

如何在Matplotlib中同图绘制柱状图与折线图并设置双Y轴及固定X轴

实现双Y轴混合图表(柱状图+折线图)并固定显示所有月份

步骤说明

要实现需求,核心是先固定月份的分类顺序,确保X轴显示完整的12个月份,再通过双Y轴分别绘制柱状图和折线图。

完整代码示例

import pandas as pd
import matplotlib.pyplot as plt

# 原始数据
data = {
    'Month': ['Jan', 'Feb', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'November', 'December'],
    'Energy': [10, 11, 13, 15, 18, 20, 24, 28, 24, 17, 15],
    'Percentage': [0.5, 0.6, 0.71, 0.73, 0.81, 0.85, 0.91, 0.93, 0.81, 0.71, 0.6]
}
df = pd.DataFrame(data)

# 定义完整的月份顺序(包含所有12个月)
full_months = ['Jan', 'Feb', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']

# 将Month列转为分类类型,指定顺序为full_months,确保缺失的October也会在X轴显示
df['Month'] = pd.Categorical(df['Month'], categories=full_months, ordered=True)

# 创建画布和第一个坐标轴
fig, ax1 = plt.subplots(figsize=(10, 6))

# 绘制Energy柱状图
bars = ax1.bar(df['Month'], df['Energy'], color='#1f77b4', alpha=0.7, label='Energy')
ax1.set_xlabel('Month')
ax1.set_ylabel('Energy', color='#1f77b4')
ax1.tick_params(axis='y', labelcolor='#1f77b4')
# 给柱状图添加数值标签
for bar in bars:
    height = bar.get_height()
    ax1.text(bar.get_x() + bar.get_width()/2., height,
             f'{int(height)}',
             ha='center', va='bottom')

# 创建第二个坐标轴,共享X轴
ax2 = ax1.twinx()

# 绘制Percentage折线图
line = ax2.plot(df['Month'], df['Percentage'], color='#ff7f0e', marker='o', linewidth=2, label='Percentage')
ax2.set_ylabel('Percentage', color='#ff7f0e')
ax2.tick_params(axis='y', labelcolor='#ff7f0e')
# 给折线图添加数值标签
for x, y in zip(df['Month'], df['Percentage']):
    ax2.text(x, y, f'{y:.2f}', ha='center', va='bottom')

# 合并图例
lines1, labels1 = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left')

# 调整布局,防止标签被截断
plt.tight_layout()
plt.show()

关键细节解释

  • 固定月份顺序:通过pd.Categorical将Month列转为有序分类,指定完整的月份列表作为分类值,这样即使数据中缺失October,X轴也会自动补全该月份的位置。
  • 双Y轴设置:使用twinx()创建共享X轴的第二个坐标轴,分别对应柱状图和折线图的Y轴刻度与颜色,避免两个数据范围差异过大导致图表失真。
  • 数值标签:给柱状图和折线图添加具体数值,直接展示数据细节,提升图表可读性。
  • 图例合并:将两个坐标轴的图例合并到一处,避免重复显示,让图表布局更简洁。

内容的提问来源于stack exchange,提问作者Ignpl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:15:27