使用twinx()绘制多轴图时x轴网格不显示的解决咨询
问题解决:多轴绘图中X轴网格不显示且置于背景层
问题根源
- 由于
ax2 = ax1.twinx()是共享X轴的副轴,X轴的控制权属于ax1,在ax2上开启X轴网格不会生效。 - 原代码中
ax1.grid(False)直接关闭了ax1的所有网格(包括X轴),导致X轴网格完全不显示。 - 即使强行在ax2开启X轴网格,也会被zorder更高的ax1遮挡。
修改后的代码
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0,2*np.pi) fx = 0.25* np.sin(x)**2 gx = 0.25* np.cos(x)**2 fig, ax1 = plt.subplots() # 配置ax1:开启X轴网格,关闭Y轴网格,设置网格样式 ax1.xaxis.grid(True, color="g", linestyle='--', linewidth=0.5) ax1.yaxis.grid(False) # 绘制绿色曲线 ax1.plot(x, fx, color="g") ax1.set_ylabel("f(x)", color="g") for label in ax1.get_yticklabels(): label.set_color("g") # 创建共享X轴的副轴ax2 ax2 = ax1.twinx() # 配置ax2:开启Y轴网格,设置样式 ax2.yaxis.grid(True, color="r", linestyle='--', linewidth=0.5) # 绘制红色曲线 ax2.plot(x, gx, color="r", lw=2) ax2.set_ylabel("g(x)", color="r") for label in ax2.get_yticklabels(): label.set_color("r") # 调整层级:让ax1(带X轴网格)处于最底层,确保网格在两条曲线下方 ax1.set_zorder(ax2.get_zorder() - 1) # 设置ax1背景透明,避免遮挡ax2内容 ax1.set_facecolor('none') ax1.set_frame_on(False) plt.show()
关键修改说明
- X轴网格归属:在ax1上开启X轴网格,因为共享X轴的副轴无法控制X轴元素。
- 层级调整:降低ax1的zorder,让网格处于最底层,两条曲线自然显示在网格上方。
- 背景透明:设置
ax1.set_facecolor('none')避免ax1的背景遮挡ax2的内容,同时保留set_frame_on(False)隐藏冗余边框。
内容的提问来源于stack exchange,提问作者Bernd Prager
相关产品推荐
相关产品推荐

