- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在他的d3 Sankey Diagram page上,Mike Bostock 说“该算法将来可以改进,比如尽量减少链接交叉”。
我想投入一些时间并做到这一点,但我不确定是否要开始。有人对如何实现这一目标有任何建议或想法吗?
我的直觉是,应用于节点以最小化链接距离的迭代松弛也可以用于重新定位相同的节点以最小化链接交叉。
即使在每个 x 位置只有一个节点的情况下,我确实需要垂直“展开”节点,这样可以大大减少链接交叉(不需要是学术级别的)结果,一个实用的、比现在更好的结果就足够了)
Here是一个 JS Fiddle 作为起点 - 节点以次优方式定位,使得边/链接从一开始就交叉:
function getData() {
return {
"nodes": [{
"node": 0,
"name": "Name0"
}, {
"node": 1,
"name": "Name1"
}, {
"node": 2,
"name": "Action2"
}, {
"node": 3,
"name": "Name3"
}, {
"node": 4,
"name": "Name4"
}, {
"node": 5,
"name": "Action5"
}, {
"node": 6,
"name": "Action6"
}, {
"node": 7,
"name": "Action7"
}, {
"node": 8,
"name": "Action8"
}],
"links": [{
"source": 0,
"target": 6,
"value": 25,
"id": "name0"
}, {
"source": 1,
"target": 2,
"value": 25,
"id": "Name1"
}, {
"source": 2,
"target": 5,
"value": 25,
"id": "Name1"
}, {
"source": 3,
"target": 6,
"value": 25,
"id": "Name3"
}, {
"source": 6,
"target": 7,
"value": 25,
"id": "name0"
}, {
"source": 4,
"target": 7,
"value": 25,
"id": "Name4"
}, {
"source": 5,
"target": 7,
"value": 25,
"id": "Name1"
}, {
"source": 6,
"target": 7,
"value": 25,
"id": "Name3",
}, {
"source": 7,
"target": 8,
"value": 25,
"id": "Name3"
}]
};
}
最佳答案
所有这些都在 updated sample 中。
// load the data
var graph_zero = getData();
在每个频段添加中间节点以保持间距
var graph = rebuild(graph_zero.nodes, graph_zero.links)
以正常方式生成间距
sankey
.nodes(graph.nodes)
.links(graph.links)
.layout(32);
删除添加的中间节点
strip_intermediate(graph.nodes, graph.links)
并正常构建图表。这适用于提供的简单案例。
// From sankey, but keep indices as indices
// Populate the sourceLinks and targetLinks for each node.
// Also, if the source and target are not objects, assume they are indices.
function computeNodeLinks(nodes, links) {
nodes.forEach(function(node) {
node.sourceLinks = [];
node.targetLinks = [];
});
links.forEach(function(link) {
var source = link.source,
target = link.target;
nodes[source].sourceLinks.push(link);
nodes[target].targetLinks.push(link);
});
}
// computeNodeBreadths from sankey re-written to use indexes
// Iteratively assign the breadth (x-position) for each node.
// Nodes are assigned the maximum breadth of incoming neighbors plus one;
// nodes with no incoming links are assigned breadth zero, while
// nodes with no outgoing links are assigned the maximum breadth.
function computeNodeBreadths(nodes,links) {
var remainingNodes = nodes.map(function(d) { return d.node })
var nextNodes
var x = 0
while (remainingNodes.length) {
nextNodes = [];
remainingNodes.forEach(function(node) {
nodes[node].x = x;
nodes[node].sourceLinks.forEach(function(link) {
if (nextNodes.indexOf(link.target) < 0) {
nextNodes.push(link.target);
}
});
});
remainingNodes = nextNodes;
++x;
}
}
// Add nodes and links as needed
function rebuild(nodes, links) {
var temp_nodes = nodes.slice()
var temp_links = links.slice()
computeNodeLinks(temp_nodes, temp_links)
computeNodeBreadths(temp_nodes, temp_links)
for (var i = 0; i < temp_links.length; i++) {
var source = temp_links[i].source
var target = temp_links[i].target
var source_x = nodes[source].x
var target_x = nodes[target].x
var dx = target_x - source_x
// Put in intermediate steps
for (var j = dx; 1 < j; j--) {
var intermediate = nodes.length
nodes.push({
node: intermediate,
name: "intermediate"
})
links.push({
source: intermediate,
target: (j == dx ? target : intermediate-1),
value: links[i].value
})
links[i].target = intermediate
}
}
return {
nodes: nodes,
links: links
}
}
function strip_intermediate(nodes, links) {
for (var i = links.length-1; i >= 0; i--) {
var link = links[i]
if (link.original_target) {
var intermediate = nodes[link.last_leg_source]
link.target = nodes[link.original_target]
link.ty = intermediate.sourceLinks[0].ty
}
}
for (var i = links.length-1; i >= 0; i--) {
var link = links[i]
if (link.source.name == "intermediate") {
links.splice(i, 1)
}
}
for (var i = nodes.length-1; i >= 0; i--) {
if (nodes[i].name == "intermediate") {
nodes.splice(i, 1)
}
}
}
更新:为了进一步减少交叉,Using PQR-trees for reducing edge crossings in layered directed acyclic graphs可能会有所帮助。
关于d3.js - D3 Sankey 最小化链路交叉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37302958/
我有一个关于 DFA 最小化的问题。所以我使用了众所周知的技术将正则表达式转换为 NFA,然后使用 goto/closure 算法从中构造 DFA。现在的问题是如何将其最小化?我在这里看过有关它的课文
这是我的代码,当鼠标光标悬停在 TPanel 上时,它会“动画化”它。我还有一个代码块来取消它的动画。 procedure Tmain.pStarting1MouseEnter(Sender: TOb
我有图像 slider ,其中图像在超时时相互替换。我使用 jQuery 函数 setInterval() 但有一个小问题,在最小化浏览器窗口后,该函数继续“工作”,并且我恢复浏览器窗口图像的位置以令
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How can I stop a double click of the window title bar
当我在我的 Windows 窗体应用程序中单击最小化按钮时,我不希望它执行经典的 Windows 最小化动画(窗口下降到任务栏)。 据我所知,没有最小化事件,我只能使用调整大小,但我不知道如何检测我是
首先 - 对不起我的英语。 我刚刚创建了 Android 应用程序。它包含几个 Activity ,并在此应用程序的背景下播放音乐。当用户以某种方式(通过单击“后退”按钮、主页按钮或其他方式)离开应用
我需要帮助编写一个程序,该程序以 (X,Y) 的形式给出指定数量的坐标点。将给出的点数是程序中的第一行;它可以通过扫描仪读取。 我需要计算覆盖线 x = a 和 y = b 的所有点的最小面积。因此,
我需要一个 Activity 返回到上一个 Activity ,但如果再次单击该按钮,它将恢复上次的 Activity 。这是所需的过程:我点击一个按钮, Activity 开始。如果我点击“后退”按
随着这个动画变得越来越复杂,我不断添加参数,以便它们在每次回调时可用。目前共有 6 个。 例如,现在我想在显示消息时禁用输入框,因此我必须添加另一个元素 - in_element; 电话: M
这是一个基于对话框的 MFC 应用程序。我并没有故意添加任何关于最小化、最大化和恢复按钮的代码。它可以首先显示那些按钮。但它在长时间运行后就会消失。或者计算机的 sleep 可能导致此问题? 我不知道
如何使用 Windows API 禁用窗口的最大化和/或最小化功能?最大化/最小化框需要变灰并禁用,双击标题栏、拖动到屏幕顶部等也需要不起作用。 最佳答案 您可以调用 SetWindowLong/Se
是否有任何已知的算法帽子可以解决以下问题:我们有一个 session ,有多个同时会谈。用户应标记感兴趣的会谈,然后我们要创建一个会谈时间表,以便我的大多数人都可以参加他们的会谈并最大限度地减少日程冲
目前我负责为一个小项目开发一个(C++)窗口类;目标是将依赖性保持在最低限度。Win32/WinAPI 的实现按预期工作,但是,当涉及到 Linux/XCB 时,我正在努力。 我知道,我可以检查“_N
windows C++编程,如何让事件窗口最大化或最小化? 对于鼠标按下事件,我们使用类似 mi.dwFlags = MOUSEEVENTF_LEFTDOWN 的东西,并使用 SendInput()
我编写了以下获取 2 个参数的构造函数,如果值(x 或 y)为负,它将被初始化为零。 public Point1 ( int x , int y ) { //if one or
我有以下代码,如果我将导航窗口最大化,它运行良好,但是当我最小化它时它停止工作。 更多细节: 当窗口最小化时,“scrollDown & scrollTop”函数停止执行。 'use strict'
我有一个包含一些宏和用户表单的 Excel 文件。 我不希望用户在没有密码的情况下访问文件本身。他们应该只能看到用户表单并通过用户表单输入数据。 这是我目前拥有的代码。 Private Sub Wor
目前,我正在尝试训练一个同时具有复值张量作为输入和输出的网络。作为损失函数,我采用输出与真实值之间逐点差异的范数。 当我尝试最小化损失函数时,tensorflow 的“最小化”函数提示意外的复数。我觉
这个函数是我想要优化的主力。任何关于如何限制其内存使用的想法都会很棒。 function F(len, rNo, n, ratio = 0.5) s = zeros(len); m = co
在 Qt 下的 Windows Mobile 和 Symbian 平台上,如何通过单击应用程序中的某个按钮来最小化我的应用程序? 最佳答案 大概QWidget::setWindowState将适合您,
我是一名优秀的程序员,十分优秀!