我正在使用www.example.com上的this nice force layoutFlowingdata.com创建网络图。
我的图目前显示了5到750个节点及其关系。它可以很好地与一些自定义的变化,以满足我的需要。但有一件事我不能得到工作。我有一个viewBox
与preserveAspectRatio
自动适应它所在的容器。但取决于节点的数量,总是有一些节点周围的边缘(主要是顶部和底部),如果节点很少,它会显示在中间,周围是巨大的空白(这是一个大容器)。
有没有办法自动缩放或缩放布局以自动适应?这样一个大的布局得到一定程度的缩小和一个小的布局放大。我有一个缩放事件设置,所以滚动和平移的工作就像一个魅力。但它能自动做到这一点,以适应内容?
d3.js启动代码:
vis = d3.select(selection)
.append("svg")
.attr("viewBox", "0 0 " + width + " " + height )
.attr("preserveAspectRatio", "xMidYMid meet")
.attr("pointer-events", "all")
.call(d3.behavior.zoom().scaleExtent([.1, 3])
.on("zoom", redraw)).append('g');
4条答案
按热度按时间raogr8fs1#
到目前为止,所有其他的答案都需要访问数据,并通过它进行迭代,因此复杂度至少为
O(nodes)
。我一直在寻找,并找到了一种方法,完全基于已经渲染的视觉尺寸,getBBox()
,希望是O(1)
。它里面有什么或如何布局并不重要,只是它的大小和父容器的大小。我设法在http://bl.ocks.org/mbostock/9656675的基础上创建了这个:编辑:上面的代码在D3 v3中有效。缩放在D3 v4和v5中发生了变化,所以你必须对最后一部分做一些小的修改(
console.trace
下面的代码):viewBox
不是0 0 width height
,则可能需要调整一些变量,但即使这样也可能不够:rhfm7lfc2#
您的代码应该类似于
此代码仅适用于xAxis。因为“全局圆”SVG RX === RY。如果不适用,那么您可以为yAxis
var startY
添加相同的逻辑。此外,您需要考虑圆节点的cr
来调整初始坐标。j8yoct9x3#
适用于D3 v7的已接受答案:
1rhkuytd4#
您可以迭代节点;获取所有节点的最大和最小x和y值,并计算所需的缩放和平移,以在SVG大小内覆盖所有可视化。
我有一段代码,它使图形以给定的节点为中心;这也许能帮你想个主意
其中w,h是SVG画布的宽度和高度,d是我想居中的节点。
你应该计算x和y的平均值,而不是以d.x,d.y为中心。然后计算缩放比例,使图形的宽度(和高度)适合SVG的宽度(和大小)。