使用twinx时如何添加图例?解决重复图例问题
解决双Y轴图表重复图例问题
问题出在你没有显式保存第一个坐标轴对象,依赖plt.gca()获取当前轴时,创建双轴后可能指向错误的轴,导致图例项被重复收集。以下是修正后的代码:
import numpy as np import pandas as pd # 补充缺失的pandas导入 import matplotlib.pyplot as plt import matplotlib.dates as mdates from datetime import datetime, timedelta df = pd.read_csv('FireCountPenchMar2012.csv') print(df) xaxis = np.arange(0,248,1) yaxis = hdwi yaxis2 = df.fire_count print(yaxis2) # 创建日期序列 start_date = datetime(2023, 3, 1, 0, 0, 0) dates = [start_date + timedelta(hours=3*i) for i in range(len(xaxis))] plt.figure(figsize=(15,10)) # 显式获取第一个坐标轴ax1 ax1 = plt.gca() # 在ax1上绘制第一个变量 line1, = ax1.plot(dates, yaxis, 'o-g', label='HDWI') ax1.set_ylabel('HDW') ax1.set_title('HDWI v/s Fire Counts') # 创建双Y轴ax2 ax2 = ax1.twinx() # 在ax2上绘制第二个变量 scatter1 = ax2.scatter(dates, yaxis2, color='red', label='Fire Counts') ax2.set_ylabel('Fire Counts') # 合并两个轴的图例项 handles = [line1, scatter1] labels = [h.get_label() for h in handles] # 创建统一图例 plt.legend(handles, labels, loc='upper right') # 格式化X轴日期 date_format = mdates.DateFormatter('%b %d') ax1.xaxis.set_major_locator(mdates.DayLocator(interval=2)) ax1.xaxis.set_major_formatter(date_format) plt.xticks(rotation=45) plt.grid() plt.tight_layout() plt.show()
关键修改点:
- 显式保存第一个坐标轴
ax1,避免后续调用plt.gca()时混淆轴对象 - 直接获取绘图返回的句柄(
line1,和scatter1),确保只收集每个变量对应的单个图例项 - 合并句柄后统一创建图例,避免重复添加
内容的提问来源于stack exchange,提问作者Nouredin Modl
相关产品推荐
相关产品推荐

