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

Matplotlib结合Tkinter绘图时legend()函数失效问题求助

解决Tkinter集成Matplotlib时图例不显示的问题

你的代码里图例无法显示有两个核心原因:

  • 调用时机错误:你在绘制条形图之前就调用了legend(),此时Matplotlib还没有任何图形元素可以关联图例。
  • 缺少标签关联:每个条形图没有指定label参数,图例无法识别对应的图形。

修改后的代码:

import tkinter as tk
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

# 创建Tkinter窗口,调整尺寸避免图形被截断
root = tk.Tk()
root.geometry('1000x800')

fig2, avail = plt.subplots(figsize=(10,7), dpi=60, facecolor= '#e9eef0')
avail.tick_params(axis='y', labelsize=0)
avail.set_ylabel('FOLLOWING THE PRODUCTION', fontsize=20)
avail.set_xlabel('TIME (minute)', fontsize=20)

stop = [30]
on = [40]
planned = [70]  
x = 1
w = 0.2

# 给每个barh添加label参数,对应图例名称
avail.barh(x + w, on, w, color='#22e3e3', edgecolor='black', linewidth=2, label='ON')
avail.barh(x, planned, w, color='#05337d', edgecolor='black', linewidth=2, label='PLANNED')
avail.barh(x - w, stop, w, color='#c95924', edgecolor='black', linewidth=2, label='STOP')

# 绘制完所有图形后再调用legend()
avail.legend(fontsize=12)

# 将画布嵌入Tkinter窗口,自适应窗口大小
canvas_avail = FigureCanvasTkAgg(fig2, master=root)
canvas_avail.get_tk_widget().pack(fill=tk.BOTH, expand=True)

root.mainloop()

关键修改点:

  1. 把avail.legend()移到三个barh绘制完成之后执行,确保Matplotlib能识别到所有图形元素。
  2. 每个barh函数添加label参数,值与图例文本一一对应,建立图形和图例的关联。
  3. 调整Tkinter窗口尺寸并改用pack(fill=tk.BOTH, expand=True)布局,避免原代码中place布局导致图形被窗口截断。

修改完成后,图例就能正常显示,图形也能完整适配窗口展示。

内容的提问来源于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.02 14:22:10