# DataPlotPy **Repository Path**: bistu_liuning_admin_admin/DataPlotPy ## Basic Information - **Project Name**: DataPlotPy - **Description**: PyQt6 数据可视化工具 - 基于 PyQt6 开发的数据可视化和分析工具 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-05 - **Last Updated**: 2026-03-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DataPlotPy PyQt6 数据可视化工具 基于 PyQt6 开发的数据可视化和分析工具 ## 项目简介 DataPlotPy 是 DataPlot 的 Python/PyQt6 版本,支持多种数据格式的导入、2D/3D 绑图、FFT/STFT 分析、滤波处理、数据插值等数据处理功能。 ### 作者信息 - 作者:刘宁 - 邮箱:ning.liu@bistu.edu.cn ## 版本信息 当前版本:v1.1.1 ### 更新日志 #### v1.1.1 (2026-03-05) - 修复工具栏"设为X轴"、"取消X轴"、"删除列"按钮未激活问题 - 修复帮助菜单点击无响应问题 - 新增PDF格式使用说明文档 - 帮助菜单改为打开PDF使用说明 #### v1.1.0 (2026-03-05) - 新增数据插值功能:支持样条插值、线性插值、平均插值 - 新增拼接显示功能:多列数据在同一时间点上交错拼接显示 - 新增插值数据导出功能 - 更新3D图表图标,与2D图表区分 - 新增帮助菜单:使用说明和版本信息 #### v1.0.0 - 初始版本 - 支持多种数据格式导入导出 - 2D/3D图表显示 - FFT/STFT频谱分析 - 数字滤波处理 ## 功能特性 ### 数据导入导出 - 支持格式:DAT、CSV、TXT、Excel(XLSX/XLS) - 自动检测文件编码(支持 UTF-8、GBK 等) - 支持自定义分隔符(自动检测、逗号、空格、制表符、分号) - 支持行数范围选择导入 - 支持跳过指定行数 - 异步导入,实时进度显示 - 数据导出为 CSV、TXT、DAT、XLSX 格式 ### 2D 图表显示 - 基于 pyqtgraph 高性能绑图 - 多曲线同时绘制(最多32条) - 32种预设颜色自动区分多通道 - 自适应坐标轴范围 - 曲线填满画布(X轴不留余量) - 大数据自动降采样(超过10000点) - 支持矩形区域缩放(Ctrl+鼠标拖拽) - 视图历史记录(支持返回上一视图) - 图像导出(PNG、JPG等) - **线型选择**:实线、虚线、点线、点划线、仅点、点+线 ### 3D 图表显示 - 基于 matplotlib 的 3D 曲线图 - 完整的三维坐标轴显示(带刻度标签) - 支持多通道数据叠加显示 - 鼠标拖拽旋转、滚轮缩放 - **线型选择**:实线、虚线、点线、点划线、仅点、点+线 ### 信号分析 - FFT 频谱分析 - 可配置采样率、FFT大小 - 支持多种窗函数(矩形窗、汉宁窗、汉明窗、布莱克曼窗) - STFT 短时傅里叶变换 - 时频谱图显示 - 可配置重叠率 - 正确的坐标轴方向(X轴=时间,Y轴=频率) ### 数据处理 - 滤波处理 - 低通、高通、带通、带阻滤波器 - 可配置截止频率 - 微分计算 - 一阶微分、二阶微分 - **数据插值**(新增) - 三次样条插值:使用三次多项式平滑连接数据点 - 线性插值:相邻点之间线性连接 - 平均插值:在数据点之间插入平均值 - 支持导出插值后的数据 - **拼接显示**(新增) - 将多列数据在同一时间点上依次排列显示 - 例如选择列3、4、5,显示顺序为:t1时刻列3→列4→列5→t2时刻列3→列4→列5... ## 目录结构 ``` DataPlotPy/ ├── main.py # 程序入口 ├── requirements.txt # 依赖列表 ├── README.md # 项目说明 ├── DataPlot.spec # PyInstaller打包配置 ├── src/ │ ├── core/ # 核心模块 │ │ ├── config_manager.py # 配置管理 │ │ └── logger.py # 日志管理 │ ├── data/ # 数据模块 │ │ ├── data_column.py # 数据列定义 │ │ ├── data_importer.py # 数据导入(CSV/TXT/DAT/Excel) │ │ ├── data_exporter.py # 数据导出 │ │ └── table_model.py # 表格数据模型 │ ├── widgets/ # 控件模块 │ │ ├── channel_list_widget.py # 通道列表 │ │ └── data_table_view.py # 数据表格 │ ├── plot/ # 绑图模块 │ │ ├── plot_2d_widget.py # 2D图图表控件 │ │ ├── plot_2d_window.py # 2D图表窗口 │ │ ├── plot_3d_widget.py # 3D图表控件(matplotlib) │ │ └── plot_3d_window.py # 3D图表窗口 │ ├── processing/ # 数据处理模块(新增) │ │ └── interpolation_processor.py # 插值处理器 │ └── dialogs/ # 对话框模块 │ ├── progress_dialog.py # 进度对话框 │ ├── import_dialog.py # 导入对话框 │ ├── export_dialog.py # 导出对话框 │ ├── plot_3d_dialog.py # 3D绘图设置 │ ├── fft_dialog.py # FFT设置 │ ├── stft_dialog.py # STFT设置 │ ├── filter_dialog.py # 滤波设置 │ ├── interpolation_dialog.py # 插值设置(新增) │ └── concat_dialog.py # 拼接显示设置(新增) ``` ### 安装依赖 ```bash pip install PyQt6>=6.6.0 pip install pyqtgraph>=0.13.0 pip install numpy>=1.20.0 pip install scipy>=1.10.0 pip install openpyxl>=3.0.0 pip install matplotlib>=3.5.0 pip install pyperclip>=1.8.0 ``` 或使用 requirements.txt: ```bash pip install -r requirements.txt ``` ### 运行程序 ```bash python main.py ``` ### 打包EXE ```bash python -m PyInstaller DataPlot.spec ``` 打包结果位于 `dist/DataPlot/` 目录下。 ## 使用说明 ### 数据导入 1. 点击工具栏"导入"按钮或菜单"文件→导入数据"(Ctrl+I) 2. 选择数据文件(支持 DAT、CSV、TXT、Excel) 3. 配置导入选项: - 分隔符:自动检测(推荐)、逗号、空格等 - 跳过行数:跳过文件开头的非数据行 - 首行为列名:勾选则第一行作为列名 - 读取范围:可指定开始行和结束行 4. 点击"导入"按钮 ### 2D 曲线显示 1. 在表格中选择要绘制的数据列(可多选,最多32列) 2. 可选:右键点击某列选择"设为X轴" 3. 点击工具栏"2D曲线"按钮或菜单"绘图→2D曲线" 4. 在图表窗口中: - 滚轮缩放 - 拖拽平移 - Ctrl+拖拽:矩形区域缩放 - 工具栏"线型"下拉框:切换曲线显示样式 - 右键菜单:恢复视图、适应窗口、导出图片 ### 3D 曲线显示 1. 在表格中选择三列数据(X、Y、Z轴) 2. 点击菜单"绘图→3D曲线" 3. 配置XYZ轴对应的列 4. 在图表窗口中: - 鼠标拖拽旋转视角 - 滚轮缩放 - 工具栏"线型"下拉框:切换曲线显示样式 ### FFT 分析 1. 选择要分析的数据列 2. 点击菜单"分析→FFT分析" 3. 配置参数:采样率、FFT大小、窗函数类型 4. 查看频谱图 ### STFT 分析 1. 选择要分析的数据列 2. 点击菜单"分析→STFT分析" 3. 配置参数:采样率、FFT大小、重叠率、窗函数类型 4. 查看时频谱图(X轴=时间,Y轴=频率) ### 数据滤波 1. 选择要滤波的数据列 2. 点击菜单"处理→数据滤波" 3. 配置参数:滤波器类型、截止频率 4. 查看滤波前后对比图 ### 数据插值(新增) 1. 选择要插值的数据列 2. 点击菜单"处理→数据插值"(Ctrl+Shift+I) 3. 选择插值方法: - 三次样条插值:平滑曲线 - 线性插值:直线连接 - 平均插值:插入平均值 4. 设置插值倍数(如2表示每两个点之间插入1个新点) 5. 可选:勾选"导出插值数据到文件" 6. 查看插值前后对比图 ### 拼接显示(新增) 1. 点击菜单"处理→拼接显示"(Ctrl+Shift+C) 2. 选择要拼接的多个列(至少2列) 3. 设置数据范围 4. 查看拼接后的曲线 ### 数据导出 1. 点击工具栏"导出"按钮或菜单"文件→导出数据"(Ctrl+E) 2. 选择导出格式(CSV、TXT、DAT、XLSX) 3. 配置导出选项:分隔符、精度、是否包含表头 4. 选择导出范围(行、列) 5. 选择保存路径 ## 快捷键 | 快捷键 | 功能 | |--------|------| | Ctrl+I | 导入数据 | | Ctrl+E | 导出数据 | | Ctrl+A | 全选列 | | Delete | 删除选中列 | | Ctrl+Shift+I | 数据插值 | | Ctrl+Shift+C | 拼接显示 | | F1 | 使用说明 | ## 开发调试记录 ### 已解决的问题 #### 1. STFT 显示问题 **问题**:STFT 时频谱图显示异常,坐标轴方向错误 **原因**:numpy 的 STFT 输出维度与显示需求不匹配 **解决方案**: - 使用 `data.T` 转置 - 使用 `np.flipud()` 翻转 - 使用 `np.rot90(data, -1)` 顺时针旋转 #### 2. 2D 曲线显示性能优化 **问题**:大数据量(>10万点)2D曲线显示卡顿 **解决方案**:绑图前手动降采样 ```python if len(x_data) > self.DOWNSAMPLE_THRESHOLD: ds_factor = len(x_data) // 5000 if ds_factor > 1: indices = np.arange(0, len(x_data), ds_factor) plot_x = x_data[indices] plot_y = y_data[indices] ``` #### 3. pyqtgraph 兼容性错误 **问题**:`AttributeError: autoRangeEnabled` **原因**:`setDownsampling()` 和 `setClipToView()` 方法在某些 pyqtgraph 版本中存在兼容性问题 **解决方案**:移除这些方法调用,改用绑图前手动降采样 #### 4. 首次打开 2D 绑图窗口闪烁 **问题**:第一次打开 2D 绑图窗口时主窗口会闪烁 **原因**:全局 OpenGL 设置导致窗口重绘 **解决方案**:移除全局 OpenGL 设置 #### 5. Excel/CSV 导入显示全 0 **问题**:导入 Excel/CSV 文件后数据显示全 0 **解决方案**: - 新增 `ExcelImportWorker` 类,使用 openpyxl 读取 Excel - 将默认分隔符改为"自动检测" #### 6. 3D 坐标轴不显示 **问题**:pyqtgraph OpenGL 3D绑图坐标轴不显示或显示不完整 **解决方案**:改用 matplotlib mplot3d 进行3D绑图,提供完整的坐标轴和刻度标签 #### 7. 线型切换图例重复 **问题**:切换线型时图例重复添加 **解决方案**:在 `set_line_style()` 方法中先清除旧图例,再创建新图例 #### 8. PyInstaller 打包问题 **问题1**:chardet 模块使用 mypyc 编译,PyInstaller 无法正确打包 **解决方案**:移除 chardet 依赖,使用简单的编码检测 **问题2**:matplotlib 需要 PIL 库 **解决方案**:不要排除 PIL/pillow #### 9. EXE 启动速度慢 **问题**:`--onefile` 模式每次启动都要解压文件到临时目录 **解决方案**:改用 `--onedir` 模式,依赖文件放在 exe 同目录,启动更快 ## 与 C++ 版本对比 | 特性 | C++ 版本 | Python 版本 | |------|-----------|-------------| | UI框架 | Qt 6.8.1 (QWidgets) | PyQt6 | | 绑图库 | Qt Charts | pyqtgraph + matplotlib | | 性能 | 较慢 | 更快(大数据降采样) | | 数据结构 | QVector, QMap | numpy array | | 文件处理 | QFile | Python 标准文件操作 | | 编译 | qmake + mingw32-make | 不适用 | | 部署 | 需打包 Qt DLL | PyInstaller 打包 | ## 许可证 MIT License