【问题标题】:How to add a legend and labels to the pie chart?如何在饼图中添加图例和标签?
【发布时间】:2017-02-21 10:48:21
【问题描述】:

如何在 3 个饼图上添加图例(请参阅 this fiddle)。

我要指定浅蓝色对应图例“AAA”,中蓝色对应“BBB”,蓝色对应“CCC”。

我还想在每个馅饼中添加数值。我尝试了这种方法,但随后图表消失了:

var data = [
  [{"piece_value",76.34}, {"piece_value",69.05}, {"piece_value",275.19}],
  [{"piece_value",69.93}, {"piece_value",61.50}, {"piece_value",153.31}],
  [{"piece_value",83.51}, {"piece_value",69.14}, {"piece_value",204.32}]
];

svg.selectAll("path")
    .data(d3.layout.pie().value(function(d) { return d.piece_value; }))
  .enter().append("path")
    .attr("d", d3.svg.arc()
        .innerRadius(r / 2)
        .outerRadius(r))
    .style("fill", function(d, i) { return z(i); });

更新:

我也试过了,结果一样:

var pie = d3.layout.pie()
    .sort(null)
    .value(function(d) { return d.piece_value; });

svg.selectAll("path")
    .data(pie(data))
  .enter().append("path")
    .attr("d", d3.svg.arc()
        .innerRadius(r / 2)
        .outerRadius(r))
    .style("fill", function(d, i) { return z(i); });

【问题讨论】:

  • 您是在寻找特定的代码示例还是只是为了一些想法?您可以通过以声明方式添加 svg 组标记并将其定位在 元素中来添加图例,或者更好的是,只需使用常规 html 标记并相应地设置它们的样式。定位html标签会更容易。
  • @codeepic:我对 d3 和 JavaScript 没有什么经验。因此,我正在寻找我发布的小提琴中的具体代码片段。我也很感激我的代码中相应更改的详细 cmets。谢谢。

标签: javascript d3.js svg


【解决方案1】:

您的数据数组有问题。这个:

{"piece_value",76.34}

不是一个合适的对象。名称和值之间应该有一个冒号:

{"piece_value": 76.34}

所以,让我们为此更改您的数据:

var data = [
    [{"piece_value":76.34, name:"AAA"}, {"piece_value":69.05, name:"BBB"}, {"piece_value":275.19, name:"CCC"}],
    [{"piece_value":69.93, name:"AAA"}, {"piece_value":61.50, name:"BBB"}, {"piece_value":153.31, name:"CCC"}],
    [{"piece_value":83.51, name:"AAA"}, {"piece_value":69.14, name:"BBB"}, {"piece_value":204.32, name:"CCC"}]
];

并设置布局和弧生成器的变量:

var pie = d3.layout.pie()
    .sort(null)
    .value(function(d) {
        return d.piece_value;
    });

var arc = d3.svg.arc()
    .innerRadius(r / 2)
    .outerRadius(r);

要在每个饼图中添加值,您可以使用arc.centroid

svg.selectAll("foo")
    .data(pie)
    .enter()
    .append("text")
    .attr("text-anchor", "middle")
    .attr("transform", d => "translate(" + arc.centroid(d) + ")")
    .text(d => d.data.piece_value);

为了创建图例,使用内部数组添加矩形和文本:

svg.selectAll("foo")
    .data(d => d)
    .enter()
    .append("rect")

这里是演示:

var data = [
    [{
        "piece_value": 76.34,
        name: "AAA"
    }, {
        "piece_value": 69.05,
        name: "BBB"
    }, {
        "piece_value": 275.19,
        name: "CCC"
    }],
    [{
        "piece_value": 69.93,
        name: "AAA"
    }, {
        "piece_value": 61.50,
        name: "BBB"
    }, {
        "piece_value": 153.31,
        name: "CCC"
    }],
    [{
        "piece_value": 83.51,
        name: "AAA"
    }, {
        "piece_value": 69.14,
        name: "BBB"
    }, {
        "piece_value": 204.32,
        name: "CCC"
    }]
];

var m = 10,
    r = 100,
    z = d3.scale.category20c();

var svg = d3.select("body").selectAll("svg")
    .data(data)
    .enter().append("svg")
    .attr("width", (r + m) * 2)
    .attr("height", (r + m) * 2)
    .append("g")
    .attr("transform", "translate(" + (r + m) + "," + (r + m) + ")");

var pie = d3.layout.pie()
    .sort(null)
    .value(function(d) {
        return d.piece_value;
    });

var arc = d3.svg.arc()
    .innerRadius(r / 2.2)
    .outerRadius(r/1.2)

svg.selectAll("path")
    .data(pie)
    .enter().append("path")
    .attr("d", arc)
    .style("fill", function(d, i) {
        return z(i);
    });

svg.selectAll("foo")
    .data(pie)
    .enter()
    .append("text")
    .attr("text-anchor", "middle")
    .attr("transform", d => "translate(" + arc.centroid(d) + ")")
    .text(d => d.data.piece_value);
		
svg.selectAll("foo")
    .data(d=>d)
    .enter()
    .append("text")
		.attr("transform", (d,i)=>"translate(" + (-r + 2.5*m + (i * 70)) + "," +  (-r + m) + ")")
		.text(d=>d.name);
		
svg.selectAll("foo")
    .data(d=>d)
    .enter()
    .append("rect")
		.attr("transform", (d,i)=>"translate(" + (-r + m + (i * 70)) + "," +  (-r) + ")")
		.attr("width", 10)
		.attr("height", 10)
		.style("fill", (d, i) => z(i));
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

【讨论】:

  • 谢谢。这完美地解决了我问题的第二部分。至于图例,我想在所有饼图顶部看到一个水平图例,例如“浅蓝色 - AAA”、“蓝色 - BBB”、“深蓝色 - CCC”(当然,浅蓝色etc 应由具有相应颜色的小矩形替换)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多