如何在Matplotlib 2×1子图中移除上方子图的X轴刻度/标签?
解决Matplotlib实时绘图中仅下方子图显示X轴刻度的问题
问题背景
开发一个展示4种读数的Python GUI,通过Matplotlib Animation实现实时绘图:
- 上方子图为双Y轴结构,展示2种读数;下方子图同样为双Y轴,展示另外2种读数
- X轴显示当前时间字符串
- 需求:仅保留下方子图的X轴刻度,但尝试
sharex参数、set_xticks([])等方法均未生效
问题原因
在animate_graph函数中,每次更新绘图时调用了ax11.clear(),该操作会重置轴的所有配置,包括之前设置的隐藏X轴的参数,导致之前的设置被覆盖失效。
解决方案
在每次调用ax11.clear()之后,重新添加隐藏上方子图X轴刻度和标签的代码,确保每次绘图更新后配置都能生效。
修改后的animate_graph函数关键部分
def animate_graph(i,x1,y11,y12,ax11 ,ax12 ,x2 ,y21,y22,ax21,ax22 ): # 生成随机数据 a = (2-1)*np.random.random()+1 b = (4-3)*np.random.random()+3 c = (6-5)*np.random.random()+5 d = (8-7)*np.random.random()+7 x1.append(dt.datetime.now().strftime('%H:%M:%S')) y11.append(a) y12.append(b) x2.append(dt.datetime.now().strftime('%H:%M:%S')) y21.append(c) y22.append(d) # 保留最近10条数据 x1 = x1[-10:] y11 = y11[-10:] y12 = y12[-10:] x2 = x2[-10:] y21 = y21[-10:] y22 = y22[-10:] # 清空上方子图主轴后,立即隐藏X轴刻度和标签 ax11.clear() ax11.tick_params(axis='x', bottom=False, labelbottom=False) ln1 = ax11.plot(x1,y11,colors[0],label = 'Temp(C)') ax11.tick_params(axis = 'y',labelcolor = colors[0]) ax12.clear() ln2 = ax12.plot(x1,y12,colors[1],label = 'RH(%?)') ax12.tick_params(axis = 'y',labelcolor = colors[1]) lns1 = ln1 + ln2 labs1 = [l.get_label() for l in lns1] ax11.legend(lns1,labs1,bbox_to_anchor = (0,1.02,1,0.102),loc = 3,ncol = 3,borderaxespad = 0) ax21.clear() ln3 = ax21.plot(x2,y21,colors[0],label = 'CO(%)') ax21.tick_params(axis = 'y',labelcolor = colors[0]) ax22.clear() ln4 = ax22.plot(x2,y22,colors[1],label = 'CO2(%)') ax22.tick_params(axis = 'y',labelcolor = colors[1]) lns2 = ln3 + ln4 labs2 = [l.get_label() for l in lns2] ax21.legend(lns2,labs2,bbox_to_anchor = (0,1.02,1,0.102),loc = 3,ncol = 3,borderaxespad = 0) # 下方子图保留X轴刻度并设置旋转 ax21.tick_params(axis = 'x',labelrotation = 45)
额外优化建议
- 移除原代码中
ax11.tick_params(axis = 'x',labelrotation = 45)这一行,因为上方子图的X轴已被隐藏,无需设置刻度旋转 - 两个子图的X轴数据完全一致(均为当前时间),可以合并
xList1和xList2,减少冗余数据
内容的提问来源于stack exchange,提问作者zoomywastestime01
相关产品推荐
相关产品推荐

