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

# 加载数据集
data = pd.read_csv('性别分类数据集0.csv')

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

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

# 创建下拉列表选择特征
feature_label = ttk.Label(root, text='请选择图的特征')
feature_label.pack(pady=10)
feature_var = tk.StringVar(value='forehead_width_cm')
feature_combobox = ttk.Combobox(root, 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(root, width=600, height=400)
canvas.pack(pady=20)

# 定义更新图的函数
def update_plot():
    # 清空画布上的内容
    canvas.delete('all')
    
    # 获取选择的性别和特征
    gender = int(gender_var.get() == '男')
    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(root, text='更新图', command=update_plot)
update_button.pack(pady=10)

# 运行主循环
root.mainloop()

该代码实现了以下功能:

  1. 使用 Tkinter 创建主窗口,并设置标题和大小。
  2. 创建两个下拉列表:一个用于选择性别,另一个用于选择要绘制图表的特征。
  3. 创建一个画布用于显示图表。
  4. 定义 update_plot 函数,用于根据选择的性别和特征更新图表。
  5. 创建一个按钮,点击按钮后会调用 update_plot 函数更新图表。

关键点:

  • update_plot 函数中,使用 canvas.delete('all') 清空画布上的旧图表,以便显示新图表。
  • 使用 FigureCanvasTkAgg 类将 Matplotlib 图表嵌入到 Tkinter 画布中。
  • 使用 plt.savefig('temp.png') 保存图表到磁盘。

使用方法:

  1. 运行代码。
  2. 从下拉列表中选择性别和特征。
  3. 点击“更新图”按钮,即可更新图表。

该代码可以帮助你快速创建交互式数据可视化工具,方便分析和展示数据。

Python Tkinter 数据可视化工具 - 按性别和特征绘制图表

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

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