0

如果我有一组百分比范围从 -0.75 到 0.3 的数据数字,并且我想创建一个热图,其中 -0.75 是“亮红色”图块,0.3 值是“亮绿色值”,介于两者之间的是在这之间进行缩放。

我目前有这个:

js

var color = d3.scale.quantize()
.domain([-.7, .3])
.range(d3.range(11).map(function(d) { return "q" + d + "-11"; }));

css

.RdYlGn .q0-11{fill:rgb(255,0,0)}
.RdYlGn .q1-11{fill:rgb(255,50,50)}
.RdYlGn .q2-11{fill:rgb(255,100,100)}
.RdYlGn .q3-11{fill:rgb(255,150,150)}
.RdYlGn .q4-11{fill:rgb(255,200,200)}
.RdYlGn .q5-11{fill:rgb(255,255,255)}
.RdYlGn .q6-11{fill:rgb(200,255,200)}
.RdYlGn .q7-11{fill:rgb(150,255,150)}
.RdYlGn .q8-11{fill:rgb(100,255,100)}
.RdYlGn .q9-11{fill:rgb(50,255,50)}
.RdYlGn .q10-11{fill:rgb(0,255,0)}

但这些数字似乎并不正确。百分比似乎是这样缩放的:

.3 = q0  Green
.0 = q2
-.1 = q4
-.5 = q5  White
-.7 = q11 Red

-.5 是我的白色中间值是有道理的,因为这是 0.3 和 -.7 的中值,但我不希望它是那样。有什么帮助吗?

4

2 回答 2

5

Fortunately there is a very simple way to accomplish what you want. Just use a polylinear scale, which is just a regular d3.scale.linear() with anchor points at each value where a new color should start.

To have red for negative values, white at zero, and green for positive, use:

polylinear_color = d3.scale.linear()
    .domain([-0.3, 0, 0.7])
    .range(['rgb(255,0,0)','rgb(255,255,255)','rgb(0,255,0)'])

The scale does all the interpolation and instead of using classes you just set .attr('fill',function(d){return polylinear_color(d);}); on the things being colored.

I made a jsfiddle to illustrate, here.

于 2013-08-30T12:14:52.153 回答
2

在这里查看 d3 的内置颜色插值器

在您的情况下,它看起来像这样:

var interpolator = d3.interpolateHsl('rgb(255,0,0)', 'rgb(0,255,0)');
var scale = d3.scale.linear()
  .domain([-.7, .3])
  .range([0, 1])
// interpolator(scale(0)) will return a color in between red and green 
于 2013-02-10T02:50:13.660 回答