d3.js画力学图,怎么把图限制在边框内
d3.js画力学图,有时节点较少,力学图在展示时可能出现在边框以外(限制了拖动功能),怎么怎么把图限制在边框内。...
d3.js画力学图,有时节点较少,力学图在展示时可能出现在边框以外(限制了拖动功能),怎么怎么把图限制在边框内。
展开
展开全部
力学图( Force ),也有被翻译做力导向图等。这种图很有意思,先从初始数据开始,看下面代码:
var nodes = [ { name: "GuiLin" },
{ name: "GuangZhou" },
{ name: "XiaMen" },
{ name: "HangZhou" },
{ name: "ShangHai" },
{ name: "QingDao" },
{ name: "TianJin" },
{ name: "BeiJing" },
{ name: "ChangChun" },
{ name: "XiAn" },
{ name: "WuluMuQi" },
{ name: "LaSa" },
{ name: "ChengDu" } ];
var edges = [ { source : 0 , target: 1 } ,
{ source : 1 , target: 2 } ,
{ source : 2 , target: 3 } ,
{ source : 3 , target: 4 } ,
{ source : 4 , target: 5 } ,
{ source : 5 , target: 6 } ,
{ source : 6 , target: 7 } ,
{ source : 7 , target: 8 } ,
{ source : 8 , target: 9 } ,
{ source : 9 , target: 10 } ,
{ source : 10 , target: 11 } ,
{ source : 11 , target: 12 } ,
{ source : 12 , target: 0 } ];
这里有顶点( nodes )和边( edges ),这里的顶点是一些城市名称,边是两个顶点之间的连线。我们现在要用这些数据来做力学图。但是这样的数据不适合做力学图,比如不知道每一个顶点画在哪个坐标等。所以需要先用 Layout 来转换数据,我们说过, D3 中的 Layout 就是用来转换数据的。 force 的 layout 为:
var force = d3.layout.force()
.nodes(nodes)
.links(edges)
.size([width,height])
.linkDistance(200)
.charge([-100])
.start();
在上面的代码中:
d3.layout.force() 是力学图 Layout 的函数
nodes() 里传入顶点的数组
links() 里放入边的数组
size() 是作用域的大小
linkDistance() 用于设定两个顶点之间的长度
charge() 是设定弹力的大小。
start() 表示开始转换
调用这个函数后,数据就已经被转换了,我们看看数据从什么转换成什么了:
顶点(转换前):
顶点(转换后):
可以看到,转换后,多了 index , px , py 等。
再来看看边的数据:
边(转换前):
边(转换后):
可以看到,边数据的两个索引号直接被转换成了两个顶点的数据。
好了,有了这些数据,我们就可以作图了。我们用 SVG 中的 line 画边,用 SVG 中的 circle 画顶点。
var svg_edges = svg.selectAll("line")
.data(edges)
.enter()
.append("line")
.style("stroke","#ccc")
.style("stroke-width",1);
var color = d3.scale.category20();
var svg_nodes = svg.selectAll("circle")
.data(nodes)
.enter()
.append("circle")
.attr("r",10)
.style("fill",function(d,i){
return color(i);
})
.call(force.drag);
这样的代码我们已经很熟悉了,只有最后一句代码没出现过, call( force.drag ) 是设定我们可以拖动顶点。这个 call 函数我们前面说过,这个 call 是用于将当前选择的元素传到 force.drag 函数中。
最后,我们还需要一段代码,如下:
force.on("tick", function(){
svg_edges.attr("x1",function(d){ return d.source.x; });
svg_edges.attr("y1",function(d){ return d.source.y; });
svg_edges.attr("x2",function(d){ return d.target.x; });
svg_edges.attr("y2",function(d){ return d.target.y; });
svg_nodes.attr("cx",function(d){ return d.x; });
svg_nodes.attr("cy",function(d){ return d.y; });
});
tick 指的是时间间隔,也就是每一个时间间隔之后就刷新一遍画面,刷新的内容写在后面的无名函数 function 中, function 函数中写上作图的内容。
var nodes = [ { name: "GuiLin" },
{ name: "GuangZhou" },
{ name: "XiaMen" },
{ name: "HangZhou" },
{ name: "ShangHai" },
{ name: "QingDao" },
{ name: "TianJin" },
{ name: "BeiJing" },
{ name: "ChangChun" },
{ name: "XiAn" },
{ name: "WuluMuQi" },
{ name: "LaSa" },
{ name: "ChengDu" } ];
var edges = [ { source : 0 , target: 1 } ,
{ source : 1 , target: 2 } ,
{ source : 2 , target: 3 } ,
{ source : 3 , target: 4 } ,
{ source : 4 , target: 5 } ,
{ source : 5 , target: 6 } ,
{ source : 6 , target: 7 } ,
{ source : 7 , target: 8 } ,
{ source : 8 , target: 9 } ,
{ source : 9 , target: 10 } ,
{ source : 10 , target: 11 } ,
{ source : 11 , target: 12 } ,
{ source : 12 , target: 0 } ];
这里有顶点( nodes )和边( edges ),这里的顶点是一些城市名称,边是两个顶点之间的连线。我们现在要用这些数据来做力学图。但是这样的数据不适合做力学图,比如不知道每一个顶点画在哪个坐标等。所以需要先用 Layout 来转换数据,我们说过, D3 中的 Layout 就是用来转换数据的。 force 的 layout 为:
var force = d3.layout.force()
.nodes(nodes)
.links(edges)
.size([width,height])
.linkDistance(200)
.charge([-100])
.start();
在上面的代码中:
d3.layout.force() 是力学图 Layout 的函数
nodes() 里传入顶点的数组
links() 里放入边的数组
size() 是作用域的大小
linkDistance() 用于设定两个顶点之间的长度
charge() 是设定弹力的大小。
start() 表示开始转换
调用这个函数后,数据就已经被转换了,我们看看数据从什么转换成什么了:
顶点(转换前):
顶点(转换后):
可以看到,转换后,多了 index , px , py 等。
再来看看边的数据:
边(转换前):
边(转换后):
可以看到,边数据的两个索引号直接被转换成了两个顶点的数据。
好了,有了这些数据,我们就可以作图了。我们用 SVG 中的 line 画边,用 SVG 中的 circle 画顶点。
var svg_edges = svg.selectAll("line")
.data(edges)
.enter()
.append("line")
.style("stroke","#ccc")
.style("stroke-width",1);
var color = d3.scale.category20();
var svg_nodes = svg.selectAll("circle")
.data(nodes)
.enter()
.append("circle")
.attr("r",10)
.style("fill",function(d,i){
return color(i);
})
.call(force.drag);
这样的代码我们已经很熟悉了,只有最后一句代码没出现过, call( force.drag ) 是设定我们可以拖动顶点。这个 call 函数我们前面说过,这个 call 是用于将当前选择的元素传到 force.drag 函数中。
最后,我们还需要一段代码,如下:
force.on("tick", function(){
svg_edges.attr("x1",function(d){ return d.source.x; });
svg_edges.attr("y1",function(d){ return d.source.y; });
svg_edges.attr("x2",function(d){ return d.target.x; });
svg_edges.attr("y2",function(d){ return d.target.y; });
svg_nodes.attr("cx",function(d){ return d.x; });
svg_nodes.attr("cy",function(d){ return d.y; });
});
tick 指的是时间间隔,也就是每一个时间间隔之后就刷新一遍画面,刷新的内容写在后面的无名函数 function 中, function 函数中写上作图的内容。
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
展开全部
使用力学图的 layout 的时候,设定一下范围:
d3.layout.force()
.nodes(nodes)
.links(edges)
.size([width,height])
.start();
上面的size可指定范围。
详情可参照: http://www.ourd3js.com/wordpress/?p=196
谢谢
d3.layout.force()
.nodes(nodes)
.links(edges)
.size([width,height])
.start();
上面的size可指定范围。
详情可参照: http://www.ourd3js.com/wordpress/?p=196
谢谢
追问
size好像只能限制住底部跟右边,顶部及左边还是可能超出
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我上次看了,他这个都明白了,你可以看看,他每一步都有代码,注释,很简单的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询