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()
关键修改点:
- 把
avail.legend()移到三个barh绘制完成之后执行,确保Matplotlib能识别到所有图形元素。 - 每个
barh函数添加label参数,值与图例文本一一对应,建立图形和图例的关联。 - 调整Tkinter窗口尺寸并改用
pack(fill=tk.BOTH, expand=True)布局,避免原代码中place布局导致图形被窗口截断。
修改完成后,图例就能正常显示,图形也能完整适配窗口展示。
内容的提问来源于stack exchange,提问作者Jose Lotto
相关产品推荐
相关产品推荐

