Matplotlib双轴(twinx)下如何让原始轴图例置于顶层?
Matplotlib双轴图表中让原始轴图例显示在顶层(保留网格)
问题描述
使用Matplotlib的twinx()创建双轴图表时,原始轴的图例被双轴绘制的线条遮挡,需要让原始轴的图例显示在顶层,同时保留原始轴的网格。
初始代码
fig2,ax2 = plt.subplots() ax2.cla() axx2.cla() axx2 = ax2.twinx() ax2.plot(range(1,11), range(2,12), label="main", zorder=100) axx2.plot(range(1,11), [100 for i in range(1,11)], label="second", zorder=10, color="black", linewidth=2) ax2.legend(loc="center left").set_zorder(1002) ax2.grid(True) ax2.set_ylabel("main") axx2.get_yaxis().set_visible(False)
(注:修正了原代码中1:10这类Python语法错误,替换为合法的range写法)
问题截图

解决方案
核心逻辑是:先创建原始轴的图例,将其从原始轴移除后添加到双轴对象上。由于双轴的绘制层级高于原始轴,添加到双轴的图例会自动显示在最顶层,同时不会影响原始轴网格的显示。
解决后代码
import matplotlib.pyplot as plt fig2, ax1 = plt.subplots() fig2.set_size_inches(18/1.5, 10/1.5) ax2 = ax1.twinx() # 绘制原始轴内容与网格 ax1.plot(range(1,11), range(1,11), label="main", linestyle="-") ax1.grid(True) # 绘制双轴内容 ax2.plot(range(1,11), [100 for i in range(1,11)], label="second", linestyle="--") # 调整图例层级,使其显示在顶层 legend_1 = ax1.legend(loc="center left", borderaxespad=1.) legend_1.remove() ax2.add_artist(legend_1) plt.show()
(注:补充了必要的导入语句与显示代码,修正了语法细节)
内容的提问来源于stack exchange,提问作者jjjjjj
相关产品推荐
相关产品推荐

