Skip to content

关系图面板

GraphPreview
ANZASBFoodSaveRent

账户与分类之间资金流向的力导向图可视化。节点代表账户和支出类别;边代表它们之间的交易流。

图表类型

属性
Apache ECharts(原始 echarts.init()
系列类型graphlayout: 'force'
渲染Canvas,直接初始化(非 BaseChart)
调整大小处理容器上的手动 ResizeObserver
源文件src/components/panels/GraphPanel.tsx

面板有意绕过 BaseChart,以避免力布局的重新挂载问题。在容器 div 上进行原始 echarts.init() 调用,并配有专用的 ResizeObserver 实现响应式调整。

显示内容

  • 节点 —— 银行账户和支出类别,按交易量确定大小
  • —— 账户和类别之间的交易流,宽度按流量金额缩放
  • 邻接高亮 —— 悬停节点时以该节点颜色高亮其连接的边

节点着色

账户类型颜色
CHECKING(活期)强调色 (#00d4aa)
SAVINGS(储蓄)强调色 (#00d4aa)
CREDIT(信用)危险色(红色)
INVESTMENT(投资)警告色(琥珀色)
类别来自 CATEGORY_COLORS 的每类别颜色

当节点名称匹配组的搜索查询时,自定义颜色组会覆盖默认值。

交互操作

全画布平移和缩放

ECharts 内置的 roam 被禁用。取而代之的是自定义鼠标处理器提供无界导航:

  • 拖拽平移 —— 在画布任意位置点击拖拽来平移
  • 滚轮缩放 —— 向鼠标光标位置缩放(范围:0.1x 到 15x)
  • 适应边界 —— 初始加载时自动适应图形;通过标题按钮重新居中

手动邻接高亮

内置的 focus: 'adjacency' 强调被手动实现补充,该实现:

  1. 在每次选项更新时构建节点到边索引的邻接映射
  2. mouseover 时,对悬停的节点、其邻居和连接的边分发高亮操作
  3. 将边的描边颜色覆盖为悬停节点的颜色
  4. mouseout 时,分发 downplay 并强制 zrender 刷新

节点拖拽

单个节点在力布局中可拖拽(draggable: true)。力模拟以 animation: false 运行实现即时布局。

设置侧边栏

220px 可折叠侧边栏(通过标题中的齿轮图标切换),包含 5 个区域:

1. 过滤器

控件描述
文本过滤按名称子串匹配过滤节点
账户切换显示/隐藏账户节点
类别切换显示/隐藏类别节点
孤立节点切换显示/隐藏无连接的节点

2. 分组

控件选项
分组模式按类型、按银行、按类别类型、无
颜色分组自定义搜索查询到颜色的映射,支持添加/移除

3. 显示

控件范围
标签开/关
箭头开/关(边箭头符号)
节点大小5 -- 80
连线粗细1 -- 10
标签大小6 -- 18
标签透明度0% -- 100%
节点透明度0.1 -- 1.0
连线样式直线、曲线、虚线
节点形状圆形、方形、圆角方形、菱形

4. 力

控件范围
中心力(引力)0 -- 0.5
排斥力5 -- 500
连线距离最小值1 -- 200
连线距离最大值5 -- 400
摩擦力0 -- 1

5. 恢复默认

通过 useGraphStore.resetToDefaults() 将所有设置重置为初始值。

数据来源

状态管理字段
useFinanceStoreaccounts, transactions, categories
useGraphStore所有布局/显示/力设置, settingsOpen
useChartTheme提示框、标签、边框的主题颜色

空状态

transactions.length === 0 时,在面板中居中显示"无交易数据"。