【问题标题】:How to increase size of pie segment on hover in d3如何在 d3 中悬停时增加饼图段的大小
【发布时间】:2015-08-29 06:27:04
【问题描述】:

我使用 d3 创建了饼图。 如何在悬停时增加饼图的大小? 如您所见,绿色段太小了,所以我想像红色段一样改变它的大小。我该怎么做?

我的代码:

var w = 400;
var h = 400;
var r = h/2;
var color = d3.scale.category20c();

var data = [{"label":"Category A", "value":20}, 
                  {"label":"Category B", "value":50}, 
                  {"label":"Category C", "value":30},
           {"label":"Category A", "value":20}, 
                  {"label":"Category B", "value":50}, 
                  {"label":"Category C", "value":30},
           {"label":"Category A", "value":20}, 
                  {"label":"Category B", "value":50}, 
                  {"label":"Category C", "value":5}];


var vis = d3.select('#chart').append("svg:svg").data([data]).attr("width", w).attr("height", h).append("svg:g").attr("transform", "translate(" + r + "," + r + ")");
var pie = d3.layout.pie().value(function(d){return d.value;});

// declare an arc generator function
var arc = d3.svg.arc().outerRadius(r);
var arcOver = d3.svg.arc()
        .outerRadius(r + 9);

// select paths, use arc generator to draw
var arcs = vis.selectAll("g.slice").data(pie).enter().append("svg:g").attr("class", "slice");
arcs.append("svg:path")
    .attr("fill", function(d, i){
        return color(i);
    })
    .attr("d", function (d) {
        // log the result of the arc generator to show how cool it is :)
        console.log(arc(d));
        return arc(d);
    })
     .on("mouseenter", function(d) {
            d3.select(this)
               .attr("stroke","white")
               .transition()
               .duration(1000)
               .attr("d", arcOver)             
               .attr("stroke-width",6);
        })
        .on("mouseleave", function(d) {
            d3.select(this).transition()            
               .attr("d", arc)
               .attr("stroke","none");
        });;

js fiddle中有一个例子:jsfiddle 谢谢。

【问题讨论】:

    标签: javascript d3.js pie-chart c3


    【解决方案1】:

    现在这是正确的代码。试试看..好的

    <!DOCTYPE html>
    <html>
    
    <head>
      <title>Dsnap - Charts</title>
    </head>
    
    <body>
      <div id="wrapper">
    
      </div>
      <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
      <script>
        var canvas = d3.select('#wrapper')
          .append('svg')
          .attr({
            'width': 650,
            'height': 500
          });
    
        var data = [{
          "label": "one",
          "value": 40
        }, {
          "label": "two",
          "value": 30
        }, {
          "label": "three",
          "value": 30
        }];
    
        var colors = ['red', 'blue'];
    
        var colorscale = d3.scale.linear().domain([0, data.length]).range(colors);
    
        var arc = d3.svg.arc()
          .innerRadius(0)
          .outerRadius(100);
    
        var arcOver = d3.svg.arc()
          .innerRadius(0)
          .outerRadius(150 + 10);
    
        var pie = d3.layout.pie()
          .value(function(d) {
            return d.value;
          });
    
    
        var renderarcs = canvas.append('g')
          .attr('transform', 'translate(440,200)')
          .selectAll('.arc')
          .data(pie(data))
          .enter()
          .append('g')
          .attr('class', "arc");
    
        renderarcs.append('path')
          .attr('d', arc)
          .attr('fill', function(d, i) {
            return colorscale(i);
          })
          .on("mouseover", function(d) {
            d3.select(this).transition()
              .duration(1000)
              .attr("d", arcOver);
          })
          .on("mouseout", function(d) {
            d3.select(this).transition()
              .duration(1000)
              .attr("d", arc);
          });
    
        renderarcs.append('text')
          .attr('transform', function(d) {
            var c = arc.centroid(d);
            console.log(c);
            return "translate(" + c[0] + "," + c[1] + ")";
          })
          .text(function(d) {
            return d.value + "%";
          });
      </script>
    </body>
    
    </html>

    【讨论】:

    • 感谢您的回答。您在点击时更改数据,但我不需要更改它。我想在不更改数据的情况下增加细分。
    • 如果您能解释“这是正确的代码”之外的内容,那就太好了——您更改了什么以及为什么更改?代码是如何实现功能的?
    • @LarsKotthoff,我检查了这段代码,但它不起作用。
    【解决方案2】:

    我刚刚找到了解决问题的方法。

    我在 d3 中更改了 startAngleendAngle

    .on("mouseenter", function(d) {
    
             var endAngle = d.endAngle + 0.2;
             var startAngle = d.startAngle - 0.2;
    
                  var arcOver = d3.svg.arc()
        .outerRadius(r + 9).endAngle(endAngle).startAngle(startAngle);
    
            d3.select(this)
               .attr("stroke","white")
               .transition()
               .duration(1000)
               .attr("d", arcOver)             
               .attr("stroke-width",6);
        })
    

    工作示例:jsfiddle

    【讨论】:

      猜你喜欢
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多