d3.js - 每次使用 d3 selection.join 创建一个新行
问题描述
在selection.join的 d3 示例中,似乎假设您已经有了操作路径:
svg.selectAll("path")
.data([dataset])
.join(
enter => enter.append("path").attr("class", "line"),
update => update,
exit => exit.remove()
)
.attr("d", line);
但是,我想创建一个可重用的类组件,每次为该特定数据创建一个新行。它不应干扰整个图中可能存在或不存在的其他路径。
const lineGenerator = d3
.line<DataPoint>()
.y((d) => yScale(d.value))
.x((d) => xScale(d.date));
mainSvg.selectAll('path')
.data([data])
.join(
enter =>
enter
.append('path')
.attr('class', 'line')
.attr('stroke', 'black'),
).attr('d', lineGenerator)
我现在看到在某处已经有路径的图表中发生的是,该事件被这条新线替换。您通常如何在 d3 中解决这个问题?
解决方案
找到了可能的解决方案。不确定这是否是要走的路:
const lineGenerator = d3
.line<DataPoint>()
.y((d) => yScale(d.value))
.x((d) => xScale(d.date));
mainSvg.selectAll('#my-unique-id')
.data([data])
.join(
enter =>
enter
.append('path')
.attr('id', 'my-unique-id')
.attr('stroke', 'black'),
).attr('d', lineGenerator)
看起来您可以选择不存在的东西。如果 d3 找不到该事件,它将创建该实例。
为新路径使用唯一 ID,您可以确保仅重绘您想要定位的出现。
我不确定这种方法是否有任何警告,所以任何提示都值得赞赏。
推荐阅读
- java - 我无法使用 Java Spring Boot 和 Angular 7 在远程服务器 (Apache2) 上上传文件。它在 localhost 上运行良好
- python-3.x - 构造函数中的默认参数神奇地变成了类变量
- sql-server - 如何区分创建的文件表中的键
- c++ - 在链接时插入字符串
- vue.js - 如何在 vuex 存储中使用 JSON 数据(无 webpack)
- three.js - 如何仅突出显示整个对象的一个特定部分并使其可点击?
- android - 当 NavHostFragment 的容器消失后,back-stack 为空
- ionic-framework - 错误:找不到模块“@ionic/angular”
- python-3.x - 我是一个初学者,我想在我的计算器程序中添加一个循环,这样我就不需要一次又一次地运行它。我能做些什么?
- javascript - Forge Viewer:同时显示底部工具栏和标记