【发布时间】:2017-02-21 16:33:14
【问题描述】:
我有这些数据:
var data = [
[
{"piece_value":76.34,name:"AG",group:"G1"},
{"piece_value":69.05,name:"A3",group:"G1"},
{"piece_value":275.19,name:"A4",group:"G1"}
],
[
{"piece_value":69.93,name:"AG",group:"G2"},
{"piece_value":61.50,name:"A3",group:"G2"},
{"piece_value":153.31,name:"A4",group:"G2"}
],
[
{"piece_value":67.48,name:"AG",group:"G3"},
{"piece_value":58.03,name:"A3",group:"G3"},
{"piece_value":145.93,name:"A4",group:"G3"}
]
];
我有 3 个饼图(参见代码 sn-p)。我想将相应的group 值放在每个饼图的顶部,并将图例移动到右侧(垂直图例)。问题是现在我有 3 个图例(每个饼图一个),但实际上它总是相同的图例。因此,我不想将其复制 3 次,而是希望在右侧有一个图例,同时将 group 值作为标题。
如何做到这一点?
var data = [
[
{"piece_value":76.34,name:"AG",group:"G1"},
{"piece_value":69.05,name:"A3",group:"G1"},
{"piece_value":275.19,name:"A4",group:"G1"}
],
[
{"piece_value":69.93,name:"AG",group:"G2"},
{"piece_value":61.50,name:"A3",group:"G2"},
{"piece_value":153.31,name:"A4",group:"G2"}
],
[
{"piece_value":67.48,name:"AG",group:"G3"},
{"piece_value":58.03,name:"A3",group:"G3"},
{"piece_value":145.93,name:"A4",group:"G3"}
]
];
var m = 10,
r = 90,
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>
【问题讨论】:
标签: javascript d3.js svg