如何在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
相关产品推荐
相关产品推荐

