Matplotlib嵌入Tkinter后plt.yticks([])失效,如何移除坐标轴刻度?
问题解决:Matplotlib嵌入Tkinter后无法移除坐标轴刻度
问题现象
使用plt.yticks([])尝试移除图表刻度,但将Matplotlib图表通过FigureCanvasTkAgg嵌入Tkinter窗口后,刻度依然显示,方法失效。
核心原因
- 重复创建子图覆盖设置:代码中先用
plt.subplots()获取子图对象,随后又调用fig1.add_subplot(111)重新创建子图,导致之前的plt.yticks([])设置被完全覆盖。 - 全局plt方法未精准作用于目标子图:
plt.yticks()是全局函数,在多子图/多画布场景下,无法保证精准作用于目标子图,应直接调用子图对象的专属方法。 - 动画循环未维护刻度设置:动画函数中每次绘制新柱状图时,未重新保持刻度隐藏的设置,导致坐标轴被自动重置。
解决方案
- 移除重复创建子图的代码,直接使用
plt.subplots()返回的子图对象 - 使用子图对象的
set_yticks([])和set_xticks([])方法,精准控制对应坐标轴的刻度显示 - 在动画函数开头添加子图清除操作(
b1.clear()),避免重复绘制,并在清除后重新设置刻度隐藏
修改后的完整代码
import tkinter as tk import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib import animation import random # 创建Tkinter窗口 root = tk.Tk() root.geometry('1200x200') # 调整窗口大小以完整显示图表 # 创建图表和子图,不再重复添加子图 fig1, b1 = plt.subplots(figsize=(10, 0.5), dpi=80) # 直接对子图设置隐藏y轴和x轴刻度 b1.set_yticks([]) b1.set_xticks([]) fig2, b2 = plt.subplots(figsize=(10, 0.5), dpi=80) b2.set_yticks([]) b2.set_xticks([]) def grafico_1(i): global b1 x = [] y_fix = [] ws = ['WIRE'] for _ in range(1, 6): x.append(random.randint(1, 10)) # 清除子图内容,避免重复绘制堆积 b1.clear() # 清除后重新设置刻度隐藏 b1.set_yticks([]) b1.set_xticks([]) # 第一层柱状图 val = x[0] if val < 3: b1.barh(ws, val, color='green') y_fix.append(val) elif 3 <= val < 6: b1.barh(ws, val, color='yellow') y_fix.append(val) else: b1.barh(ws, val, color='red') y_fix.append(val) # 后续层柱状图 for c in x[1:]: current_sum = sum(y_fix) if c < 3: b1.barh(ws, c, color='green', left=current_sum) elif 3 < c < 5: b1.barh(ws, c, color='yellow', left=current_sum) else: b1.barh(ws, c, color='red', left=current_sum) y_fix.append(c) def grafico_2(i2): global b2 x2 = [] y_fix2 = [] ws2 = ['line 2'] for _ in range(1, 6): x2.append(random.randint(1, 10)) b2.clear() b2.set_yticks([]) b2.set_xticks([]) val = x2[0] if val < 3: b2.barh(ws2, val, color='green') y_fix2.append(val) elif 3 <= val < 6: b2.barh(ws2, val, color='yellow') y_fix2.append(val) else: b2.barh(ws2, val, color='red') y_fix2.append(val) for c2 in x2[1:]: current_sum = sum(y_fix2) if c2 < 3: b2.barh(ws2, c2, color='green', left=current_sum) elif 3 < c2 < 5: b2.barh(ws2, c2, color='yellow', left=current_sum) else: b2.barh(ws2, c2, color='red', left=current_sum) y_fix2.append(c2) ani1 = animation.FuncAnimation(fig1, grafico_1, interval=3000, frames=100) ani2 = animation.FuncAnimation(fig2, grafico_2, interval=3000, frames=100) # 嵌入Tkinter窗口 canvas1 = FigureCanvasTkAgg(fig1, master=root) canvas1.get_tk_widget().pack(pady=10) canvas2 = FigureCanvasTkAgg(fig2, master=root) canvas2.get_tk_widget().pack(pady=10) root.mainloop()
内容的提问来源于stack exchange,提问作者Jose Lotto
相关产品推荐
相关产品推荐

