我正在使用D3.js的内置弧函数为我的数据生成SVG <path>
。
.attr("d", function(element, index) {
var arc = d3.arc()
.innerRadius(iR)
.outerRadius(iR + 10)
.startAngle(element[1])
.endAngle(element[2])
.cornerRadius(isRounded ? cR : 0);
return arc();
});
这很好用,但我想绕一些圆弧的一边(两个角)。然而,当角落半径与.cornerRadius()
一起提供时,它会使所有四个角都圆。
我知道有various ways来选择性地围绕矩形的角落,但我希望有一些通用的方法来为弧做这个。
我还看到this question关于仅对圆弧的某些角进行四舍五入,但它没有答案(自发布以来D3 v4已经出现)。
答案 0 :(得分:2)
即使使用v4
API,仍然没有直接的方法来执行此操作。查看源代码,cornerRadius成为计算整个弧(所有4个角)的固定值。最简单的修复就是为每个数据点添加两个弧,第二个弧只填充角落。
示例,假设我们有这个非常圆的弧:
var myArcs = [
[0, 45],
[180, 300]
];
var vis = d3.select('body')
.append('svg')
.attr('width', 400)
.attr('height', 400);
var arc = d3.arc()
.innerRadius(80)
.outerRadius(150)
var someArcs = vis.selectAll('path')
.data(myArcs)
.enter();
someArcs
.append("path")
.attr("transform", "translate(200,200)")
.attr("d", function(d) {
arc.startAngle(d[0] * (Math.PI / 180))
.endAngle(d[1] * (Math.PI / 180))
.cornerRadius(20);
return arc();
})
.attr("fill", function(d, i) {
return d3.schemeCategory10[i];
});
<script data-require="d3@4.0.0" data-semver="4.0.0" src="https://d3js.org/d3.v4.min.js"></script>
我的修复方式如下:
var myArcs = [
[0, 45],
[180, 300]
];
var vis = d3.select('body')
.append('svg')
.attr('width', 400)
.attr('height', 400);
var arc = d3.arc()
.innerRadius(80)
.outerRadius(150)
var someArcs = vis.selectAll('path')
.data(myArcs)
.enter();
someArcs
.append("path")
.attr("transform", "translate(200,200)")
.attr("d", function(d) {
arc.startAngle(d[0] * (Math.PI / 180))
.endAngle(d[1] * (Math.PI / 180))
.cornerRadius(20);
return arc();
})
.attr("fill", function(d, i) {
return d3.schemeCategory10[i];
});
someArcs
.append("path")
.attr("transform", "translate(200,200)")
.attr("d", function(d) {
arc.startAngle(d[0] * (Math.PI / 180))
.endAngle((d[0] + 10) * (Math.PI / 180))
.cornerRadius(0);
return arc();
})
.attr("fill", function(d, i) {
return d3.schemeCategory10[i];
});
<script data-require="d3@4.0.0" data-semver="4.0.0" src="https://d3js.org/d3.v4.min.js"></script>