我正在尝试使用 D3.js 实现一种类似“仪表图”(或环形图)的效果,用于展示一组数据,该数据表示网络设备的不同状态及其对应数量:
{
"Operational": 1,
"Warning": 4,
"Offline": 2,
// ...
}
请注意,这个数据集可能会随时间变化:可能出现其他状态,某些状态可能被移除,或者数量数字也可能发生变化。
我已经实现了相关的逻辑,但在处理某些特定数据集时,有时会破坏根 SVG 元素的结构。
复现步骤
要复现这个问题,请打开这个 JSFiddle 示例。如你所见,初始状态下一切正常,每个 <path>
都在其父级 <g>
元素内。
正确示例代码片段:
<svg width="400" height="200" viewBox="-200,-150,400,200" style="display: block; max-width: 100%; height: auto; margin: 0 auto;">
<g>
<path d="M-98.99819570566463,-0.5977014496607642A99,99,0,0,1,-80.2110753965349,-58.02743647389048L-54.39727983232389,-39.11439564717636A67,67,0,0,0,-66.99733392439637,-0.5977014496607781Z" fill="green"></path>
</g>
<!-- 更多 g 和 path 元素... -->
</svg>
正确布局的截图可见:JSFiddle - 正确示例
然而,当你点击“Use 2nd dataset”按钮切换到第二个数据集时,发现其中两个 <path>
被放在同一个 <g>
内,而另一个 <g>
却为空:
错误布局代码片段:
<svg width="400" height="200" viewBox="-200,-150,400,200" style="display: block; max-width: 100%; height: auto; margin: 0 auto;">
<g>
<!-- 两个 path 在同一个 g 内 -->
</g>
<g>
<!-- 空的 g 元素 -->
</g>
<g>
<path>...</path>
</g>
</svg>
错误布局的截图可见:JSFiddle - 错误布局
尽管视觉效果上似乎仍可接受,但是这种不正确的结构在数据再次改变时会导致逻辑出现问题。
问题
我想问的是:我在哪里做错了?我猜测问题可能出在 数据连接的 key 函数 上,但我未能理解根本原因。
演示环境
请查看我的 JSFiddle 示例。