d3.js饼图带标签

时间:2015-06-06 21:22:45

标签: d3.js charts

我开始使用这个d3.js甜甜圈图表:JSFiddle我试图将其更改为饼图而中间没有圆圈。我是d3.js的新手。我尝试了几种不同的想法但是却无法将其删除到图表中间的圆圈。感谢任何和所有帮助

这是我的代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <style>
        .label-text {
            alignment-baseline : middle;
            font-size: 12px;
            font-family: arial,helvetica,"sans-serif";
            fill: #393939;
        }
        .label-line {
            stroke-width: 1;
            stroke: #393939;
        }
        .label-circle {
            fill: #393939;
        }
    </style>
     <script src="http://d3js.org/d3.v3.min.js"></script>
</head>
<body>
    <svg>
        <g id="canvas">
            <g id="art" />
            <g id="labels" /></g>
    </svg>
    <script>
        var data = [{
            label: 'Star Wars',
            instances: 207
        }, {
            label: 'Lost In Space',
            instances: 3
        }, {
            label: 'the Boston Pops',
            instances: 20
        }, {
            label: 'Indiana Jones',
            instances: 150
        }, {
            label: 'Harry Potter',
            instances: 75
        }, {
            label: 'Jaws',
            instances: 5
        }, {
            label: 'Lincoln',
            instances: 1
        }];

        svg = d3.select("svg");
        canvas = d3.select("#canvas");
        art = d3.select("#art");
        labels = d3.select("#labels");

        // Create the pie layout function.
        // This function will add convenience
        // data to our existing data, like 
        // the start angle and end angle
        // for each data element.
        jhw_pie = d3.layout.pie();
        jhw_pie.sort(null);
        jhw_pie.value(function (d) {
            // Tells the layout function what
            // property of our data object to
            // use as the value.
            return d.instances;
        });

        // Store our chart dimensions
        cDim = {
            height: 500,
            width: 500,
            innerRadius: 50,
            outerRadius: 150,
            labelRadius: 175
        }

        // Set the size of our SVG element
        svg.attr({
            height: cDim.height,
            width: cDim.width
        });

        // This translate property moves the origin of the group's coordinate
        // space to the center of the SVG element, saving us translating every
        // coordinate individually. 
        canvas.attr("transform", "translate(" + (cDim.width / 2) + "," + (cDim.height / 2) + ")");

        pied_data = jhw_pie(data);

        // The pied_arc function we make here will calculate the path
        // information for each wedge based on the data set. This is 
        // used in the "d" attribute.
        pied_arc = d3.svg.arc()
            .innerRadius(50)
            .outerRadius(150);

        // This is an ordinal scale that returns 10 predefined colors.
        // It is part of d3 core.
        pied_colors = d3.scale.ordinal()
                .range(["#04B486", "#F2F2F2", "#F5F6CE", "#00BFFF","orange","purple","pink"]);

        // Let's start drawing the arcs.
        enteringArcs = art.selectAll(".wedge").data(pied_data)
            .enter();

        enteringArcs
         .append("g")
            .attr("class", "wedge")
            .append("path")
            .attr("d", pied_arc)
            .style("fill", function (d, i) {
                return pied_colors(i);
            });

        // Now we'll draw our label lines, etc.
        enteringLabels = labels.selectAll(".label").data(pied_data).enter();
        labelGroups = enteringLabels.append("g").attr("class", "label");
        labelGroups.append("circle").attr({
            x: 0,
            y: 0,
            r: 2,
            fill: "#000",
            transform: function (d, i) {
                centroid = pied_arc.centroid(d);
                return "translate(" + pied_arc.centroid(d) + ")";
            },
            'class': "label-circle"
        });

        // "When am I ever going to use this?" I said in 
        // 10th grade trig.
        textLines = labelGroups.append("line").attr({
            x1: function (d, i) {
                return pied_arc.centroid(d)[0];
            },
            y1: function (d, i) {
                return pied_arc.centroid(d)[1];
            },
            x2: function (d, i) {
                centroid = pied_arc.centroid(d);
                midAngle = Math.atan2(centroid[1], centroid[0]);
                x = Math.cos(midAngle) * cDim.labelRadius;
                return x;
            },
            y2: function (d, i) {
                centroid = pied_arc.centroid(d);
                midAngle = Math.atan2(centroid[1], centroid[0]);
                y = Math.sin(midAngle) * cDim.labelRadius;
                return y;
            },
            'class': "label-line"
        });

        textLabels = labelGroups.append("text").attr({
            x: function (d, i) {
                centroid = pied_arc.centroid(d);
                midAngle = Math.atan2(centroid[1], centroid[0]);
                x = Math.cos(midAngle) * cDim.labelRadius;
                sign = (x > 0) ? 1 : -1
                labelX = x + (5 * sign)
                return labelX;
            },
            y: function (d, i) {
                centroid = pied_arc.centroid(d);
                midAngle = Math.atan2(centroid[1], centroid[0]);
                y = Math.sin(midAngle) * cDim.labelRadius;
                return y;
            },
            'text-anchor': function (d, i) {
                centroid = pied_arc.centroid(d);
                midAngle = Math.atan2(centroid[1], centroid[0]);
                x = Math.cos(midAngle) * cDim.labelRadius;
                return (x > 0) ? "start" : "end";
            },
            'class': 'label-text'
        }).text(function (d) {
            return d.data.label
        });

        alpha = 0.5;
        spacing = 12;

        function relax() {
            again = false;
            textLabels.each(function (d, i) {
                a = this;
                da = d3.select(a);
                y1 = da.attr("y");
                textLabels.each(function (d, j) {
                    b = this;
                    // a & b are the same element and don't collide.
                    if (a == b) return;
                    db = d3.select(b);
                    // a & b are on opposite sides of the chart and
                    // don't collide
                    if (da.attr("text-anchor") != db.attr("text-anchor")) return;
                    // Now let's calculate the distance between
                    // these elements. 
                    y2 = db.attr("y");
                    deltaY = y1 - y2;

                    // Our spacing is greater than our specified spacing,
                    // so they don't collide.
                    if (Math.abs(deltaY) > spacing) return;

                    // If the labels collide, we'll push each 
                    // of the two labels up and down a little bit.
                    again = true;
                    sign = deltaY > 0 ? 1 : -1;
                    adjust = sign * alpha;
                    da.attr("y", +y1 + adjust);
                    db.attr("y", +y2 - adjust);
                });
            });
            // Adjust our line leaders here
            // so that they follow the labels. 
            if (again) {
                labelElements = textLabels[0];
                textLines.attr("y2", function (d, i) {
                    labelForLine = d3.select(labelElements[i]);
                    return labelForLine.attr("y");
                });
                setTimeout(relax, 20)
            }
        }

        relax();

    </script>
</body>
</html>

由于

1 个答案:

答案 0 :(得分:2)

请参阅此updated fiddle

代码包含以下行,其中innerRadious已更改为0。

pied_arc = d3.svg.arc()
    .innerRadius(00) // <- this
    .outerRadius(150);

这有点误导,因为在此之前某处有一个innerRadius变量,但此时并未使用它。当你在这里时,你可能想要调整所有这些东西。