返回案例库

精选案例 · 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.pyio.pyplotting.pyui.pycore.pyconfig.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 文件组织和数据集布局
  • RegularGridInterpolator vs griddata 插值策略
  • NumPy 分箱:np.digitizenp.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 事件系统
  • Rectangle patch 的 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 及修复

  1. radio_auto_toggled → 应为 on_auto_toggled(变量名拼写错误)
  2. 向量化赋值语法错误(连续 walrus 运算符)
  3. data.ravel 传入 _compute_background 需要 2D 数组

学到的知识点

  • 条纹背景去除的投影-分箱平均算法原理
  • 多分辨率搜索(Coarse-to-Fine)策略
  • np.meshgrid、投影方向向量化计算
  • Qt 对话框中 QFormLayout + QGroupBox 参数化配置

5. UI/UX 优化

挑战:Qt 标签页、Matplotlib 子图、颜色条之间的布局冲突。

AI 做了什么

  • Axes.setVisibleAxes.set_visible(Matplotlib vs Qt 命名差异)
  • Colorbar 从右侧垂直改为上方水平,避免与 Y 轴标签重叠
  • 调整 subplots_adjust(bottom=0.15, right=0.75, left=0.12)
  • 增大 grid_spec 间距:hspace=0.45wspace=0.20
  • 画布尺寸从 6×5 增大到 10×8 英寸
  • 布局比例从 1:1 改为 0:4(左侧面板窄,右侧绘图区宽)

学到的知识点

  • Matplotlib 标签页位置 API:set_label_positiontick_left
  • subplots_adjust 边距参数含义
  • add_gridspechspacewspaceheight_ratios 组合

提交记录

review-baseline 分支上共 16 次提交:

  1. LineSet 列选择器
  2. 配置持久化 (.zfg 文件)
  3. 右键菜单 + 快捷键
  4. HDF5 标量数据处理 + QKeyEvent 兼容
  5. 代码重构(1526 行 → 8 个模块)
  6. 修复 DataSet 被 ndarray 替换 Bug
  7. HDF5 2D 网格自动展平 + 坐标轴发现
  8. 直线拖动修复 + 插值器输入格式修复
  9. PickUpLine 剖面图功能
  10. 实时切片预览 + 中键选区 + 导入自动识别 XY
  11. Axes.set_visible 命名修复
  12. Colorbar 右侧/Y 轴左侧 + 去倾斜本底功能
  13. 去倾斜本底对 2D 网格操作 + 对话框
  14. 参数化背景移除 + 配置对话框 + 返回三元组
  15. X 轴标签裁剪修复
  16. 增大绘图区占比 + 调整间距

关键技术栈

  • Python 3.12 / PySide6 (Qt for Python)
  • Matplotlib 3.5+ (数据可视化)
  • NumPy / SciPy (数值计算 + 插值)
  • HDF5/h5py (二进制数据存储)
  • Git (版本管理)

总结

通过这个项目,我系统地学习了:

  1. 工程化重构:从单文件到模块化包的设计模式
  2. 科学数据可视化:Contour Plot、Colormap、数据坐标映射
  3. GUI 编程:PySide6 事件系统、Qt 对话框、信号槽机制
  4. 算法移植:MATLAB 到 Python 的等价实现
  5. 调试能力:通过错误栈定位问题(Set_data 参数格式、RegularGridInterpolator 输入格式等)

返回顶部