D3.js:Placcin'圆环图圆弧上的文字
D3.js: Placin' the text on the arcs of the doughnut chart
我是D3.js的新手,一直在制作D3甜甜圈图。我试着在弧线上加上文字,但所有的弧线都在中间挤在一起。我尝试了在StackOverflow上找到的一些修复程序,但似乎都没有帮助。
代码:
var margin = {top :30, right: 30, bottom: 40, left: 50}
var height = 600,
width = document.getElementById('chart').clientWidth;
var outerRadius = height / 2 - 20,
innerRadius = outerRadius / 2,
cornerRadius = 10;
var pie = d3.layout.pie()
.sort(null)
.padAngle(.02);
var arc = d3.svg.arc()
.padRadius(outerRadius)
.innerRadius(innerRadius);
d3.tsv("data.tsv", function(error, data) {
var svg = d3.select("#chart").append("svg")
.style('background','#E7E0CB')
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
svg.selectAll("path")
.data(pie(thedata))
.enter().append("g")
.attr('class', 'slice')
var slice = d3.selectAll('g.slice')
.append('path')
.each(function(d) { d.outerRadius = outerRadius - 20; })
.attr("d", arc)
.attr('fill', function(d, i){return colors(i)})
.on("mouseover", arcTween(outerRadius, 0))
.on("mouseout", arcTween(outerRadius - 20, 150));
var text = d3.selectAll('g.slice')
.append('text')
.data(data)
.text(function(d , i){
return d.domain;
})
.attr('fill', 'white')
.attr('text-anchor', 'middle')
.attr('transform', function(d, i){
d.innerRadius =innerRadius;
d.outerRadius = outerRadius;
return 'translate('+arc.centroid(d)+')'
})
})
function arcTween(outerRadius, delay) {
return function() {
d3.select(this).transition().delay(delay).attrTween("d", function(d) {
var i = d3.interpolate(d.outerRadius, outerRadius);
return function(t) { d.outerRadius = i(t); return arc(d); };
});
};
}
这是数据.tsv:
value domain
17142857 Increment
2857143 Timber
115310 Fruits
这里很少有问题。
1.)你还没有给pie
函数一个访问器函数:
var pie = d3.layout.pie()
.sort(null)
.padAngle(.02)
.value(function(d) { return d.value; }); //<-- add this
2.)您的文本标签也需要绑定到pie(data)
,因为arc.centroid
需要该格式的数据。一旦你这样做,标签现在是d.data.domain
:
var text = d3.selectAll('g.slice')
.append('text')
.data(pie(data))
.text(function(d, i) {
return d.data.domain;
})
.attr('fill', 'white')
.attr('text-anchor', 'middle')
.attr('transform', function(d, i) {
d.innerRadius = innerRadius;
d.outerRadius = outerRadius;
return 'translate(' + arc.centroid(d) + ')'
});
完整工作代码:
<!DOCTYPE html>
<html>
<head>
<script data-require="d3@3.5.3" data-semver="3.5.3" src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.js"></script>
</head>
<body>
<script>
var margin = {
top: 30,
right: 30,
bottom: 40,
left: 50
}
var height = 600,
width = 600;
var outerRadius = height / 2 - 20,
innerRadius = outerRadius / 2,
cornerRadius = 10;
var pie = d3.layout.pie()
.sort(null)
.padAngle(.02)
.value(function(d) {
return d.value;
});
var arc = d3.svg.arc()
.padRadius(outerRadius)
.innerRadius(innerRadius);
var colors = d3.scale.category10();
//d3.csv("data.csv", function(error, data) {
var data = [{
"value": "17142857",
"domain": "Increment"
}, {
"value": "2857143",
"domain": "Timber"
}, {
"value": "115310",
"domain": "Fruits"
}];
var svg = d3.select("body").append("svg")
.style('background', '#E7E0CB')
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
svg.selectAll("path")
.data(pie(data))
.enter().append("g")
.attr('class', 'slice')
var slice = d3.selectAll('g.slice')
.append('path')
.each(function(d) {
d.outerRadius = outerRadius - 20;
})
.attr("d", arc)
.attr('fill', function(d, i) {
return colors(i)
})
.on("mouseover", arcTween(outerRadius, 0))
.on("mouseout", arcTween(outerRadius - 20, 150));
var text = d3.selectAll('g.slice')
.append('text')
.data(pie(data))
.text(function(d, i) {
return d.data.domain;
})
.attr('fill', 'white')
.attr('text-anchor', 'middle')
.attr('transform', function(d, i) {
d.innerRadius = innerRadius;
d.outerRadius = outerRadius;
return 'translate(' + arc.centroid(d) + ')'
})
// })
function arcTween(outerRadius, delay) {
return function() {
d3.select(this).transition().delay(delay).attrTween("d", function(d) {
var i = d3.interpolate(d.outerRadius, outerRadius);
return function(t) {
d.outerRadius = i(t);
return arc(d);
};
});
};
}
</script>
</body>
</html>
相关文章:
- D3.js模式不适用于弧形或圆环图
- D3从嵌套的JSON中绘制第二个圆环图
- 在同一个圆环图中使用不同的数据
- 如何在d3.js饼图或圆环图中添加阴影
- 如何更改圆环图中文本的颜色
- 修改d3.js圆环图以读取json数组
- 如何在chart.js中显示圆环图上的标签
- D3.js-带有多个圆环和动画过渡的圆环图
- 直接从代码笔复制的圆环图代码不起作用
- Highcharts没有内部饼图的圆环图
- c3.js圆环图onclick函数
- 如何使用d3js为循环中的圆环图添加工具提示
- 是否可以在ChartJS的圆环图中为分段添加更多属性
- 带标签的 D3 圆环图
- D3 圆环图 - 删除 0% 标签
- 将文本添加到 D3 圆环图的中心
- 圆环图未使用新值进行更新
- 如何在高图表中创建这样的饼图/圆环图
- 高图表:仅使用圆环图对饼图进行动画处理/防止内部大小动画
- D3.js:Placcin'圆环图圆弧上的文字