未能改变弧的半径

时间:2017-09-27 09:52:28

标签: javascript d3.js

我正在尝试扩展在我的饼图中创建的弧的outerRadius。鼠标悬停时,我看不到怎么做。我试图使用我之前制作的更大的outerRadius(bArc)创建一个新弧,并将其应用于我的路径属性“d”

d3.select(this).select("path").attr("d", bArc);

在路径上的鼠标悬停事件中

path.on("mouseover", function(d){

但无济于事,控制台没有错误。我有点不知所措,我在这个问题上找到的所有资源似乎都很旧,并且已经弃用了v4。

我做了这个小提琴:

https://jsfiddle.net/sw8h0uvj/

1 个答案:

答案 0 :(得分:1)

这一行...

d3.select(this).select("svg").attr("d", bArc);

......没什么意义。您必须将更改应用于DOM元素,这只是this。因此,它应该是:

d3.select(this).attr("d", bArc);

执行d时,不要忘记更改mouseout属性。

以下是包含这些更改的代码:



var data = [{
    label: '0-24%',
    color: "#ff875e",
    highlight: "#ff7a4d",
    value: 3,
  },

  {
    label: '25%-49%',
    color: "#f6bc58",
    highlight: "#f5b13d",

    value: 1,
  },

  {
    label: '50%-74%',
    color: "#eae860",
    highlight: "#e7e54b",

    value: 2,
  },

  {
    label: '75%-100%',
    color: "#85d280",
    highlight: "#80d07b",

    value: 3,

  }
];


var tooltip = d3.select('body')
  .append('div')
  .attr('class', 'tooltip2')
  .style("opacity", 0);


var width = 360;
var height = 360;
var radius = Math.min(width, height) / 2.5;
var outerRadius = height / 2 - 20;

//D3 allows colours to be defined as a range, beneath is input the ranges in same order as our data set above. /Nicklas

var color = d3.scaleOrdinal()
  .range(['#ff875e', '#f6bc58', '#eae860', '#85d280']);

var svg = d3.select('#piechart2')
  .append('svg')
  .attr('width', width)
  .attr('height', height)
  .append('g')
  .attr('transform', 'translate(' + (width / 2) +
    ',' + (height / 2) + ')');

var arc = d3.arc()
  .innerRadius(0)
  .outerRadius(radius)
  .padAngle(.05)
  .padRadius(radius / 5);

var bArc = d3.arc()
  .innerRadius(0)
  .outerRadius(radius * 1.1)
  .padAngle(.05)
  .padRadius(radius / 5);

var pie = d3.pie()
  .value(function(d) {
    return d.value;
  })
  .sort(null);


var path = svg.selectAll('path')

.data(pie(data))
  .enter()
  .append('path')
  .attr('d', arc)
  .attr('fill', function(d) {
    return color(d.data.color);
  });


path.transition()
  .duration(500)
  .attrTween("d", tweenPie);


path.on("mouseover", function(d) {

  tooltip.transition()
    .duration(200)
    .style("opacity", .9)
    .style("display", null)
    .text(d.data.label + ": " + d.data.value);

  d3.select(this).transition()
    .duration(500)
    .style('fill', d.data.highlight)
    .attr("d", bArc);

});

path.on("mousemove", function() {

  tooltip.style("top", (event.pageY - 10) + "px").style("left", (event.pageX + 10) + "px");
});

path.on("mouseout", function(d) {

  d3.select(this).transition()
    .duration(500)
    .style('fill', d.data.color)
    .attr("d", arc);
  
  
  tooltip.transition()
    .duration(300)
    .style("opacity", 0);

});

function tweenPie(b) {
  b.innerRadius = 0;
  var i = d3.interpolate({
    startAngle: 0,
    endAngle: 0
  }, b);
  return function(t) {
    return arc(i(t));
  };
}

.tooltip2 {
  position: absolute;
  text-align: center;
  width: auto;
  height: 28px;
  padding: 2px;
  font: 18px sans-serif;
  background: lightsteelblue;
  border: 0px;
  border-radius: 8px;
  pointer-events: none;
}

<script src="https://d3js.org/d3.v4.min.js"></script>
<div id="piechart2" style="text-align:center; margin-bottom:1em;">
</div>
&#13;
&#13;
&#13;