本文共 2321 字,大约阅读时间需要 7 分钟。
打包图用于表示包含与被包含的关系,也可表示各对象的权重,通常用一圆套一圆来表示前者,用圆的大小来表示后者。
我们通过一个制作一个打包图来讲解打包布局。
var dataset = { "name": "中国", "children": [{ "name": "浙江", "children": [{"name": "杭州"}, {"name": "宁波"}, {"name": "温州"}, {"name": "绍兴"}] }, { "name": "广西", "children": [{"name": "桂林"}, {"name": "南宁"}, {"name": "柳州"}, {"name": "防城港"}] }, { "name": "黑龙江", "children": [{"name": "哈尔滨"}, {"name": "齐齐哈尔"}, {"name": "牡丹江"}, {"name": "大庆"}] }, { "name": "新疆", "children": [{"name": "乌鲁木齐"}, {"name": "克拉玛依"}, {"name": "吐鲁番"}, {"name": "哈密"}] } ]}
var width = 500;var height = 500;var pack = d3.layout.pack() .size([width, height]) .radius(20);var nodes = pack.nodes(dataset);var links = pack.links(nodes);
分别将数据转换成了结点 nodes 和 连线 links。
这里只需要用到结点数据,数据被转换成了如下:var svg = d3.select("body").append("svg") .attr("width", width) .attr("height", height) .append("g") .attr("transform", "translate(0,0)");
svg.selectAll("circle") .data(nodes) .enter() .append("circle") .attr("fill", "rgb(31, 119, 180)") .attr("fill-opacity", "0.4") .attr("cx", function(d) { return d.x; }) .attr("cy", function(d) { return d.y; }) .attr("r", function(d) { return d.r; }) .on("mouseover", function(d, i) { d3.select(this) .attr("fill", "yellow"); }) .on("mouseout", function(d, i) { d3.select(this) .attr("fill", "rgb(31, 119, 180)"); });
svg.selectAll("text") .data(nodes) .enter() .append("text") .attr("font-size", "10px") .attr("fill", "white") .attr("fill-opacity", function(d) { if (d.depth == 2) return "0.9"; else return "0"; }) .attr("x", function(d) { return d.x; }) .attr("y", function(d) { return d.y; }) .attr("dx", -12) .attr("dy", 1) .text(function(d) { return d.name; });
转载地址:http://vawzo.baihongyu.com/