D3 SVG 路径未填充线性比例渐变

Posted

技术标签:

【中文标题】D3 SVG 路径未填充线性比例渐变【英文标题】:D3 SVG path is not filling with linear scale gradient 【发布时间】:2022-01-19 01:51:09 【问题描述】:

我有一个 SVG,我的目标是某个路径元素,id 为:_116

通过这样做,我可以轻松地用纯色填充路径:

 d3.select("path#_116").style("fill", 'blue');

但是,假设我有一个线性比例颜色,所以我想对其应用渐变:

let scale = d3.scaleLinear()
    .domain([1,10])
    .range(["white", "blue"]);

d3.select("path#_116").style("fill", scale);

这行不通。出于某种原因,它将填充设置为黑色(#212a39),这似乎来自兄弟元素,如下所示:

对这里发生的事情有什么想法吗?

【问题讨论】:

【参考方案1】:

缩放函数将为提供的值返回单一颜色(对于所有 D3 缩放函数都是如此),这可能解释了您所看到的输出。默认情况下,比例尺不固定,因此比例尺将插入域外的值并返回范围外的值,这解释了为什么您的值似乎不适合您的域。

缩放函数不会修改 DOM,但渐变需要 SVG 中的元素来表示渐变。通常渐变是 defs 标签的子元素:

<svg>
    <defs>
      <linearGradient id="gradient">
        <stop stop-color="white" offset="0%"/>
        <stop stop-color="blue" offset="100%"/>
      </linearGradient>
     </defs>
     <rect width=300 height=100 fill="url(#gradient)"></rect>
</svg>

如果您有一个现有的 SVG 并且想要修改单个路径,我们可以附加定义、渐变、停止,并将其应用于给定路径:

d3.xml("https://upload.wikimedia.org/wikipedia/commons/a/ab/Isobates-simple_example.svg")
   .then(function(image)   

    let svg = d3.select("body")
      .append(()=>image.documentElement);
      
    let gradient = svg.append("defs")
      .append("linearGradient")
      .attr("id","gradient");
      
    gradient.append("stop")
       .attr("stop-color","white")
       .attr("offset","0%")
      
    gradient.append("stop")
        .attr("stop-color","blue")
        .attr("offset","100%");
        
    svg.selectAll("#path3156")
      .style("fill", "url(#gradient)");
)
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.1.0/d3.min.js"&gt;&lt;/script&gt;

有一些方法可以更有效地做到这一点,但通常你会在 DOM 中实现相同的结构(使用 .append() 和 .html() 可以节省一些行)。而且 D3 也是完全可选的 - 这只是向 DOM 添加一些元素并设置现有元素的填充。

您的问题似乎与单一梯度有关,但如果我们有许多梯度,如果我们希望梯度是数据驱动的并将缩放合并到混合中,那么答案会变得有点复杂。既然我不认为你在问这个问题,我将把它留到另一个时间。

【讨论】:

以上是关于D3 SVG 路径未填充线性比例渐变的主要内容,如果未能解决你的问题,请参考以下文章

如何给SVG填充和描边应用径向渐变

如何给SVG填充和描边应用线性渐变

React.js - 使用 svg 线性渐变不起作用

如何给SVG填充和描边应用线性渐变

html D3byEX 5.5:线性比例(适用于D3.js v4)

SVG入门