Tkinter 数据可视化:交互式下拉菜单更新图表

本示例展示如何在 Tkinter 中使用下拉菜单选择性别和特征,并通过按钮交互动态更新图表。通过 trace() 方法监听下拉菜单值变化,实现实时更新图表功能。

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

def vision():
    # 创建主窗口
    vision_desk = tk.Tk()
    vision_desk.title('数据可视化')
    vision_desk.geometry('800x600')

    # 创建下拉列表选择性别
    gender_label = ttk.Label(vision_desk, text='请选择性别')
    gender_label.pack(pady=10)
    gender_var = tk.StringVar(value='男')
    gender_combobox = ttk.Combobox(vision_desk, textvariable=gender_var, values=['男', '女'])
    gender_combobox.pack()

    # 创建下拉列表选择特征
    feature_label = ttk.Label(vision_desk, text='请选择图的特征')
    feature_label.pack(pady=10)
    feature_var = tk.StringVar(value='forehead_width_cm')
    feature_combobox = ttk.Combobox(vision_desk, textvariable=feature_var, values=['forehead_width_cm', 'forehead_height_cm', 'long_hair', 'nose_wide', 'nose_long', 'lips_thin', 'distance_nose_to_lip_long'])
    feature_combobox.pack()

    # 创建画布
    canvas = tk.Canvas(vision_desk, width=600, height=400)
    canvas.pack(pady=20)

    def on_feature_change(*args):
        update_plot()

    feature_var.trace('w', on_feature_change)

    def update_plot():
        # 清空画布上的内容
        for widget in canvas.winfo_children():
            widget.destroy()

        # 获取选择的性别和特征
        gender = 1 if gender_combobox.get() == '男' else 0
        feature = feature_var.get()

        # 根据选择的特征绘制不同的图形
        if feature in ['forehead_width_cm', 'forehead_height_cm']:
            # 绘制散点图
            df = data[data['gender'] == gender][feature]
            # 计算分组间隔
            bin_width = (df.max() - df.min()) / 10
            # 绘制直方图
            fig, ax = plt.subplots()
            ax.hist(df, bins=np.arange(df.min(), df.max()+bin_width, bin_width), align='mid', histtype='bar', rwidth=0.8)
            ax.set_xlabel(feature)
            ax.set_ylabel('count')
            plt.show()
        else:
            # 绘制柱状图
            fig, ax = plt.subplots()
            ax.bar([0, 1], [data[(data['gender'] == gender) & (data[feature] == 0)].shape[0], data[(data['gender'] == gender) & (data[feature] == 1)].shape[0]])
            ax.set_xticks([0, 1])
            ax.set_xticklabels(['0', '1'])
            ax.set_xlabel(feature)
            ax.set_ylabel('count')
            ax.set_title(f'{feature} ({gender})')


        # 将图像转换为画布上的图片
        fig_canvas = FigureCanvasTkAgg(fig, master=canvas)
        fig_canvas.draw()
        fig_canvas.get_tk_widget().pack(side='top', fill='both', expand=1)

        # 保存图像
        plt.savefig('temp.png')

    # 创建按钮,并绑定更新图的函数
    update_button = ttk.Button(vision_desk, text='更新图', command=update_plot)
    update_button.pack(pady=10)

    # 运行主循环
    vision_desk.mainloop()

代码解释

  1. 创建下拉列表选择特征

    • feature_var.trace('w', on_feature_change): 使用 trace() 方法监听 feature_var 的值变化,并调用 on_feature_change 函数。
  2. 定义 on_feature_change 函数

    • 该函数在 feature_var 的值发生变化时自动调用,内部直接调用 update_plot 函数更新图表。
  3. 定义 update_plot 函数

    • 清空画布上的内容。
    • 获取选择的性别和特征值,并根据特征绘制不同的图形。
    • 将图像转换为画布上的图片。
    • 保存图像。

通过上述代码,在下拉菜单选择特征值发生变化时,图表会自动更新,实现交互式可视化。

注意:

  • 在实际应用中,需要根据你的数据和需求修改代码。
  • data 变量需要替换成你的实际数据。
  • 你可以根据需要添加更多功能,例如添加其他下拉菜单选项,改变图表样式等。
Tkinter 数据可视化:交互式下拉菜单更新图表

原文地址: https://www.cveoy.top/t/topic/fYTK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录