我想在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)");
但阴影是长方形的,我的圈子里面不停地移动文字标签。
答案 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%");