Javascript d3 Sankey指定固定的x、y位置

Javascript d3 Sankey指定固定的x、y位置,javascript,d3.js,sankey-diagram,Javascript,D3.js,Sankey Diagram,我有一个sankey图,用户可以在其中自由移动和定位节点。我想保存用户选择的精确像素位置,并在下一次重新生成图表时使用它 到目前为止,我唯一能做到这一点的方法是使用节点的“x层”,而不是精确的x位置(不是像素中的x坐标,而是层/层中的x坐标-1、2、3等等) 有没有办法改用像素坐标?我猜当用户移动节点时,您使用的是transform 如果为每个节点分配一个id,则可以保存像[(#id,transformation)…]这样的对,然后再次应用它 如果你展示你的代码,我可以试试看:)我猜当用户移动节

我有一个sankey图,用户可以在其中自由移动和定位节点。我想保存用户选择的精确像素位置,并在下一次重新生成图表时使用它

到目前为止,我唯一能做到这一点的方法是使用节点的“x层”,而不是精确的x位置(不是像素中的x坐标,而是层/层中的x坐标-1、2、3等等)


有没有办法改用像素坐标?

我猜当用户移动节点时,您使用的是
transform

如果为每个节点分配一个id,则可以保存像
[(#id,transformation)…]
这样的对,然后再次应用它


如果你展示你的代码,我可以试试看:)

我猜当用户移动节点时,你在使用
transform

如果为每个节点分配一个id,则可以保存像
[(#id,transformation)…]
这样的对,然后再次应用它


如果你展示你的代码,我可以试试:)

sankey插件充当你的数据模型。它所做的只是计算“rect”的x和路径的“dx”以及许多其他位置计算。您可以使用“dragend”捕捉这些位置

一旦你有了数据,你就可以用模式来获取和设置

var getNodes = sankey.nodes();
//do something here to set the position 
sankey.nodes(getNodes);
然后你会对链接做同样的事情。然后重新计算一切

sankey.layout() 
在没有看到您的代码的情况下,我确信会有另一个步骤来确保这一点,但您会发现这是一个易于更新的模块


您可能希望检查实际的源代码,因为我有一个自定义版本,它可能有不同的变量名,但工作原理相同

sankey插件充当您的数据模型。它所做的只是计算“rect”的x和路径的“dx”以及许多其他位置计算。您可以使用“dragend”捕捉这些位置

一旦你有了数据,你就可以用模式来获取和设置

var getNodes = sankey.nodes();
//do something here to set the position 
sankey.nodes(getNodes);
然后你会对链接做同样的事情。然后重新计算一切

sankey.layout() 
在没有看到您的代码的情况下,我确信会有另一个步骤来确保这一点,但您会发现这是一个易于更新的模块


您可能希望检查实际的源代码,因为我有一个自定义版本,它可能有不同的变量名,但工作原理相同

您可以提取
x
y
值,并将它们保存到数组中,如下所示:

var savedCoordinates = sankey.nodes().map(function(d) {
        return {x:d.x, y:d.y};
});
当然,这必须在计算布局后使用,否则
x
y
值未定义

要返回保存的坐标,可以使用以下命令:

sankey.nodes().forEach( function(d,i) {
      d.x= savedCoordinates[i].x;
      d.y= savedCoordinates[i].y;
});
最后,您需要使用正在使用的任何绘图功能更新绘图(更新
g
节点的
transform
属性和链接的
path
属性)


注意,我假设节点顺序不变。如果有,您需要提供一个
id
字段,或类似于您的数据。。。您有吗?

您可以提取
x
y
值,并将它们保存到数组中,如下所示:

var savedCoordinates = sankey.nodes().map(function(d) {
        return {x:d.x, y:d.y};
});
当然,这必须在计算布局后使用,否则
x
y
值未定义

要返回保存的坐标,可以使用以下命令:

sankey.nodes().forEach( function(d,i) {
      d.x= savedCoordinates[i].x;
      d.y= savedCoordinates[i].y;
});
最后,您需要使用正在使用的任何绘图功能更新绘图(更新
g
节点的
transform
属性和链接的
path
属性)


注意,我假设节点顺序不变。如果有,您需要提供一个
id
字段,或类似于您的数据。。。你有吗?

你能准确地解释一下每次“再生”之间会发生什么吗?如果您插入或删除节点等,那么解决方案将非常不同。如果您的数据没有太多变化,并且您希望保持相同的节点位置,那么为什么首先让sankey移动节点?数据变化很大。用户可以添加和删除节点,但也应该能够定位它们。所以节点必须有一个固定的位置。这就是为什么我认为下面的转换命题不起作用的原因,因为没有考虑添加新节点,带有转换的现有节点将被移动到不适合新排列的保存位置。当所有其他节点都具有固定位置时,您将如何在sankey图中插入节点?Sankey的设计目的是从头开始构建布局,因此您基本上可以编辑整个Sankey文件。为什么不在第一个布局中使用Sankey,然后使用一个力图来放置新节点(每个旧节点都是固定的)?您能否准确地解释一下每次“重新生成”之间会发生什么?如果您插入或删除节点等,那么解决方案将非常不同。如果您的数据没有太多变化,并且您希望保持相同的节点位置,那么为什么首先让sankey移动节点?数据变化很大。用户可以添加和删除节点,但也应该能够定位它们。所以节点必须有一个固定的位置。这就是为什么我认为下面的转换命题不起作用的原因,因为没有考虑添加新节点,带有转换的现有节点将被移动到不适合新排列的保存位置。当所有其他节点都具有固定位置时,您将如何在sankey图中插入节点?Sankey的设计目的是从头开始构建布局,因此您基本上可以编辑整个Sankey文件。为什么不在第一个布局中使用Sankey,然后使用一个力图来放置新节点(每个旧节点都是固定的)?嘿,pltrdy,我正在使用一个代码,与这里接受的答案类似,我正在使用节点的“xPos”属性来将其定位在x轴上,但它不够精确。我很好奇,当添加新节点时,转换的想法是否有效