【丁丁历险记】Matplotlib+tkinter 图表动态显示上位机

本教程展示如何使用Python的matplotlib和tkinter库创建动态更新的图表。通过生成随机数据并在画布上实时更新,实现了数据的动态可视化。适合初学者了解GUI编程与数据可视化的结合。

  • 在进行制作的过程中常常需要对数据进行分析和操作
  • 本节主要使用matplotlib配合tkinter制作动态的
  • tkinter更多使用参数请参考 Python GUI tkinter

一、图传上位机界面设计

  • 在这里通过将接收的数据以图标的形式在tkinter中的进行动态的显示。
  • Matlab的动态图表需要canvas画布控件 中进行动态显示
  • 本文使用随机数的方式生成数据,可按照需求进行替换
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import numpy as np
from tkinter import *


def video_loop():  #动态图像现实窗口
    """
    动态matlib图表
    """
    rand_data = abs(np.random.normal(1, 2, 12))
    f.clf()
    a = f.add_subplot(111)
    a.bar(range(12),abs(rand_data), align='center')
    a.set_title('title')
    canvas.draw()
    root.after(5, video_loop)


root = Tk()
root.title("Se
<think>我们正在讨论两个主要问题: 1. MatplotlibTkinter集成生成动态图表需要学习的内容 2. 将爬取的数据进行排列所需的知识 根据用户提供的引用和之前对话内容,我们来构建答案。 ### 一、MatplotlibTkinter集成生成动态图表的学习内容 要将Matplotlib图表嵌入到Tkinter GUI中,需要掌握以下关键知识点: #### 1. **Matplotlib基础** - **图形组件**:理解`Figure`(画布)、`Axes`(坐标系)、`Axis`(坐标轴)等核心对象[^1] - **绘图类型**:掌握折线图(`plot()`)、柱状图(`bar()`)、散点图(`scatter()`)等基础图形的绘制方法 - **样式定制**:学习配置线条样式(颜色、线宽、标记点)、坐标轴范围、标题、图例等属性 #### 2. **Tkinter GUI编程** - **窗口组件**:熟悉`Frame`(容器)、`Button`(按钮)、`Entry`(输入框)等控件的使用 - **布局管理**:掌握`pack()`、`grid()`、`place()`三种布局方式 - **事件处理**:理解按钮点击(`command`参数)等事件绑定机制 #### 3. **集成技术:FigureCanvasTkAgg** 这是Matplotlib提供的专门用于Tkinter的嵌入组件: ```python from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg # 创建Matplotlib图形 fig = plt.Figure(figsize=(8, 4)) ax = fig.add_subplot(111) ax.plot([1,2,3], [4,5,6]) # 示例数据 # 嵌入到Tkinter canvas = FigureCanvasTkAgg(fig, master=root) # root为Tkinter窗口 canvas.draw() canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) ``` **关键点**: - `canvas.draw()` 用于渲染图形 - `get_tk_widget()` 获取Tkinter兼容的组件对象 #### 4. **动态更新机制** 实现图表动态刷新需要: - **数据更新**:通过爬虫或计算获取新数据 - **图形重绘**:清除旧图形(`ax.clear()`)并绘制新数据 - **性能优化**:使用`blit`技术局部刷新(复杂场景)或简单整体重绘 示例代码片段: ```python def update_chart(): new_data = fetch_data() # 获取新数据 ax.clear() # 清除当前坐标系 ax.plot(new_data) # 绘制新数据 canvas.draw() # 重绘画布 ``` ### 二、爬取数据排列所需知识 数据排列通常涉及数据清洗和结构化处理,需要掌握: #### 1. **数据结构化工具:Pandas** - **DataFrame操作**: - 数据排序:`df.sort_values(by='列名')` - 行列选择:`df[['列A','列B']]` 或 `df.iloc[行范围]` - 条件过滤:`df[df['价格'] > 100]` - **数据类型转换**:`astype()`方法转换数字/日期格式 - **缺失值处理**:`dropna()`删除或`fillna()`填充缺失值 #### 2. **数据清洗技巧** - **字符串处理**:正则表达式(`re`模块)提取关键信息 ```python import re df['提取列'] = df['原始列'].apply(lambda x: re.findall(r'\d+\.\d+', x)[0]) ``` - **重复值处理**:`df.drop_duplicates()` - **数据归一化**:`sklearn.preprocessing.MinMaxScaler` #### 3. **与可视化结合** 清洗后的数据可直接用于Matplotlib绘图: ```python # 按日期排序后绘图 df_sorted = df.sort_values(by='日期') ax.plot(df_sorted['日期'], df_sorted['价格']) ``` ### 学习路径建议 1. **基础阶段**: - 先分别学习MatplotlibTkinter基础(各1-2天) - 练习静态图表嵌入(参考前文集成代码) 2. **进阶阶段**: - 实现定时器动态更新(`Tkinter.after(毫秒数, 更新函数)`) - 结合Pandas处理爬虫数据 3. **实战阶段**: - 构建股票数据监控工具(如之前案例) - 开发传感器实时数据展示系统 §§相关问题§§ 1. 如何在Tkinter中实现图表的定时自动刷新? 2. Pandas处理金融时间序列数据有哪些特殊技巧? 3. 如何解决Matplotlib嵌入Tkinter时的界面卡顿问题? 4. 动态图表的数据更新有哪些优化策略? 5. 如何保存Matplotlib动态图表为GIF或视频? </think>### MatplotlibTkinter集成生成动态图表的学习要点 要掌握MatplotlibTkinter的集成开发,需要系统学习以下核心内容: #### 1. **Matplotlib基础** - **图形对象层级体系**: - `Figure`(画布容器):$ \text{Figure} = \text{plt.Figure(figsize=(w,h), dpi=resolution)} $ - `Axes`(坐标系):$ \text{Axes} = \text{figure.add_subplot(行,列,位置)} $ - 核心绘图函数:`plot()`(折线图), `bar()`(柱状图), `scatter()`(散点图)[^1] - **动态更新机制**: ```python # 动态更新示例 line, = ax.plot([], []) # 创建空线条 def update(data): line.set_data(data['x'], data['y']) # 更新数据 canvas.draw() # 重绘画布 ``` #### 2. **Tkinter集成技术** - **嵌入组件**: ```python from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg canvas = FigureCanvasTkAgg(figure, master=tk_window) # 创建嵌入组件 canvas.get_tk_widget().pack() # 布局到窗口 ``` - **交互控件绑定**: - 按钮事件:`ttk.Button(command=update_chart)` - 定时刷新:`window.after(1000, refresh_data)` # 每秒刷新 - **布局管理**(pack/grid/place): ```python canvas.get_tk_widget().grid(row=0, column=0, sticky='nsew') control_frame.grid(row=1, column=0, pady=10) ``` #### 3. **数据处理与排列** 要有效排列爬取数据,需掌握: - **Pandas数据结构**: ```python import pandas as pd df = pd.DataFrame({ '时间': pd.date_range('2023-01-01', periods=5), '价格': [42.3, 43.1, 41.9, 44.2, 45.0] }) ``` - **数据排序与筛选**: - 按列排序:`df.sort_values('价格', ascending=False)` - 时间序列处理:`df.set_index('时间').resample('D').mean()` - **数据转换**: ```python # 计算涨跌幅 df['涨跌幅'] = df['价格'].pct_change() * 100 # 数据归一化 df['归一价格'] = (df['价格'] - df['价格'].min()) / (df['价格'].max() - df['价格'].min()) ``` #### 4. **实时数据可视化流程 ```mermaid graph TD A[爬虫获取数据] --> B(Pandas数据清洗) B --> C{数据转换<br>排序/过滤/计算} C --> D[Matplotlib绘图对象] D --> E[FigureCanvasTkAgg嵌入] E --> F[Tkinter界面展示] F --> G[用户交互事件] G --> C ``` ### 案例:股票实时走势仪表盘 ```python import tkinter as tk from matplotlib.figure import Figure from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import pandas as pd import numpy as np class LiveStockDashboard: def __init__(self, master): self.master = master self.fig = Figure(figsize=(10, 6), dpi=100) self.ax = self.fig.add_subplot(111) # 初始化数据 self.df = pd.DataFrame({ '时间': pd.date_range(end=pd.Timestamp.now(), periods=60, freq='min'), '价格': np.random.normal(100, 5, 60).cumsum() }) # 创建Tkinter组件 self.canvas = FigureCanvasTkAgg(self.fig, master) self.canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) # 首次绘图 self.update_chart() # 定时刷新 self.master.after(1000, self.refresh_data) def refresh_data(self): """模拟实时数据更新""" new_price = self.df['价格'].iloc[-1] * (1 + np.random.uniform(-0.02, 0.02)) new_row = pd.DataFrame({ '时间': [pd.Timestamp.now()], '价格': [new_price] }) self.df = pd.concat([self.df, new_row]).tail(60) # 保留最近60个点 self.update_chart() self.master.after(1000, self.refresh_data) # 每秒刷新 def update_chart(self): """更新图表""" self.ax.clear() self.df.plot(x='时间', y='价格', ax=self.ax, color='blue', marker='o') self.ax.set_title('实时股票价格走势', fontsize=14) self.ax.grid(alpha=0.3) self.canvas.draw() if __name__ == "__main__": root = tk.Tk() app = LiveStockDashboard(root) root.mainloop() ``` ### 关键学习资源推荐 1. **官方文档**: - [Matplotlib嵌入Tkinter指南](https://matplotlib.org/stable/gallery/user_interfaces/embedding_in_tk_sgskip.html) - [Pandas时间序列处理](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html) 2. **进阶技巧**: - 双Y轴图表:`ax2 = ax.twinx()` - 动态标记点:`ax.annotate()` - 性能优化:`blit`技术实现局部刷新 - 主题美化:使用`seaborn.set_style()`统一样式[^2]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值