【问题标题】:Setting color in D3 based on data like a boss像老板一样根据数据在 D3 中设置颜色
【发布时间】:2016-01-24 11:29:07
【问题描述】:

我创建了一组在新数据输入时重新着色的条形图。这个想法不仅通过它们的宽度而且通过它们的颜色来指示值。为方便起见,作为第一步,我选择了蓝色和红色(阈值 40 和 160 无关紧要),结果如下。

.style("background-color", function (d) {
  var low = 40;
  var high = 160;
  if (d < low) return "#0000ff";
  if (d > high) return "#ff0000";

  var ratio = (d - low) / (high - low);
  return "#" + Math.round(255 * ratio).toString(16)
    + "00" + Math.round(255 * (1 - ratio)).toString(16);
})

虽然它有效,但我意识到它会带来维护问题。如果我突然想从绿色变为黄色,我需要更改相当多的计算。并且尝试不同的颜色组将变成乏味且耗时的反乐趣。

一定有一种更像老板的方式吗?

我可以想到诸如声明极端颜色,将它们解析为单独的 RGB 通道,乘以比率并再次重建字符串,如下所示。但是,我感觉 D3 提供的东西比这要流畅得多。另外,作为额外的奖励,我想使用颜色名称,而不是十六进制代码。

var color = "#abcdef";
var ratio = 0.7;

var oldRed = color.substring(1,3);
var tmpRed = Math.round(parseInt(oldRed,16) * ratio);
var newRed = newRed.toString(16);
  1. 什么是专业的颜色转换方法?
  2. 是否有使用名称而不是十六进制代码的工具?
  3. 应如何制定才能使动态变化成为可能?

【问题讨论】:

    标签: javascript css d3.js


    【解决方案1】:

    您可以使用插值器解决 1) 和 2):

    var red = d3.rgb("red")
    var blue = d3.rgb("blue")
    return d3.interpolate(red, blue)(my_factor)
    

    wiki 还列出了创建 rgb 对象的各种可能性:

    • "rgb(255,255,255)"
    • "hsl(120,50%,20%)"
    • “#ffeeaa”
    • “#fea”
    • “红”、“白”、“蓝”等

    对于 3),可以使用转场,例如:

    my_obj
       .style("fill", start_color)
       .transition()
       .attr("fill", end_color)
       .duration(1000)
    

    请参阅:D3 Wiki - interpolatorsD3 Wiki - colorsCreating transitions with d3

    【讨论】:

    • 啊哈!昨晚我在插值器周围闲逛,但语法不正确(我没想到第三行有双括号)。非常好! (3) 怎么样?那是完全不同的作品吗?我不想排除这样做的机会...
    • 好吧,插值器返回一个函数对象,它本身可以被调用,这导致了那些双括号:)
    猜你喜欢
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2015-07-17
    • 1970-01-01
    相关资源
    最近更新 更多