代码之家  ›  专栏  ›  技术社区  ›  Edgar Quintero

将边界半径属性添加到D3js圆环图

  •  3
  • Edgar Quintero  · 技术社区  · 7 年前

    我目前在AngularJS应用程序中使用了这个甜甜圈图表:

    enter image description here

    但是设计模型说我们希望这样,请注意圆弧绿色部分的边界半径属性:

    enter image description here

    如何向d3js输出的SVG添加边界半径,我当前使用的代码如下所示:

    let data = [
        {
            label: 'Data',
            count: scope.data
        },
        {
            label: 'Fill',
            count: 100 - scope.data
        }
    ];
    
    let width = 60;
    let height = 60;
    let radius = Math.min(width, height) / 2;
    let color = d3.scale
        .ordinal()
        .range(['#3CC692', '#F3F3F4']);
    let selector = '#donut-asset-' + scope.chartId;
    
    d3
        .select(selector)
        .selectAll('*')
        .remove();
    
    let svg = d3
        .selectAll(selector)
        .append('svg')
        .attr('width', width)
        .attr('height', height)
        .append('g')
        .attr(
            'transform',
            'translate(' + width / 2 + ',' + height / 2 + ')'
        );
    let arc = d3.svg
        .arc()
        .innerRadius(23)
        .outerRadius(radius);
    let pie = d3.layout
        .pie()
        .value(function(d) {
            return d.count;
        })
        .sort(null);
    let path = svg
        .selectAll('path')
        .data(pie(data))
        .enter()
        .append('path')
        .attr('d', arc)
        .attr('fill', function(d, i) {
            return color(d.data.label);
        });
    let legend = svg
        .selectAll('.legend')
        .data(data)
        .enter()
        .append('g')
        .attr('class', 'legend')
        .attr('transform', function(d, i) {
            return 'translate(' + 0 + ',' + 0 + ')';
        });
    legend
        .append('text')
        .attr('x', 1)
        .attr('y', 1)
        .attr('text-anchor', 'middle')
        .attr('dominant-baseline', 'central')
        .text(function(d) {
            return d.count + '%';
        });
    

    };

    我知道如何使用 cornerRadius 但当我这样做时,它为两条弧都设置了半径,它只需要存在于彩色弧上。有什么想法吗?提前感谢您的帮助!

    2 回复  |  直到 7 年前
        1
  •  8
  •   Snowbases    3 年前

    您可以将角半径应用于d3圆弧,该圆弧允许在角上圆角:

    let arc = d3.svg
        .arc()
        .innerRadius(23)
        .outerRadius(radius)
        .cornerRadius(10);
    

    但是,缺点是所有圆弧的边界都是圆形的:

    enter image description here

    如果仅将“拐角半径”(cornerRadius)应用于变暗的圆弧,则其他圆弧不会填充圆角后面的背景。相反,我们可以附加一个圆弧(完整的甜甜圈),然后将变暗的圆弧放在顶部,并进行取整(我的示例并没有修改您的代码,只是展示了如何实现这一点,d3v4也使用 d3.arc() 而不是 d3.svg.arc() ):

    var backgroundArc = d3.arc()
      .innerRadius(30)
      .outerRadius(50)
      .startAngle(0)
      .endAngle(Math.PI*2);
      
    var mainArc = d3.arc()
      .innerRadius(30)
      .outerRadius(50)
      .cornerRadius(10)
      .startAngle(0)
      .endAngle(function(d) { return d/100*Math.PI* 2 });
      
    var data = [10,20,30,40,50] // percents.
      
    var svg = d3.select("body").append("svg")
      .attr("width", 600)
      .attr("height", 200);
      
    var charts = svg.selectAll("g")
      .data(data)
      .enter()
      .append("g")
      .attr("transform",function(d,i) { 
         return "translate("+(i*100+50)+",100)";
      });
      
    charts.append("path")
      .attr("d", backgroundArc)
      .attr("fill","#ccc")
    
    charts.append("path")
      .attr("d", mainArc) 
      .attr("fill","orange")
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.0/d3.min.js"></script>
        2
  •  0
  •   marc_s    7 年前

    尝试使用笔划属性,如:

    • (打、击等的)一下
    • 笔划dasharray
    • 笔划dashoffset
    • 笔划线条帽
    • 笔划线条连接
    • 笔划斜接限制
    • 笔划不透明度
    • 笔划宽度

    并将条的宽度设置为较低的值或0。

    参考: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute

    但更好的方法是在画布上绘制图表,因为你可以画出你想要的任何东西。或者使用图书馆。