d3.js之力导向图

效果图


<html>  
  <head>  
        <meta charset="utf-8">  
        <title>力导向图</title>  
  </head> 

<style>


</style>
    <body>  
		<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>  
        <script>		   
					   
		var nodes = [ { name: "桂林"    }, { name: "广州" },
					  { name: "厦门"    }, { name: "杭州"   },
					  { name: "上海"   }, { name: "青岛"    },
					  { name: "天津"    } ];
					 
		var edges = [  { source : 0  , target: 1 } , { source : 0  , target: 2 } ,
					   { source : 0  , target: 3 } , { source : 1  , target: 4 } ,
					   { source : 1  , target: 5 } , { source : 1  , target: 6 }  ];	
		
		var width=400;
		var height=400;
		
		var svg=d3.select("body")
							.append("svg")
							.attr("width",width)
							.attr("height",height);
					
		var force=d3.layout.force()
				.nodes(nodes)//指定节点数组
				.links(edges)//指定连线数组
				.size([width,height])//指定范围
				.linkDistance(150) //指定连线长度
				.charge(-400);//相互之间的作用力
					
		force.start();//开始作用
		
		console.log(nodes);
		console.log(edges);
		
					//添加连线
		var svg_edges=svg.selectAll("line")
				 							.data(edges)
				 							.enter()
				 							.append("line")
				 							.style("stroke","#cc")
				 							.style("stroke-width",1);
		var color=d3.scale.category20();//颜色比例尺
					//添加节点
		var svg_nodes=svg.selectAll("circle")
											.data(nodes)
											.enter()
											.append("circle")
											.attr("r",20)
				.style("fill",function(d,i){
											return color(i);
				})
				.call(force.drag);//使得节点能拖动
					//添加描述节点的文字
		var svg_texts=svg.selectAll("text")
				.data(nodes)
				.enter()
				.append("text")
				.style("fill","black")
				.attr("dx",20)
				.attr("dy",8)
				.text(function(d){
						return d.name;
				});
					
		force.on("tick",function(){//对于每一个时间间隔
			//更新连线坐标
			svg_edges
				.attr("x1",function(d){return d.source.x;})
				.attr("y1",function(d){return d.source.y;})
				.attr("x2",function(d){ return d.target.x; })
			 	.attr("y2",function(d){ return d.target.y; });
			 //更新节点坐标
			 svg_nodes.attr("cx",function(d){ return d.x; })
			 		.attr("cy",function(d){ return d.y; });

			 //更新文字坐标
			 svg_texts.attr("x", function(d){ return d.x; })
			 	.attr("y", function(d){ return d.y; });
			
					});
		
		  
        </script>  
		
    </body>  
</html>  

演示地址:http://runjs.cn/detail/thdu7p1e


好的,我可以为您介绍一下绘制导向的方法。d3.js是一个非常流行的JavaScript库,它提供了丰富的绘功能,包括绘制导向。 首先,您需要定义一个包含节点和链接信息的数据集。节点可以是一个对象,包含其名称和其他属性,链接可以是一个具有源节点和目标节点的对象。例如: ```javascript var nodes = [ { name: "A", group: 1 }, { name: "B", group: 2 }, { name: "C", group: 2 }, { name: "D", group: 3 } ]; var links = [ { source: "A", target: "B", value: 1 }, { source: "B", target: "C", value: 2 }, { source: "C", target: "D", value: 3 } ]; ``` 然后,您需要定义一个SVG容器来容纳您的形: ```javascript var svg = d3.select("body").append("svg") .attr("width", width) .attr("height", height); ``` 接下来,您可以使用d3.forceSimulation()方法来创建一个导向的仿真器,并使用d3.forceLink()和d3.forceManyBody()方法来定义链接和节点之间的。 ```javascript var simulation = d3.forceSimulation() .force("link", d3.forceLink().id(function(d) { return d.id; })) .force("charge", d3.forceManyBody()) .force("center", d3.forceCenter(width / 2, height / 2)); ``` 最后,您可以使用d3.select()和d3.selectAll()方法来选择和绘制节点和链接。 ```javascript var link = svg.append("g") .attr("class", "links") .selectAll("line") .data(links) .enter().append("line") .attr("stroke-width", function(d) { return Math.sqrt(d.value); }); var node = svg.append("g") .attr("class", "nodes") .selectAll("circle") .data(nodes) .enter().append("circle") .attr("r", 5) .attr("fill", function(d) { return color(d.group); }) .call(d3.drag() .on("start", dragstarted) .on("drag", dragged) .on("end", dragended)); ``` 以上是一个简单的导向的绘制过程,如果您需要更多高级的控制,您可以查看d3.js的官方文档。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值