You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib嵌入Tkinter后plt.yticks([])失效,如何移除坐标轴刻度?

问题解决:Matplotlib嵌入Tkinter后无法移除坐标轴刻度

问题现象

使用plt.yticks([])尝试移除图表刻度,但将Matplotlib图表通过FigureCanvasTkAgg嵌入Tkinter窗口后,刻度依然显示,方法失效。

核心原因

  1. 重复创建子图覆盖设置:代码中先用plt.subplots()获取子图对象,随后又调用fig1.add_subplot(111)重新创建子图,导致之前的plt.yticks([])设置被完全覆盖。
  2. 全局plt方法未精准作用于目标子图:plt.yticks()是全局函数,在多子图/多画布场景下,无法保证精准作用于目标子图,应直接调用子图对象的专属方法。
  3. 动画循环未维护刻度设置:动画函数中每次绘制新柱状图时,未重新保持刻度隐藏的设置,导致坐标轴被自动重置。

解决方案

  • 移除重复创建子图的代码,直接使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:01:36