- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经在 javascript 中使用 d3.js 实现了一个网络,我想根据收到的 json 将链接的颜色从灰色更改为红色。 JSON 显示将连接的源节点和目标节点。节点架构的架构如下:
现在,当收到 JSON 时,我解析数据并使用以下代码附加一条连接源和目标节点到红色的新行:
svg.selectAll()
.data(data.links)
.enter()
.append("line")
.attr("x1", function(d) { return nodes[source].x; })
.attr("y1", function(d) { return nodes[source].y; })
.attr("x2", function(d) { return nodes[target].x; })
.attr("y2", function(d) { return nodes[target].y; })
.attr("stroke","#b72b34")
.attr("stroke-width", 2)
然后,2 秒后,我使用相同的代码再次将线条的颜色更改为灰色。还有其他更简单的方法吗?
如您所见,用户能够看到过去添加的行,尽管这不是想要的图像。我只想更改现有链接的颜色(如模式 1 所示)。
提前谢谢你。
我的代码:
var nodes = [
{ x: width/2, y: height/4, id: 0, url: "http://icons.iconarchive.com/icons/icons-land/vista-hardware-devices/128/Computer-icon.png"},
{ x: 60, y: height-150, id: 1, url: "http://icons.iconarchive.com/icons/icons-land/vista-hardware-devices/128/Computer-icon.png"},
{ x: width-100, y: height-150, id: 2, url: "http://icons.iconarchive.com/icons/icons-land/vista-hardware-devices/128/Computer-icon.png"},
{ x: 60, y: height-50, id: 3, url: "http://icons.iconarchive.com/icons/icons-land/vista-hardware-devices/128/Computer-icon.png"},
{ x: width-100, y: height-50, id: 4, url: "http://icons.iconarchive.com/icons/icons-land/vista-hardware-devices/128/Inkjet-Printer-icon.png"}
];
var links = [
{ source: 1, target: 2 },
{ source: 1, target: 3 },
{ source: 1, target: 4 },
{ source: 1, target: 0 },
{ source: 2, target: 3 },
{ source: 2, target: 1 },
{ source: 2, target: 4 },
{ source: 2, target: 0 },
{ source: 3, target: 4 },
{ source: 3, target: 1 },
{ source: 3, target: 2 },
{ source: 3, target: 0 },
{ source: 4, target: 1 },
{ source: 4, target: 2 },
{ source: 4, target: 3 },
{ source: 4, target: 0 },
{ source: 0, target: 1 },
{ source: 0, target: 2 },
{ source: 0, target: 3 },
{ source: 0, target: 4 },
];
svg.selectAll()
.data(links)
.enter()
.append("line")
.attr("x1", function(d) { return nodes[d.source].x; })
.attr("y1", function(d) { return nodes[d.source].y; })
.attr("x2", function(d) { return nodes[d.target].x; })
.attr("y2", function(d) { return nodes[d.target].y; })
.attr("stroke-width", function (d) { return Math.sqrt(d.value); })
.attr("stroke","#f6f6f6")
svg.selectAll()
.data(nodes)
.enter()
.append("image")
.attr("x", function(d) { return d.x - 30/2; })
.attr("y", function(d) { return d.y - 30/2; })
.attr("width", 45)
.attr("height", 45)
.attr("xlink:href",function(d) { return d.url; })
setInterval(function(test){
var url = "http://..."
d3.json(url, function(error, data) {
for (var i = 0; i < data.links.length; i++) {
source = findNode(data.links[i].source);
target = findNode(data.links[i].target);
svg.selectAll()
.data(data.links)
.enter()
.append("line")
.attr("x1", function(d) { return nodes[source].x; })
.attr("y1", function(d) { return nodes[source].y; })
.attr("x2", function(d) { return nodes[target].x; })
.attr("y2", function(d) { return nodes[target].y; })
.attr("stroke","#b72b34")
.attr("stroke-width", function (d) { return Math.sqrt(d.value);
})
;
}
});
}, 5000);
最佳答案
您目前每次更新图表时都在追加新行:
svg.selectAll()
.data(data.links)
.enter()
.append("line")
svg.selectAll()
是一个空选择,与svg.selectAll(null)
相同。因此,在 DOM 中为数据数组中的每个项目创建了一个项目,这些项目曾经更新过。这会在一段时间后减慢速度。
我们可以使用 svg.selectAll("circle")
选择圆圈以更新(或退出/输入旧/新行)但新数据数组将按顺序分配给现有行他们的索引,不是数据对。我们可以使用 .selectAll().data()
( the second argument for .data()
) 为每个元素设置一个键,但这必须是一个字符串。
与其使用键,我建议使用我们可以给每一行一个 id(当最初附加行时)代表它的源和目标:
.attr("id", function(d) { return "link-"+d.source+"-"+d.target; })
然后,当我们处理 json 数据以更新图形时,我们会选择适当的行。选择后,我们应用样式。使用转换延迟,我们可以确保在两秒后完成转换回正常:
newData.links.forEach(function(d) {
d3.select("#link-"+d.source+"-"+d.target)
.attr("stroke","red")
.transition()
.delay(1500)
.duration(500)
.attr("stroke","#f6f6f6")
})
这部分代码适合您的超时函数:
var width = 600;
var height = 400;
var svg = d3.select("body").append("svg")
.attr("width",width)
.attr("height",height);
var nodes = [
{ x: width/2, y: height/4, id: 0, url: "http://icons.iconarchive.com/icons/icons-land/vista-hardware-devices/128/Computer-icon.png"},
{ x: 60, y: height-150, id: 1, url: "http://icons.iconarchive.com/icons/icons-land/vista-hardware-devices/128/Computer-icon.png"},
{ x: width-100, y: height-150, id: 2, url: "http://icons.iconarchive.com/icons/icons-land/vista-hardware-devices/128/Computer-icon.png"},
{ x: 60, y: height-50, id: 3, url: "http://icons.iconarchive.com/icons/icons-land/vista-hardware-devices/128/Computer-icon.png"},
{ x: width-100, y: height-50, id: 4, url: "http://icons.iconarchive.com/icons/icons-land/vista-hardware-devices/128/Inkjet-Printer-icon.png"}
];
var links = [
{ source: 1, target: 2 },
{ source: 1, target: 3 },
{ source: 1, target: 4 },
{ source: 1, target: 0 },
{ source: 2, target: 3 },
{ source: 2, target: 1 },
{ source: 2, target: 4 },
{ source: 2, target: 0 },
{ source: 3, target: 4 },
{ source: 3, target: 1 },
{ source: 3, target: 2 },
{ source: 3, target: 0 },
{ source: 4, target: 1 },
{ source: 4, target: 2 },
{ source: 4, target: 3 },
{ source: 4, target: 0 },
{ source: 0, target: 1 },
{ source: 0, target: 2 },
{ source: 0, target: 3 },
{ source: 0, target: 4 },
];
svg.selectAll()
.data(links)
.enter()
.append("line")
.attr("x1", function(d) { return nodes[d.source].x; })
.attr("y1", function(d) { return nodes[d.source].y; })
.attr("x2", function(d) { return nodes[d.target].x; })
.attr("y2", function(d) { return nodes[d.target].y; })
.attr("stroke-width", function (d) { return Math.sqrt(d.value); })
.attr("id", function(d) { return "link-"+d.source+"-"+d.target; })
.attr("stroke","#f6f6f6")
svg.selectAll()
.data(nodes)
.enter()
.append("image")
.attr("x", function(d) { return d.x - 45/2; })
.attr("y", function(d) { return d.y - 45/2; })
.attr("width", 45)
.attr("height", 45)
.attr("xlink:href",function(d) { return d.url; })
setInterval(function(){
// randomly links instead of calling external file:
var data = links.filter(function(d) { if (Math.random() < 0.5) return d; })
data.forEach(function(d) {
d3.select("#link-"+d.source+"-"+d.target)
.attr("stroke","red")
.transition()
.delay(1500)
.duration(500)
.attr("stroke","#f6f6f6")
})
}, 3000); // sped up for demonstration
<script src="https://d3js.org/d3.v3.min.js"></script>
为了进行比较,这里提供了一个键作为替代方法提供给 .data()。对于它,我们将目标和源转换为字符串,就像我们对 id 所做的那样,但将其作为 .data() 中的键应用。这允许我们跳过 for each 循环。这是一种更规范的 d3 方法:
var width = 600;
var height = 400;
var svg = d3.select("body").append("svg")
.attr("width",width)
.attr("height",height);
var nodes = [
{ x: width/2, y: height/4, id: 0, url: "http://icons.iconarchive.com/icons/icons-land/vista-hardware-devices/128/Computer-icon.png"},
{ x: 60, y: height-150, id: 1, url: "http://icons.iconarchive.com/icons/icons-land/vista-hardware-devices/128/Computer-icon.png"},
{ x: width-100, y: height-150, id: 2, url: "http://icons.iconarchive.com/icons/icons-land/vista-hardware-devices/128/Computer-icon.png"},
{ x: 60, y: height-50, id: 3, url: "http://icons.iconarchive.com/icons/icons-land/vista-hardware-devices/128/Computer-icon.png"},
{ x: width-100, y: height-50, id: 4, url: "http://icons.iconarchive.com/icons/icons-land/vista-hardware-devices/128/Inkjet-Printer-icon.png"}
];
var links = [
{ source: 1, target: 2 },
{ source: 1, target: 3 },
{ source: 1, target: 4 },
{ source: 1, target: 0 },
{ source: 2, target: 3 },
{ source: 2, target: 1 },
{ source: 2, target: 4 },
{ source: 2, target: 0 },
{ source: 3, target: 4 },
{ source: 3, target: 1 },
{ source: 3, target: 2 },
{ source: 3, target: 0 },
{ source: 4, target: 1 },
{ source: 4, target: 2 },
{ source: 4, target: 3 },
{ source: 4, target: 0 },
{ source: 0, target: 1 },
{ source: 0, target: 2 },
{ source: 0, target: 3 },
{ source: 0, target: 4 },
];
svg.selectAll()
.data(links, function(d) { return d.source+"-"+d.target })
.enter()
.append("line")
.attr("x1", function(d) { return nodes[d.source].x; })
.attr("y1", function(d) { return nodes[d.source].y; })
.attr("x2", function(d) { return nodes[d.target].x; })
.attr("y2", function(d) { return nodes[d.target].y; })
.attr("stroke-width", function (d) { return Math.sqrt(d.value); })
.attr("stroke","#f6f6f6")
svg.selectAll()
.data(nodes)
.enter()
.append("image")
.attr("x", function(d) { return d.x - 45/2; })
.attr("y", function(d) { return d.y - 45/2; })
.attr("width", 45)
.attr("height", 45)
.attr("xlink:href",function(d) { return d.url; })
setInterval(function(){
// randomly links instead of calling external file:
var data = links.filter(function(d) { if (Math.random() < 0.5) return d; })
d3.selectAll("line")
.data(data, function(d) { return d.source+"-"+d.target; })
.attr("stroke","red")
.transition()
.delay(1500)
.duration(500)
.attr("stroke","#f6f6f6")
}, 3000); // sped up for demonstration
<script src="https://d3js.org/d3.v3.min.js"></script>
关于javascript - 在 d3.js 中更改某行的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51269251/
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我试图用这种形式简单地获取数字 28 integer+space+integer+integer+space+integer我试过这个正则表达式 \\s\\d\\d\\s 但我得到了两个数字11 和
最近一直在学习D语言。我一直对运行时感到困惑。 从我能收集到的关于它的信息中,(这不是很多)我知道它是一种有助于 D 的一些特性的运行时。像垃圾收集一样,它与您自己的程序一起运行。但是既然 D 是编译
想问一下这两个正则表达式有区别吗? \d\d\d 与 \d{3} 我已经在我的本地机器上使用 Java 和 Windows 操作系统对此进行了测试,两者都工作正常并且结果相同。但是,当在 linux
我正在学习 Go,而且我坚持使用 Go 之旅(exercise-stringer.go:https://tour.golang.org/methods/7)。 这是一些代码: type IPAddr
我在Java正则表达式中发现了一段令我困惑的代码: Pattern.compile( "J.*\\d[0-35-9]-\\d\\d-\\d\\d" ); 要编译的字符串是: String string
我在 ruby 代码上偶然发现了这个。我知道\d{4})\/(\d\d)\/(\d\d)\/(.*)/是什么意思,但是\1-\2-\3-\4 是什么意思? 最佳答案 \1-\2-\3-\4 是 b
我一直在努力解决这个问题,这让我很恼火。我了解 D 运行时库。它是什么,它做什么。我也明白你可以在没有它的情况下编译 D 应用程序。就像 XoMB 所做的那样。好吧,XoMB 定义了自己的运行时,但是
我有两个列表列表,子列表代表路径。我想找到所有路径。 List> pathList1 List> pathList2 当然是天真的解决方案: List> result = new ArrayList>
我需要使用 Regex 格式化一个字符串,该字符串包含数字、字母 a-z 和 A-Z,同时还包含破折号和空格。 从用户输入我有02-219 8 53 24 输出应该是022 198 53 24 我正在
目标是达到与this C++ example相同的效果: 避免创建临时文件。我曾尝试将 C++ 示例翻译为 D,但没有成功。我也尝试过不同的方法。 import std.datetime : benc
tl;dr:你好吗perfect forwarding在 D? 该链接有一个很好的解释,但例如,假设我有这个方法: void foo(T)(in int a, out int b, ref int c
有什么方法可以在 D 中使用abstract auto 函数吗? 如果我声明一个类如下: class MyClass { abstract auto foo(); } 我收到以下错误: mai
有没有人为内存中重叠的数组切片实现交集?算法在没有重叠时返回 []。 当 pretty-print (使用重叠缩进)内存中重叠的数组切片时,我想要这个。 最佳答案 如果您确定它们是数组,那么只需取 p
我已经开始学习 D,但我在使用 Andrei Alexandrescu 所著的 The D Programming Language 一书中提供的示例时遇到了一些麻烦。由于 int 和 ulong 类
如何创建一个不可变的类? 我的目标是创建一个实例始终不可变的类。现在我只是用不可变的方法和构造函数创建了一个“可变”类。我将其称为 mData,m 表示可变。然后我创建一个别名 alias immut
不久前我买了《The D Programming Language》。好书,很有教育意义。但是,我在尝试编译书中列出的语言功能时遇到了麻烦:扩展函数。 在这本书中,Andrei 写了任何可以像这样调用
我在 D http://www.digitalmars.com/d/2.0/lazy-evaluation.html 中找到了函数参数的惰性求值示例 我想知道如何在 D 中实现可能的无限数据结构,就像
这个问题在这里已经有了答案: 12 年前关闭。 Possible Duplicate: Could anyone explain these undefined behaviors (i = i++
当前是否可以跨模块扫描/查询/迭代具有某些属性的所有函数(或类)? 例如: source/packageA/something.d: @sillyWalk(10) void doSomething()
我是一名优秀的程序员,十分优秀!