在d3.js圈中添加阴影效果

时间:2016-05-11 07:00:00

标签: javascript css3 d3.js svg

我想在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)");

但阴影是长方形的,我的圈子里面不停地移动文字标签。

2 个答案:

答案 0 :(得分:1)

以下是工作代码段。希望这会有所帮助。

来自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 :(得分:1)

可能您的滤镜尺寸需要更大(请记住默认尺寸为120%宽度/高度。)尝试类似:

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