精选案例 · Agent / 实践案例
用 AI 辅助编写 dataviewer 数据可视化系统的经历
这个案例围绕「用 AI 辅助编写 dataviewer 数据可视化系统的经历」记录了一条真实 AI 实践线索,正文重点集中在「项目概述」「项目背景」,适合先按任务意图阅读再判断复用。
案例速读
README 标题「用 AI 辅助编写 dataviewer 数据可视化系统的经历」下已经出现运行/配置路径、脚本或接口线索、结果证据,正文重点集中在「项目概述」「项目背景」,比纯概念介绍更适合进入精选阅读流。 这篇案例的阅读价值在于,它把真实任务、模型辅助过程和可迁移做法放在同一个上下文里,读者可以从 「用 AI 辅助编写 dataviewer 数据可视化系统的经历」、「项目概述」、「项目背景」、「AI 辅助的开发过程」 进入正文。
- 建议重点看 可参考其中的运行与配置路径、包含可迁移的命令、脚本或接口线索、已有结果或观测证据可用于判断复用价值。结合 Agent / 实践案例 和「任务驱动用户、AI 实践者」这一受众定位,它更适合作为任务检索后的精读材料,而不是只看一句短摘要后快速跳过。
- 正文目录和原始材料仍然是判断依据;导读只帮助你更快定位阅读重点。
- 看点
- 用 AI 辅助编写 dataviewer 数据可视化系统的经历
- 读者
- 任务驱动用户、AI 实践者
- 复用
- 可参考其中的运行与配置路径
- 结构
- 12 个目录入口
原文内容
用 AI 辅助编写 dataviewer 数据可视化系统的经历
项目概述
我使用 opencode(基于 Google Gemini 的 AI 编程助手)完成了一个 MATLAB 到 Python 的数据可视化工具迁移项目。
项目背景
原始项目 dataviewer.py 是一个 1526 行的 MATLAB GUI 程序的 Python 重写(基于 PySide6 + Matplotlib),用于科学实验数据的可视化展示,支持 .dat、.txt、.hdf5 等多种数据格式。
AI 辅助的开发过程
1. 代码重构(单文件 → 模块化包)
挑战:单文件几千行,结构混乱,难以维护。
AI 做了什么:
- 分析 1526 行代码的依赖关系
- 规划合理的目录结构:
dataviewer.dataview_app包 - 拆分为 8 个模块:
models.py、io.py、plotting.py、ui.py、core.py、config.py、_bootstrap.py - 保持所有功能完整,无回归
学到的知识点:
- Python 包结构设计原则(职责分离、依赖倒置)
sys.path、相对导入、__main__.py入口模式- 模块间如何通过数据对象(DataSet、Pool、AppState)松散耦合
2. HDF5 数据加载器修复
挑战:HDF5 二维网格数据(13×51)被错误地展平,导致坐标轴识别失败。
AI 做了什么:
- 分析 HDF5 文件结构:
field(51,)、R_P4(13,)、Amp(13,51)、Phase(13,51) - 发现
load_hdf5_dataset未正确处理 2D 网格 → 点云转换 - 编写
_load_hdf5_axis_coords自动从 1D 数据集发现坐标轴 - 实现
n_bins_coeff参数化控制分箱策略
学到的知识点:
- HDF5 文件组织和数据集布局
RegularGridInterpolatorvsgriddata插值策略- NumPy 分箱:
np.digitize、np.bincount - 数据可视化中的坐标映射原理
3. 鼠标交互功能开发
挑战:MATLAB 的切片/选区/右键菜单功能需要完整移植到 PySide6。
AI 做了什么:
- 实现 7 种鼠标交互:左键拖拽切片、中键选区、右键菜单、Shift/Control 快捷键
on_mouse_press/on_mouse_move/on_mouse_release三事件联动- 实现
PickUpLine功能(沿拖拽线插值 Z 值并绘制 X-Z/Y-Z 剖面图) - 修复
event.button条件判断(中键 button==2) - 修复
RegularGridInterpolator输入格式 bug(标量 → 数组)
学到的知识点:
- Matplotlib 的
mpl_connect事件系统 Rectanglepatch 的 bounds 实时更新Line2D.set_data接受两个坐标列表 (xs, ys)RegularGridInterpolator要求输入为 (N, ndim) 格式
4. 去倾斜背景校正算法
挑战:将 MATLAB remove_tilted_background.m 移植为 Python 并可配置。
AI 做了什么:
- 完整移植三步算法:投影→分箱→平均→重建背景→data / background
- 实现多阶段粗到细角度优化(4 阶段,step_sizes: 5°→0.5°→0.05°→0.005°)
- R² 拟合优度评估
- 创建可配置对话框(搜索阶段数、初始步长、Bins 系数)
- 创建
backend_remove.py,返回(corrected, theta, R²)三元组
遇到的 Bug 及修复:
radio_auto_toggled→ 应为on_auto_toggled(变量名拼写错误)- 向量化赋值语法错误(连续 walrus 运算符)
data.ravel传入_compute_background需要 2D 数组
学到的知识点:
- 条纹背景去除的投影-分箱平均算法原理
- 多分辨率搜索(Coarse-to-Fine)策略
np.meshgrid、投影方向向量化计算- Qt 对话框中
QFormLayout+QGroupBox参数化配置
5. UI/UX 优化
挑战:Qt 标签页、Matplotlib 子图、颜色条之间的布局冲突。
AI 做了什么:
Axes.setVisible→Axes.set_visible(Matplotlib vs Qt 命名差异)- Colorbar 从右侧垂直改为上方水平,避免与 Y 轴标签重叠
- 调整
subplots_adjust(bottom=0.15, right=0.75, left=0.12) - 增大
grid_spec间距:hspace=0.45,wspace=0.20 - 画布尺寸从 6×5 增大到 10×8 英寸
- 布局比例从 1:1 改为 0:4(左侧面板窄,右侧绘图区宽)
学到的知识点:
- Matplotlib 标签页位置 API:
set_label_position、tick_left subplots_adjust边距参数含义add_gridspec的hspace、wspace、height_ratios组合
提交记录
在 review-baseline 分支上共 16 次提交:
- LineSet 列选择器
- 配置持久化 (.zfg 文件)
- 右键菜单 + 快捷键
- HDF5 标量数据处理 + QKeyEvent 兼容
- 代码重构(1526 行 → 8 个模块)
- 修复 DataSet 被 ndarray 替换 Bug
- HDF5 2D 网格自动展平 + 坐标轴发现
- 直线拖动修复 + 插值器输入格式修复
- PickUpLine 剖面图功能
- 实时切片预览 + 中键选区 + 导入自动识别 XY
Axes.set_visible命名修复- Colorbar 右侧/Y 轴左侧 + 去倾斜本底功能
- 去倾斜本底对 2D 网格操作 + 对话框
- 参数化背景移除 + 配置对话框 + 返回三元组
- X 轴标签裁剪修复
- 增大绘图区占比 + 调整间距
关键技术栈
- Python 3.12 / PySide6 (Qt for Python)
- Matplotlib 3.5+ (数据可视化)
- NumPy / SciPy (数值计算 + 插值)
- HDF5/h5py (二进制数据存储)
- Git (版本管理)
总结
通过这个项目,我系统地学习了:
- 工程化重构:从单文件到模块化包的设计模式
- 科学数据可视化:Contour Plot、Colormap、数据坐标映射
- GUI 编程:PySide6 事件系统、Qt 对话框、信号槽机制
- 算法移植:MATLAB 到 Python 的等价实现
- 调试能力:通过错误栈定位问题(
Set_data参数格式、RegularGridInterpolator输入格式等)