在d3.js圆形中添加投影效果

4

我想在d3.js圆形中添加阴影,我已经成功做到这一点,但阴影是矩形而不是圆形。

我添加阴影的方式

var defs = svg.append("defs");
    // create filter with id #drop-shadow
    // height=130% so that the shadow is not clipped
    var filter = defs.append("filter")
        .attr("id", "drop-shadow")
        .attr("height", "130%");

    // SourceAlpha refers to opacity of graphic that this filter will be applied to
    // convolve that with a Gaussian with standard deviation 3 and store result
    // in blur
    filter.append("feGaussianBlur")
        .attr("in", "SourceAlpha")
        .attr("stdDeviation", 5)
        .attr("result", "blur");

    // translate output of Gaussian blur to the right and downwards with 2px
    // store result in offsetBlur
    filter.append("feOffset")
        .attr("in", "blur")
        .attr("dx", 5)
        .attr("dy", 5)
        .attr("result", "offsetBlur");

    // overlay original SourceGraphic over translated blurred opacity by using
    // feMerge filter. Order of specifying inputs is important!
    var feMerge = filter.append("feMerge");

    feMerge.append("feMergeNode")
        .attr("in", "offsetBlur")
    feMerge.append("feMergeNode")
        .attr("in", "SourceGraphic");


    var nodes = svg.selectAll("circle")
      .data(data);

    nodes.enter().append("circle")
      .attr("class", function (d, i) { return " circle_"+d.sentiment+" circle_"+i})
      .attr("cx", function (d) { return d.x; })
      .attr("cy", function (d) { return d.x; })
      .attr("r", function (d) { return d.radius; })
      .style('fill', function(d) {
       return colors["sentiment"][d["sentiment"]];
       })
      .style("filter", "url(#drop-shadow)");

但是阴影是矩形的,我的圆圈一直在移动,并带有一个内部文本标签。

我似乎找不到一种模糊圆形的方法,因为它最终会调整圆周周围的白色空间。我知道这不是一个解决方案,但或许一个低透明度的灰色圆形可以解决问题?例如:http://jsfiddle.net/thatOneGuy/0nv4ck58/1/ - thatOneGuy
2个回答

5
这是可工作的代码片段,希望这可以帮到您。

Referred from here.

var svg = d3.select("svg");
var defs = svg.append("defs");


var dropShadowFilter = defs.append('svg:filter')
  .attr('id', 'drop-shadow')
  .attr('filterUnits', "userSpaceOnUse")
  .attr('width', '250%')
  .attr('height', '250%');
dropShadowFilter.append('svg:feGaussianBlur')
  .attr('in', 'SourceGraphic')
  .attr('stdDeviation', 2)
  .attr('result', 'blur-out');
dropShadowFilter.append('svg:feColorMatrix')
  .attr('in', 'blur-out')
  .attr('type', 'hueRotate')
  .attr('values', 180)
  .attr('result', 'color-out');
dropShadowFilter.append('svg:feOffset')
  .attr('in', 'color-out')
  .attr('dx', 3)
  .attr('dy', 3)
  .attr('result', 'the-shadow');
dropShadowFilter.append('svg:feBlend')
  .attr('in', 'SourceGraphic')
  .attr('in2', 'the-shadow')
  .attr('mode', 'normal');


var data = [{
  sentiment: 5,
  x: 100,
  y: 200,
  radius: 5
}, {
  sentiment: 10,
  x: 250,
  y: 250,
  radius: 15
}];

var nodes = svg.selectAll("circle")
  .data(data);

nodes.enter().append("circle")
  .attr("class", function(d, i) {
    return " circle_" + d.sentiment + " circle_" + i
  })
  .attr("cx", function(d) {
    return d.x;
  })
  .attr("cy", function(d) {
    return d.x;
  })
  .attr("r", function(d) {
    return d.radius;
  })
  .style('fill', "blue")
  .style("filter", "url(#drop-shadow)");
svg {
  background: white;
  border: 2px solid black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<svg width=500 height=500 />


1

你的滤镜尺寸可能需要更大(记住默认尺寸是宽度/高度的120%)。尝试使用以下尺寸:

var filter = defs.append("filter")
    .attr("id", "drop-shadow")
    .attr("width", "300%")
    .attr("height", "300%");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接