打包图

利用d3.layout.pack布局

 const width = 700, height = 500, padding = {top: 160, left: 130};
    d3.json("city.json", function (error, data) {

        const svg = d3.select("body").append("svg")
            .attr("width", width + padding.left * 2)
            .attr("height", height + padding.top * 2)
            .append("g")
            .attr("transform", `translate(${padding.left },${padding.top})`);
        const pack = d3.layout.pack()
            .size([width, height])
            .padding(19)
            .radius(20);
        const node = pack.nodes(data);
// node格式 用pack(打包布局)把数据转换成相应半径和间距的数据 然后直接用圆形绘制即可
      /*   {
            children: (12) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}],
            depth: 0,
            name: "中国",
            r: 404.29107179179675,
            value: 0,
            x: 350,
            y: 250
        }*/
        console.log(node);
        const color = d3.scale.category10();
        svg.selectAll(".circle")
            .data(node)
            .enter()
            .append("circle")
            .attr("class", "circle")
            .style("fill", function (d, i) {
                return color(i);
            })
            .style("opacity", function (d, i) {
                return d.children ? .3 : 1;
            })
            .attr("cx", function (d) {
                return d.x
            })
            .attr("cy", function (d) {
                return d.y
            })
            .attr("r", function (d) {
                return d.r
            });
        svg.selectAll(".text")
            .data(node)
            .enter()
            .append("text")
            .attr("class", "text")
            .style("stroke", "black")
            .style("font-size", "12px")
            .style("opacity", function (d, i) {
                return d.children ? 0 : 1;
            })
            .attr("x", function (d) {
                return d.x
            }).attr("y", function (d) {
            return d.y
        }).attr("dy", ".3em")
            .style("text-anchor", "middle")
            .text(d => d.name)
    });

结果


打包图_第1张图片
pack

你可能感兴趣的:(打包图)