为何Matplotlib部分子图网格线显示异常?如何统一设置网格?
问题原因分析
Matplotlib的网格线默认是与刻度位置对齐的,当你调用set_xticks([])或set_yticks([])时,会直接移除对应轴的刻度位置,导致对应的网格线失去参照而不显示:
- (0,1)子图设置了
set_yticks([]),移除了y轴刻度,因此水平网格线消失,只剩垂直网格线 - (1,0)、(1,2)、(2,0)、(2,2)子图中,非最后一行的设置了
set_xticks([]),移除了x轴刻度,因此垂直网格线消失,只剩水平网格线 - (1,1)和(2,1)子图同时移除了x轴(非最后一行)和y轴刻度,所以网格线完全消失
解决方法
不要直接清空刻度,而是通过tick_params隐藏刻度线和标签,保留刻度的位置信息,这样网格线就能正常生成。修改后的代码如下:
from matplotlib import pyplot pyplot.style.use('classic') pyplot.rcParams.update( { 'text.usetex': True, "font.family": "serif", 'text.latex.preamble': r'\usepackage{amsmath, amssymb, mlmodern}', } ) import numpy fig, ax = pyplot.subplots(3,3) fig.tight_layout() fig.subplots_adjust(hspace=0.1, wspace=0.1, left=0.09, right=.95, top=.95, bottom=.09) x = numpy.linspace(0, 8, 100) for i in range(3): for j in range(3): ax[i,j].plot(x, numpy.sin((1+j)*x+numpy.pi*i), ) ax[i,j].grid(which='both') # 替换原有的set_xticks/set_yticks,改为隐藏刻度线和标签 if i!=2: # 隐藏x轴的刻度线和标签 ax[i,j].tick_params(axis='x', which='both', bottom=False, labelbottom=False) if j==1: # 隐藏y轴的刻度线和标签 ax[i,j].tick_params(axis='y', which='both', left=False, right=False, labelleft=False, labelright=False) if j==2: ax[i,j].yaxis.tick_right() ax[0,0].set_ylabel('$\phi=0$') ax[1,0].set_ylabel('$\phi=\pi$') ax[2,0].set_ylabel('$\phi=2\pi$') ax[2,0].set_xlabel('$f = 1$') ax[2,1].set_xlabel('$f = 2$') ax[2,2].set_xlabel('$f = 3$') pyplot.savefig('waves.png')
效果说明
修改后所有子图都会显示完整的水平和垂直网格线,同时保持原有的刻度隐藏效果(非最后一行子图无x轴刻度标签,中间列子图无y轴刻度标签)。
内容的提问来源于stack exchange,提问作者sigsegv
相关产品推荐
相关产品推荐

