Python Tkinter数据可视化:动态交互式图表教程
import tkinter as tk
from tkinter import ttk
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
# 示例数据,实际使用时请替换为你的数据
data = {'gender': [1, 0, 1, 1, 0, 1, 0, 0, 1, 0],
'forehead_width_cm': [12.5, 11.8, 13.1, 12.9, 11.5, 12.7, 12.0, 11.6, 13.0, 11.9],
'forehead_height_cm': [6.2, 5.9, 6.5, 6.3, 5.8, 6.4, 6.0, 5.7, 6.6, 6.1],
'long_hair': [1, 0, 1, 0, 1, 1, 0, 1, 0, 1],
'nose_wide': [0, 1, 0, 1, 0, 0, 1, 0, 1, 0],
'nose_long': [1, 0, 1, 0, 1, 1, 0, 0, 1, 0],
'lips_thin': [0, 1, 0, 1, 1, 0, 1, 1, 0, 0],
'distance_nose_to_lip_long': [1, 0, 0, 1, 0, 1, 0, 1, 1, 0]}
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 update_plot():
# 清空画布上的内容
for widget in canvas.winfo_children():
widget.destroy()
# 获取选择的性别和特征
if gender_var.get() == '男':
gender = 1
else:
gender = 0
feature = feature_var.get() # 获取当前选择的特征
print(gender_var.get())
# 根据选择的特征绘制不同的图形
if feature in ['forehead_width_cm', 'forehead_height_cm']:
# 绘制直方图
df = [data[i][feature] for i in range(len(data['gender'])) if data['gender'][i] == gender]
# 计算分组间隔
bin_width = (max(df) - min(df)) / 10
# 绘制直方图
fig, ax = plt.subplots()
ax.hist(df, bins=np.arange(min(df), max(df) + bin_width, bin_width), align='mid', histtype='bar', rwidth=0.8)
ax.set_xlabel(feature)
ax.set_ylabel('count')
else:
# 绘制柱状图
count_0 = len([i for i in range(len(data['gender'])) if data['gender'][i] == gender and data[feature][i] == 0])
count_1 = len([i for i in range(len(data['gender'])) if data['gender'][i] == gender and data[feature][i] == 1])
fig, ax = plt.subplots()
ax.bar([0, 1], [count_0, count_1])
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()
if __name__ == '__main__':
vision()
这段代码创建了一个简单的图形用户界面,允许用户从下拉列表中选择性别和特征,然后根据选择生成相应的图表。
以下是一些SEO优化建议:
- 标题和描述: 使用更具描述性的标题和描述,例如“Python Tkinter数据可视化:动态交互式图表教程”。
- 关键词: 添加相关的关键词,例如“python,tkinter,数据可视化,图表,交互式,下拉列表,matplotlib”。
- 代码注释: 添加代码注释以解释代码的功能,这将使搜索引擎更容易理解你的代码。
- 结构化数据: 使用结构化数据标记,例如JSON-LD,来提供有关你内容的更多信息。
通过遵循这些建议,你可以提高你的内容在搜索引擎结果页面上的排名。
原文地址: https://www.cveoy.top/t/topic/fYTC 著作权归作者所有。请勿转载和采集!