将pandas堆叠柱状图插入Tkinter notebook选项卡并修改图例名称的方法
实现方案
以下是完整可直接运行的实现代码:
import tkinter as tk from tkinter import ttk import pandas as pd import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg # 构造示例DataFrame,可替换为你自己的数据读取逻辑 data = { 'Date': ['2015-10-02', '2015-01-02', '2015-01-02', '2015-12-02', '2015-01-02', '2015-08-02', '2015-03-02'], 'Alarm': ['Adam', 'David', 'Adam', 'Adam', 'David', 'Hardik', 'David'], 'Count': [1,4,4,0,6,2,4] } df = pd.DataFrame(data) # 数据聚合:相同日期下按Alarm分组求和,避免日期索引重复 # 如果需要保留原始重复日期,可替换为你原本的df2构造逻辑 df_pivot = df.pivot_table(index='Date', columns='Alarm', values='Count', aggfunc='sum').fillna(0) # 初始化Tkinter主窗口 root = tk.Tk() root.title("堆叠图嵌入演示") root.geometry("1200x600") # 创建Notebook选项卡组件 notebook = ttk.Notebook(root) notebook.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) # 新增第一个选项卡,用于放置图表 chart_tab = ttk.Frame(notebook) notebook.add(chart_tab, text="堆叠柱状图") # 手动创建matplotlib画布,避免默认弹出独立窗口 fig, ax = plt.subplots(figsize=(15, 5)) # 绘制堆叠柱状图 df_pivot.plot(kind='bar', stacked=True, ax=ax) # 设置图例标题为Name ax.legend(title="Name") # 自动调整布局避免标签截断 plt.tight_layout() # 将matplotlib画布绑定到Tkinter选项卡 canvas = FigureCanvasTkAgg(fig, master=chart_tab) canvas.draw() # 放置画布组件到选项卡内 canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) # 启动Tkinter主循环 root.mainloop()
关键逻辑说明
- 手动创建matplotlib的
Figure和Axes对象,而不是直接调用df.plot的默认渲染逻辑,才能将图像嵌入到Tkinter组件中 - 通过
ax.legend(title='Name')直接设置图例标题满足需求 - 用
FigureCanvasTkAgg作为中间适配层,把matplotlib的渲染结果绑定到Tkinter的容器组件上 - 示例中增加了数据聚合逻辑,解决了原始构造df2时相同日期重复出现的问题,如果需要保留原始的重复日期索引,直接替换
df_pivot为你自己构造的df2即可
内容的提问来源于stack exchange,提问作者Sriram
相关产品推荐
相关产品推荐

