作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是这个主题的新手,我正在尝试使用 D3.js v4 构建一个简单的半饼图/半圆环图。结果应类似于以下示例中的图表:http://bl.ocks.org/dbuezas/9306799 .
我的问题是标签的位置和这些标签的线条。
这是我当前的代码:
<!DOCTYPE html>
<meta charset="utf-8">
<body>
<script src="http://d3js.org/d3.v4.min.js"></script>
<script>
var data = [
{name: "ABC", val: 11975},
{name: "DEF", val: 5871},
{name: "GEH", val: 8916}
];
var margin = {
top: 40,
right: 40,
bottom: 40,
left: 40
};
var width = 800 - margin.right - margin.left;
var height = 400 - margin.top - margin.bottom;
var radius = 300;
var svg = d3.select('body')
.append('svg')
.attr('width', width)
.attr('height', height)
.append('g')
.attr('transform', 'translate(' + width / 2 + ',' + height + ')');
svg.append('g')
.attr('class', 'slices');
svg.append('g')
.attr('class', 'labels');
svg.append('g')
.attr('class', 'lines');
var color = d3.scaleOrdinal(d3.schemeCategory20);
var pie = d3.pie()
.sort(null)
.value(function (d) {
return d.val;
})
.startAngle(-90 * (Math.PI / 180))
.endAngle(90 * (Math.PI / 180));
// donut chart arc
var arc = d3.arc()
.innerRadius(radius - 100)
.outerRadius(radius - 50);
var slice = svg.select('.slices')
.selectAll('path.slice')
.data(pie(data));
slice.enter()
.append('path')
.attr('d', arc)
.attr('fill', function (d) {
return color(d.data.name);
})
.attr('class', 'slice');
var sliceDots = svg.select('.slices')
.selectAll('circle')
.data(pie(data));
sliceDots.enter()
.append('circle')
.attr('class', 'dot')
.attr('cx', function (d) {
return arc.centroid(d)[0];
})
.attr('cy', function (d) {
return arc.centroid(d)[1];
})
.attr('r', 2)
.attr('fill', 'black');
// label arc
var labelArc = d3.arc()
.innerRadius(radius * 0.9)
.outerRadius(radius * 0.9);
var labels = svg.select('.labels')
.selectAll('text')
.data(pie(data));
labels.enter()
.append('text')
.attr('dy', '.35em')
.attr('text-anchor', 'middle')
.attr('class', 'labels')
.text(function (d) {
return d.data.name;
})
.attr('transform', function (d) {
return 'translate(' + labelArc.centroid(d)[0] + ',' + labelArc.centroid(d)[1] + ')';
});
// lines
var polyline = svg.select('.lines')
.selectAll('polyline')
.data(pie(data));
polyline.enter()
.append('polyline')
.attr('stroke-width', '2px')
.attr('stroke', 'black')
.attr('opacity', '0.4')
.attr('points', function (d) {
return [arc.centroid(d), labelArc.centroid(d)];
});
</script>
</body>
有没有简单的解决方案?
最佳答案
我相信使用质心是一种很好的方法,所以我只是添加了 getTextWidth(来自此处:Calculate text width with JavaScript)方法来确定值标签的长度,然后将其向左移动。
.attr("transform", function (d) {
var textWidth = getTextWidth(d.data.val.toString(), "Arial");
return "translate(" + (arc.centroid(d)[0] - textWidth) + "," + arc.centroid(d)[1] + ")";
})
这是一个 JSFiddle:https://jsfiddle.net/w6d4hcb9/2/
关于javascript - D3 - 在半饼图/半圆环图上放置标签和线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42937527/
我是一名优秀的程序员,十分优秀!