代码之家  ›  专栏  ›  技术社区  ›  four-eyes

将不透明度添加到d3 colorScale

  •  2
  • four-eyes  · 技术社区  · 7 年前

    有没有办法告诉我 d3 在图像中使用不透明度 colorScale ?

    假设我有

    const colorScale = scaleLinear()
        .range(colorRamp)
        .clamp(true);
    

    哪里 colorRamp

    const colorRamp = ["#ff70....", ] <- 30 colors in the array
    

    有没有办法告诉我 d3 colorScale 要使用不透明度?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Andrew Reid    7 年前

    可以使用d3比例指定rgba颜色以在填充中包含不透明度:

    var color = d3.scaleLinear()
      .domain([1,10])
      .range(["rgba(0,0,0,0)","rgba(0,0,0,1)"]);
    

    var color = d3.scaleLinear()
      .domain([1,10])
      .range(["rgba(0,0,0,0)","rgba(0,0,0,1)"]);
      
    var svg = d3.select("body")
       .append("svg");
    
    var background = svg.append("rect")
      .attr("width",500)
      .attr("height",200)
      .attr("fill","orange");
       
    var rects = svg.selectAll(null)
      .data(d3.range(10))
      .enter()
      .append("circle")
      .attr("cy",50)
      .attr("cx",function(d) { return d*15+15; })
      .attr("fill", function(d) { return color(d); })
      .attr("r",6);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.11.0/d3.min.js"></script>

    如果使用使用十六进制值的颜色渐变,可以将其转换为使用rgb值,并在之后添加不透明度/alpha值,我只是将相同的不透明度应用于此处的每种颜色,但很容易修改它:

    var ramp = ["#ff0000","#0000ff"];
    
    ramp = ramp.map(function(color) {
      color = color.substring(1);
      color.split("");
      var i = 0;
      var r = parseInt(color[i++],16)*16+parseInt(color[i++],16);
      var g = parseInt(color[i++],16)*16+parseInt(color[i++],16);
      var b = parseInt(color[i++],16)*16+parseInt(color[i++],16);
    
      r = Math.round(r/2.56);
      g = Math.round(g/2.56);
      b = Math.round(b/2.56);
      
      opacity = 0.5; 
      return "rgba("+r+","+g+","+b+","+opacity+")";
    })
    
    console.log(ramp);
    
    var color = d3.scaleLinear()
      .domain([1,10])
      .range(ramp);
      
    var svg = d3.select("body")
       .append("svg");
    
    var rects = svg.selectAll(null)
      .data(d3.range(10))
      .enter()
      .append("circle")
      .attr("cy",50)
      .attr("cx",function(d) { return d*15+15; })
      .attr("fill", function(d) { return color(d); })
      .attr("r",6);
    <脚本src=”https://cdnjs.cloudflare.com/ajax/libs/d3/4.11.0/d3.min.js“></script>