【问题标题】:D3 legend for a color scale色标的 D3 图例
【发布时间】:2017-08-29 00:33:12
【问题描述】:

我有这样的色标

var colorscale=colorbrewer['RdYlGn']['11'].reverse();
var color=d3.scaleQuantize()
  .domain([0,360,1600])
  .range(colorscale);

我正在尝试将该色标显示为跨越我的 SVG 底部的图例

function drawColorScale(){
  var pallete=svg.append('g')
    .attr('id','pallete')
  var swatch=pallete.selectAll('rect').data(colorscale);
  swatch.enter().append('rect')
    .attr('fill',function(d){
      return d;//return rgb
    })
   .attr('x',function(d,i){
     return (i*30)+'';
    })
    .attr('y',function(d,i){
      return (height-12)+'';
    })
    .attr('width','30')
    .attr('height','10');
}

我想在 svg rects 中添加数字以显示每种颜色所涵盖的范围值。 color.ticks(11) 仅返回直到定义的中点 360 的值。无论我在刻度中输入什么值,我都只能返回到中点的值。

【问题讨论】:

    标签: javascript d3.js svg scale


    【解决方案1】:

    您可以使用invertExtent 获取每种颜色的值,其中:

    为范围内的相应值返回域 [x0, x1] 中值的范围:量化的倒数。

    这就是它的工作原理,返回具有每种颜色的底部和顶部值的数组:

    var color = d3.scaleQuantize()
      .domain([0, 1600])
      .range(d3.schemeRdYlGn['11'].reverse());
    
    color.range().forEach(function(d){
    	console.log(color.invertExtent(d))
    })
    <script src="https://d3js.org/d3.v4.js"></script>
    <script src="https://d3js.org/d3-scale-chromatic.v1.min.js"></script>

    这是一个使用您的代码的演示。我将值分开并将它们放在矩形下方:

    var svg = d3.select("svg");
    
    var colorscale = d3.schemeRdYlGn['11'].reverse();
    var color = d3.scaleQuantize()
      .domain([0, 1600])
      .range(colorscale);
    
    var format = d3.format(".1f")
    
    drawColorScale();
    
    function drawColorScale() {
      var pallete = svg.append('g')
        .attr('id', 'pallete');
    
      var swatch = pallete.selectAll('rect').data(colorscale);
      swatch.enter().append('rect')
        .attr('fill', function(d) {
          return d;
        })
        .attr('x', function(d, i) {
          return i * 50;
        })
        .attr('y', 50)
        .attr('width', 50)
        .attr('height', 10);
    
      var texts = pallete.selectAll("foo")
        .data(color.range())
        .enter()
        .append("text")
        .attr("font-size", "10px")
        .attr("text-anchor", "middle")
        .attr("y", 80)
        .attr('x', function(d, i) {
          return i * 50 + 25;
        })
        .text(function(d) {
          return format(color.invertExtent(d)[0])
        })
        .append("tspan")
        .attr("dy", "1.3em")
        .attr('x', function(d, i) {
          return i * 50 + 25;
        })
        .text("to")
        .append("tspan")
        .attr("dy", "1.3em")
        .attr('x', function(d, i) {
          return i * 50 + 25;
        })
        .text(function(d) {
          return format(color.invertExtent(d)[1])
        })
    
    }
    <script src="https://d3js.org/d3.v4.js"></script>
    <script src="https://d3js.org/d3-scale-chromatic.v1.min.js"></script>
    <svg width="600"></svg>

    【讨论】:

    • PS:在我看来quantize.domain() 不接受中点。
    猜你喜欢
    • 1970-01-01
    • 2019-05-11
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多