javascript - 为每第 n 个数据元素 d3.js 添加一个圆圈
问题描述
我正在 d3.js 中创建一个分组折线图。我想为数据添加带有工具提示的圆圈。但是,对每个点都这样做变得太拥挤了。因此,我想在线上每隔三个数据点添加一个圆圈。
我尝试使用以下代码执行此操作:
svg2.selectAll("dot")
.data(data)
.enter().append("circle")
.attr("r", 10)
.attr('fill', "red")
.attr("cx", function (d,i) {
if (i%3 === 0 && i>0) {
return xAxisScale(d.date);
}
else {
return null;
}
})
.attr("cy", function (d,i) {
if (i%3 === 0 && i >0 ) {
return yAxisScale(d.count);
}
else {
return null;
}
})
但是,由于某种原因,似乎有一个无关紧要的地方。
我不确定为什么会发生这种情况或如何摆脱这种情况。任何帮助将不胜感激!
解决方案
您正在为每个数据点添加一个圆圈,仅定位每三个数据点。使用时已经添加了圆圈.attr("cx"
,该enter().append()
部分已经附加了圆圈。因此,当您使用 i 来定位每三个圆圈时,每隔一个圆圈都被赋予 null 作为 cx 和 cy 属性,所以这个任性的圆圈实际上是许多圆圈相互重叠。
相反,过滤您的数据数组:您有一个空选择(selectAll('dot')
不应该选择任何元素,因此输入选择将为数据数组中的每个项目创建一个元素)。这样我们只会为我们想要的数据点创建圆圈:
svg2.selectAll("dot")
.data(data.filter(function(d,i) { return i%3 == 0})
.enter().append("circle")
.attr("r", 10)
.attr('fill', "red")
.attr("cx", function (d,i) {
return xAxisScale(d.date);
})
.attr("cy", function (d,i) {
return yAxisScale(d.count);
})
通过过滤数据,我们只选择了我们想要的圆圈。
推荐阅读
- javascript - 如何将字符串与 json 文件中的数据进行比较?
- python - 不显示自适应卡微软团队机器人
- python - 如何通过扩充来平衡文件夹中的图像,使该文件夹中的图像数量等于其他文件夹中的图像数量?
- reactjs - 如何将第三方模块声明为全局模块,这样我就不需要导入了?(带有 typescript 的 Webpack5)
- azure - 用于停止实例并重新启动它的 Azure Go SDK
- visual-studio - 检查共享数据源时拒绝访问
- javascript - 具有不同标头的图像请求
- css - CSS Animation Jump Issue on Mobile
- python - VS Code 未运行 Python 程序,并且在终端上显示 Powershell 广告,并且终端未显示路径
- python - 如何将更多参数传递给 Pyside2 中的信号?