基于Python的mmWave板卡生命体征数据采集项目:Excel数据自动绘图与自动展示需求咨询
基于Python的mmWave板卡生命体征数据采集项目:Excel数据自动绘图与自动展示需求咨询
嘿,这个需求我之前做物联网数据采集相关项目时刚好碰过,给你拆解成「触发时机」「数据读取与绘图」「自动展示」三个部分来讲,附具体代码示例,应该能直接套用到你的项目里:
一、先解决「程序关闭时自动触发绘图」的核心触发逻辑
这里分两种场景,看你的采集程序是命令行脚本还是带GUI的应用:
场景1:命令行式采集程序(无界面)
用Python自带的atexit模块,它可以注册程序退出时自动执行的函数——不管你是正常退出、按Ctrl+C终止,还是程序跑完结束,都会触发这个函数,非常适合命令行场景。
场景2:带GUI的采集程序(比如用tkinter/Qt开发)
如果你的采集程序有可视化界面,直接绑定窗口的关闭事件就行。比如用tkinter的话,重写窗口关闭的回调函数,先执行绘图逻辑,再销毁窗口,确保绘图动作在程序完全关闭前完成。
二、读取Excel数据+绘制生命体征图表
这里用pandas读Excel(比原生xlrd/xlwt更省心,支持复杂格式),matplotlib绘图(最常用的Python绘图库,完全能满足生命体征数据的可视化需求,比如心率/呼吸率的时间序列图)。
先提前装好用到的依赖库:
pip install pandas matplotlib openpyxl
(openpyxl是pandas读取xlsx格式文件必需的依赖)
三、完整代码示例
示例1:命令行采集程序版本
import atexit import pandas as pd import matplotlib.pyplot as plt import os # 建议用绝对路径,避免工作目录变化导致找不到文件 EXCEL_FILE_PATH = os.path.abspath("./vital_signs_log.xlsx") def plot_vital_signs(): print("程序正在退出,开始生成生命体征图表...") try: # 1. 读取Excel数据(假设你的Excel有:时间、心率、呼吸率三列) df = pd.read_excel(EXCEL_FILE_PATH, engine="openpyxl") # 2. 清理无效数据(比如空值) df = df.dropna(subset=["时间", "心率", "呼吸率"]) # 3. 创建绘图画布 plt.figure(figsize=(12, 7)) # 4. 绘制心率时间序列图 plt.subplot(2, 1, 1) plt.plot(df["时间"], df["心率"], color="#e74c3c", linewidth=2, marker=".", label="心率(bpm)") plt.title("mmWave生命体征采集数据趋势") plt.ylabel("心率值") plt.grid(alpha=0.3) plt.legend() # 5. 绘制呼吸率时间序列图 plt.subplot(2, 1, 2) plt.plot(df["时间"], df["呼吸率"], color="#3498db", linewidth=2, marker=".", label="呼吸率(次/分钟)") plt.xlabel("采集时间") plt.ylabel("呼吸率值") plt.grid(alpha=0.3) plt.legend() # 自动调整子图间距,避免标签重叠 plt.tight_layout() # 可选:把图表保存成图片文件,方便后续归档 plt.savefig(os.path.abspath("./vital_signs_trend.png"), dpi=150, bbox_inches="tight") print("图表生成完成,自动展示中...") # 6. 自动弹出窗口展示图表 plt.show() except Exception as e: print(f"生成图表时出错:{str(e)}") # 注册退出时执行的绘图函数 atexit.register(plot_vital_signs) # ---------------------- # 这里替换成你的mmWave数据采集逻辑 # 示例:模拟采集程序运行 print("数据采集程序运行中,按Ctrl+C退出...") try: while True: # 实际代码:采集数据 -> 写入Excel pass except KeyboardInterrupt: print("正在退出程序...")
示例2:带tkinter GUI的采集程序版本
import tkinter as tk from tkinter import messagebox import pandas as pd import matplotlib.pyplot as plt import os EXCEL_FILE_PATH = os.path.abspath("./vital_signs_log.xlsx") def plot_vital_signs(): try: df = pd.read_excel(EXCEL_FILE_PATH, engine="openpyxl") df = df.dropna(subset=["时间", "心率", "呼吸率"]) plt.figure(figsize=(10, 6)) plt.plot(df["时间"], df["心率"], color="#e74c3c", label="心率") plt.plot(df["时间"], df["呼吸率"], color="#3498db", label="呼吸率") plt.title("生命体征数据趋势图") plt.xlabel("采集时间") plt.ylabel("数值") plt.grid(alpha=0.3) plt.legend() plt.tight_layout() # 自动弹出窗口展示 plt.show() return True except Exception as e: messagebox.showerror("生成失败", f"图表生成出错:{str(e)}") return False def on_close(): # 窗口关闭前先执行绘图逻辑 print("正在生成生命体征图表...") plot_vital_signs() # 不管绘图成功与否,最终关闭窗口 root.destroy() # 创建GUI主窗口 root = tk.Tk() root.title("mmWave生命体征采集系统") root.geometry("300x150") # 绑定窗口关闭事件 root.protocol("WM_DELETE_WINDOW", on_close) # 示例GUI控件(替换成你的采集控制按钮) start_btn = tk.Button(root, text="开始采集", command=lambda: messagebox.showinfo("提示", "已开始数据采集!")) start_btn.pack(pady=30) root.mainloop()
四、几个实用的注意事项
- Excel路径问题:一定要用绝对路径(比如
os.path.abspath()),不然如果程序在不同工作目录下运行,会找不到Excel文件; - 文件占用问题:采集程序写入Excel后,要确保文件完全保存(比如用
pandas.to_excel()时,默认会自动关闭文件,无需额外操作;如果是实时追加写入,建议每次写入后添加flush=True); - 图表展示兼容:如果程序在无桌面的服务器上运行,
plt.show()会报错,这时候可以只保存图片,或者配置matplotlib的虚拟显示后端;本地运行的话用默认后端即可; - 大数据优化:如果采集的时间序列数据量极大(比如上万条),绘图前可以做降采样(比如
df = df.iloc[::10],每10个点取一个),避免图表加载卡顿; - 异常处理:务必保留try-except块,处理Excel不存在、数据格式错误等情况,避免程序退出时崩溃。
要是你的Excel列名、数据格式和示例不一样,或者需要绘制其他类型的图(比如柱状图、散点图),可以再补充细节,我再帮你调整~




