javascript - 像老板一样根据数据在 D3 中设置颜色

标签 javascript css d3.js

我创建了一组条形图,这些条形图在输入新数据时会重新着色。这个想法不仅通过它们的宽度还通过它们的颜色来指示值。为了简单起见,作为第一步,我选择了蓝色和红色(阈值 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 channel ,乘以比率并再次重建字符串,如下所示。然而,我有一种感觉,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. 应该如何制定才能使动态变化成为可能?

最佳答案

您可以使用插值器解决 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 - interpolators , D3 Wiki - colorsCreating transitions with d3

关于javascript - 像老板一样根据数据在 D3 中设置颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34975182/

相关文章:

javascript - 使用 'for-in' 访问对象内部的对象?

javascript - TargetElement.addEventListener

html - 导航栏隐藏我页面的请求

jquery - 在 DOM 中从 SVG 创建 Google map MarkerImage

JavaScript 无法将 input.min、input.max、input.value 识别为整数

javascript - 如何使用十字准线在 x 轴上设置 Highcharts 数据系列?

css - Angular 通用 : serving critical CSS and delaying non-critical

html - Twitter Bootstrap 网格 - 如果 img 在 div 中,每行的列数会变小

javascript - D3.js:如何为网格的顶部和右侧线提供与网格线相同样式的相同样式?

javascript - D3 Dimple - "others"类别中的组小数据系列