D3 颜色渐变未围绕区域中心形成数学圆
D3 colour gradient not forming mathematical circle around centre of area
我正在尝试绘制一个带有颜色渐变的径向区域图来反映这一点。然而,渐变似乎并不想与圆完美地对齐/位于正确的一侧(见下图)。
我试过限制 svg 的宽度和高度,使它们相等,但是没有 avail.Every 刷新(使用随机数据),渐变的中心环将移动并扭曲成不同的形状,但永远不要位于它应该位于的平均线上。
我已经确保 svg 是方形的
var width = window.innerWidth , height = window.innerHeight;
width = height = d3.min([width,height])
var data = d3.range(0,100).map(d=>Math.random())
给定梯度以下属性
var linearGradient = defs.append("radialGradient")
.attr("id", "rad-gradient")
.attr("cx", "50%") //The x-center of the gradient, same as a typical SVG circle
.attr("cy", "50%") //The y-center of the gradient
.style("r", "50%");
我的区域在数学上是
var area = d3.area()
.x1(function(d,i) { return width/2+Math.cos(i\*angle)*(h(d)) }) .x0(function(d,i) { return > width/2+Math.cos(i\*angle)*(h(mean)) }) .y0(function(d,i) {> return height/2+Math.sin(i\*angle)*(h(mean)) }) .y1(function(d,i) { return height/2+Math.sin(i\*angle)*(h(d)) })
并将创建的渐变附加到 svg 路径
svg.append("path")
.data([data])
.attr("class", "area")
.attr("d", area)
.style("fill", "url(#rad-gradient)")
解决方法是创建一个圆并用正确的渐变填充它。这确保径向渐变始终以原点为中心。
然后您可以使用 clipPath 从圆中仅提取您希望使用的路径。在调整渐变半径之后,我们得到了想要的效果。
// previous definition for area path appended as a clip path
clip = defs.append("clipPath")
.attr('id','clip')
.append("path")
.data([data])
.attr("class", "area")
.attr("d", area)
//extracting this path from a circle with the desired gradient
svg.append("circle")
.attr("cx", width/2)
.attr("cy", height/2)
.attr("r", rmax)
.attr("clip-path","url(#clip)")
.style("fill", "url(#linear-gradient)")
我正在尝试绘制一个带有颜色渐变的径向区域图来反映这一点。然而,渐变似乎并不想与圆完美地对齐/位于正确的一侧(见下图)。
我试过限制 svg 的宽度和高度,使它们相等,但是没有 avail.Every 刷新(使用随机数据),渐变的中心环将移动并扭曲成不同的形状,但永远不要位于它应该位于的平均线上。
我已经确保 svg 是方形的
var width = window.innerWidth , height = window.innerHeight;
width = height = d3.min([width,height])
var data = d3.range(0,100).map(d=>Math.random())
给定梯度以下属性
var linearGradient = defs.append("radialGradient")
.attr("id", "rad-gradient")
.attr("cx", "50%") //The x-center of the gradient, same as a typical SVG circle
.attr("cy", "50%") //The y-center of the gradient
.style("r", "50%");
我的区域在数学上是
var area = d3.area()
.x1(function(d,i) { return width/2+Math.cos(i\*angle)*(h(d)) }) .x0(function(d,i) { return > width/2+Math.cos(i\*angle)*(h(mean)) }) .y0(function(d,i) {> return height/2+Math.sin(i\*angle)*(h(mean)) }) .y1(function(d,i) { return height/2+Math.sin(i\*angle)*(h(d)) })
并将创建的渐变附加到 svg 路径
svg.append("path")
.data([data])
.attr("class", "area")
.attr("d", area)
.style("fill", "url(#rad-gradient)")
解决方法是创建一个圆并用正确的渐变填充它。这确保径向渐变始终以原点为中心。
然后您可以使用 clipPath 从圆中仅提取您希望使用的路径。在调整渐变半径之后,我们得到了想要的效果。
// previous definition for area path appended as a clip path
clip = defs.append("clipPath")
.attr('id','clip')
.append("path")
.data([data])
.attr("class", "area")
.attr("d", area)
//extracting this path from a circle with the desired gradient
svg.append("circle")
.attr("cx", width/2)
.attr("cy", height/2)
.attr("r", rmax)
.attr("clip-path","url(#clip)")
.style("fill", "url(#linear-gradient)")