- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 d3 sankey plugin 创建桑基图具有动态运输数据。它在大多数情况下都工作得很好,除非我得到这样的数据集:
[{"DeparturePort":"CHARLESTON","ArrivalPort":"BREMERHAVEN","volume":5625.74},{"DeparturePort":"CHARLESTON","ArrivalPort":"ITAPOA","volume":2340},{"DeparturePort":"PT EVERGLADES","ArrivalPort":"PT AU PRINCE","volume":41.02},{"DeparturePort":"BREMERHAVEN","ArrivalPort":"CHARLESTON","volume":28}]
我的问题的关键是数据集中的第一个和最后一个条目。似乎在同一个桑基图中具有相反的方向会使 JavaScript 进入无限循环并杀死浏览器。关于如何防止这种情况发生有什么想法吗?
这是我的图表代码,其中 raw 是上面的对象:
var data = raw;
var units = "Volume";
var margin = { top: 100, right: 0, bottom: 30, left: 0 },
width = $("#"+divID).width() - margin.left - margin.right,
height = divID == "enlargeChart" ? 800 - margin.top - margin.bottom : 600 - margin.top - margin.bottom;
var formatNumber = d3.format(",.0f"), // zero decimal places
format = function (d) { return ""; },
color = d3.scale.ordinal()
.range(["#0077c0", "#FF6600"]);
// append the svg canvas to the page
var svg = d3.select("#"+divID).append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.style("font-size", "12px")
.append("g")
.attr("transform",
"translate(" + margin.left + "," + margin.top + ")");
// Set the sankey diagram properties
var sankey = d3.sankey(width)
.nodeWidth(10)
.nodePadding(10)
.size([width, height]);
var path = sankey.link();
// load the data (using the timelyportfolio csv method)
//d3.csv("sankey.csv", function (error, data) {
//set up graph in same style as original example but empty
graph = { "nodes": [], "links": [] };
var checklist = [];
data.forEach(function (d) {
if ($.inArray(d.DeparturePort, checklist) == -1) {
checklist.push(d.DeparturePort)
graph.nodes.push({ "name": d.DeparturePort });
}
if ($.inArray(d.ArrivalPort, checklist) == -1) {
checklist.push(d.ArrivalPort)
graph.nodes.push({ "name": d.ArrivalPort });
}
graph.links.push({
"source": d.DeparturePort,
"target": d.ArrivalPort,
"value": +d.volume
});
});
// return only the distinct / unique nodes
graph.nodes = d3.keys(d3.nest()
.key(function (d) { return d.name; })
.map(graph.nodes));
// loop through each link replacing the text with its index from node
graph.links.forEach(function (d, i) {
graph.links[i].source = graph.nodes.indexOf(graph.links[i].source);
graph.links[i].target = graph.nodes.indexOf(graph.links[i].target);
});
//now loop through each nodes to make nodes an array of objects
// rather than an array of strings
graph.nodes.forEach(function (d, i) {
graph.nodes[i] = { "name": d };
});
sankey
.nodes(graph.nodes)
.links(graph.links)
.layout(32);
// add in the links
var link = svg.append("g").selectAll(".link")
.data(graph.links)
.enter().append("path")
.attr("class", "link")
.attr("d", path)
.style("stroke-width", function (d) { return Math.max(1, d.dy); })
.sort(function (a, b) { setTimeout(function () { return b.dy - a.dy; }, 10);});
// add the link titles
link.append("title")
.text(function (d) {
return d.source.name + " → " +
d.target.name + "\n" + d.value.toFixed(0) + " TEU";
});
$("#" + divID + " .loading").addClass("hide");
// add in the nodes
var node = svg.append("g").selectAll(".node")
.data(graph.nodes)
.enter().append("g")
.attr("class", "node")
.attr("transform", function (d) {
//setTimeout(function () {
return "translate(" + d.x + "," + d.y + ")";
//}, 10);
})
.call(d3.behavior.drag()
.origin(function (d) { return d; })
.on("dragstart", function () {
this.parentNode.appendChild(this);
})
.on("drag", dragmove));
// add the rectangles for the nodes
node.append("rect")
.attr("height", function (d) { if (d.dy < 0) { d.dy = (d.dy * -1); } return d.dy; })
.attr("width", sankey.nodeWidth())
.style("fill", function (d) {
return d.color = color(d.name);
})
.style("stroke", function (d) {
return d3.rgb(d.color);
})
.append("title")
.text(function (d) {
return d.name + "\n" + format(d.value);
});
// add in the title for the nodes
node.append("text")
.attr("x", -6)
.attr("y", function (d) { return d.dy / 2; })
.attr("dy", ".35em")
.attr("text-anchor", "end")
.style("stroke", function (d) { return "#000000" })
.attr("transform", null)
.text(function (d) { return d.name; })
.filter(function (d) { return d.x < width / 2; })
.attr("x", 6 + sankey.nodeWidth())
.attr("text-anchor", "start");
// the function for moving the nodes
function dragmove(d) {
d3.select(this).attr("transform",
"translate(" + d.x + "," + (
d.y = Math.max(0, Math.min(height - d.dy, d3.event.y))
) + ")");
sankey.relayout();
link.attr("d", path);
}
}, 0)
最佳答案
这是 sankey.js 脚本的问题。
请参阅此提交(在 sankey.js 的一个分支上),它修复了该问题: https://github.com/soxofaan/d3-plugin-captain-sankey/commit/0edba18918aac3e9afadffd4a169c47f88a98f81
while (remainingNodes.length) {
变成:
while (remainingNodes.length && x < nodes.length) {
这应该可以防止无限循环。
关于javascript - 防止 D3js Sankey 图表中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32641389/
plotly 库有一些漂亮的 sankey 图 https://plotly.com/python/sankey-diagram/ 但数据要求您传递源/目标对的索引。 link = dict(
我试图在 Sankey diagram 中绘制 3 个集群之间的患者流量.我有一个 pd.DataFrame counts使用 from-to 值,见下文。要重现此 DF,here是 counts d
下面sankey图中字体的白色阴影是否可以去除? import plotly.graph_objects as go fig = go.Figure(go.Sankey(
我想使用 highcharter 包在 R 中绘制桑基图。我在格式化时遇到问题。这是示例。 # devtools::install_github("jbkunst/highcharter") libr
想知道是否有人可以帮忙找出为什么这个桑基图不起作用。我很确定我遵循了正确的语法和约定来使用该模块。因为这个我一直用头撞 table 。 import plotly.offline data_trace
我用 R 中的 rChars 包做了一个桑基图。 但是我想添加一个功能,当我们移动到链接或目标节点时,它会在工具提示中显示源节点的所有名称(或在图形右上角的新框)。例如,当我们移动到节点“target
我创建了一个 d3 Sankey 图。我面临的问题是我无法拖动节点。这是节点的创建方式: var node = svg.append("g").selectAll(".node") .d
Here是 Sankey 图的jsfiddle: 我正在尝试修改链接的颜色,以便每个链接的颜色实际上是从其源节点颜色到其目标节点颜色的渐变。 (假设不透明度将保持 0.2 或 0.5,具体取决于鼠标是
我正在使用 d3.js 的 Sankey 插件。有没有办法影响节点的自动放置? 如果你比较下面两张图片。 自动生成桑基图:https://files.secureserver.net/0s3DEU5s
我正在寻求为时间 1 的 5 个节点和时间 2 的 5 个节点之间的流制作大量桑基图。我希望每次都以相同的顺序绘制节点,无论节点或流的大小如何。然而,其中一些图表是用乱序的节点绘制的。我试图动态计算预
我希望在 R Markdown 中使用 HTML 小部件/Javascript 创建一个交互式 Sankey 图,所以我正在考虑使用 networkD3 package .我希望利用的主要交互性是单击
是否可以使用 sankey 按名称排序?例如: 示例: https://jsfiddle.net/Khrys/1s3shf2m/ google.setOnLoadCallback(drawChar
问题 1:我无法在拖动事件上更新 d3-sankey 链接。我正在尝试复制与此类似的 d3 垂直和水平拖动事件:https://bl.ocks.org/d3noob/5028304 当使用拖动事件时,
我想向 Plotly Sankey 图 ( https://plot.ly/python/sankey-diagram/ ) 中的每个节点添加节点计数,使其看起来像红色箭头引用的计数。 这可能吗?我无
我在 R 中创建了一个 Sankey 图,使用 networkD3包,我想保存为静态图像,使用代码而不是单击“导出”-->“另存为图像...”。 我尝试过的当前代码(以 this Sankey 图为例
我想知道如何在 plotly 中将包名称添加到 Sankey 图中。通过捆绑,我理解一列中的节点。从 plotly 教程: import plotly.graph_objects as go fig
我正在通过 plotly 绘制桑基图来比较不同的观察分类。但是,我对两个以上的分类有一些问题,其中每个分类中的观察顺序在每个节点的输入和输出之间发生变化。 我使用的代码如下: def pl_sanke
在他的d3 Sankey Diagram page上,Mike Bostock 说“该算法将来可以改进,比如尽量减少链接交叉”。 我想投入一些时间并做到这一点,但我不确定是否要开始。有人对如何实现这一
我正在按照本教程制作桑基图 https://bost.ocks.org/mike/sankey/ 当节点和链接太多时,它不会绘制任何内容,这不是圆的问题。 它会说 我有 349 个节点和 1776 个
我正在尝试使用 d3 sankey plugin 创建桑基图具有动态运输数据。它在大多数情况下都工作得很好,除非我得到这样的数据集: [{"DeparturePort":"CHARLESTON","A
我是一名优秀的程序员,十分优秀!