如何使用 D3js 向饼图添加图例?以及如何集中饼图? [英] how to add legend to a pie chart using D3js? And how to centralise the pie chart?
问题描述
<script type="text/javascript">
var w = 400, //width
h = 400, //height
r = 150, //radius
color = d3.scale.category20c(); //builtin range of colors
data = [
{"label":"Single", "value":<?php echo $PercentageSingle; ?>},
{"label":"In a relationship", "value":<?php echo $PercentageInRe; ?>},
{"label":"Engaged", "value":<?php echo $PercentageEngaged; ?>},
{"label":"Married", "value":<?php echo $PercentageMarried; ?>},
{"label":"In an open relationship", "value":<?php echo $PercentageInOpenRe; ?>},
{"label":"It's complicated", "value":<?php echo $PercentageCom; ?>},
{"label":"Separated", "value":<?php echo $PercentageSeparated; ?>},
{"label":"Divorced", "value":<?php echo $PercentageDivorced; ?>},
{"label":"Widowed", "value":<?php echo $PercentageWidowed; ?>},
{"label":"Unknown", "value":<?php echo $PercentageUnknown; ?>}
];
var vis = d3.select("body")
.append("svg:svg") //create the SVG element inside the <body>
.data([data]) //associate our data with the document
.attr("width", w) //set the width and height of our visualization (these will be attributes of the <svg> tag
.attr("height", h)
.append("svg:g") //make a group to hold our pie chart
.attr("transform", "translate(" + r + "," + r + ")") //move the center of the pie chart from 0, 0 to radius, radius
var arc = d3.svg.arc() //this will create <path> elements for us using arc data
.outerRadius(r);
var pie = d3.layout.pie() //this will create arc data for us given a list of values
.value(function(d) { return d.value; }); //we must tell it out to access the value of each element in our data array
var arcs = vis.selectAll("g.slice") //this selects all <g> elements with class slice (there aren't any yet)
.data(pie) //associate the generated pie data (an array of arcs, each having startAngle, endAngle and value properties)
.enter() //this will create <g> elements for every "extra" data element that should be associated with a selection. The result is creating a <g> for every object in the data array
.append("svg:g") //create a group to hold each slice (we will have a <path> and a <text> element associated with each slice)
.attr("class", "slice"); //allow us to style things in the slices (like text)
arcs.append("svg:path")
.attr("fill", function(d, i) { return color(i); } ) //set the color for each slice to be chosen from the color function defined above
.attr("d", arc); //this creates the actual SVG path using the associated data (pie) with the arc drawing function
arcs.append("svg:text") //add a label to each slice
.attr("transform", function(d) { //set the label's origin to the center of the arc
//we have to make sure to set these before calling arc.centroid
d.innerRadius = 0;
d.outerRadius = r;
return "translate(" + arc.centroid(d) + ")"; //this gives us a pair of coordinates like [50, 50]
})
.attr("text-anchor", "middle") //center the text on it's origin
.text(function(d, i) { return data[i].label; }); //get the label from our original data array
</script>
我用上面的代码生成了一个饼图,但是显示的时候总是在网页的左边,我怎么才能把它集中起来呢?此外,当幻灯片非常小时,文本会挤在一起,那么我如何为其添加图例而不是在每张幻灯片中显示文本?
I used the above code to generate a pie chart, however it's always at the left side of the web page when display, how can I centralise it? Also, when the slide is very small, the text will squeeze together, so how can i add legend to it instead of display the text inside each slide?
推荐答案
图例只是添加到 svg 的矩形和文本.在 vida.io 上查看人口饼图模板.它在图表中内置了图例:
Legends are just rectangle and text you append to svg. Check out population pie chart template on vida.io. It has legend built into the chart:
https://vida.io/documents/gSvr8dAH23eirKQDp
要使图表居中,请更改 svg 中的翻译参数.您现在已将其设置为 r.你可以这样做,(width/2 - r) 和 (height/2 - r).
To center the chart, change translate parameter in svg. You have it set to r right now. You can do something like, (width / 2 - r) and (height / 2 - r).
var svg = d3.select("#canvas").append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + (width / 2 - r) + "," + (height / 2 - r) + ")");
这篇关于如何使用 D3js 向饼图添加图例?以及如何集中饼图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!