我正在尝试为热图创建线性色标。我想要着色以通过一大组特定颜色,其中第一种颜色对应于数据的最小值,最后一种颜色应该给予数据的最大值。
我知道我可以通过在最小值和最大值之间给出域17值来做到这一点,但是如果用户能够更改数据集,我不知道如何动态地执行此操作(从而更改颜色热图)
本质上我想跟随,但我知道它不起作用
var colorScale = d3.scale.linear()
.range(["#6363FF", "#6373FF", "#63A3FF", "#63E3FF", "#63FFFB", "#63FFCB",
"#63FF9B", "#63FF6B", "#7BFF63", "#BBFF63", "#DBFF63", "#FBFF63",
"#FFD363", "#FFB363", "#FF8363", "#FF7363", "#FF6364"])
.domain([d3.min(dataset, function(d) {return d;}),
d3.max(dataset, function(d) {return d;})]);
有人可以告诉我我需要在“域名”中添加什么才能使其正常运行吗?
编辑: 我找到了能满足我想要的东西。使用R我在上面的17中使用designer.colors函数计算了256种颜色,并将其放入范围内。这确实给人一种持续色标的感觉
var colorScale = d3.scale.linear()
.range(["#6363FF", "#6364FF", "#6364FF", "#6365FF",
"... several other lines with color codes ..."
"#FF6764", "#FF6564", "#FF6464", "#FF6364"])
.domain(d3.range(1,257));
var quantize = d3.scale.quantile()
.range(d3.range(1,257))
.domain([d3.min(dataset, function(d) {return d;}),
d3.max(dataset, function(d) {return d;})]);
现在我可以这种方式使用颜色
colorScale(quantize(dataset))
但我想知道这是否可以用更少的代码行完成?
答案 0 :(得分:27)
您想要解决问题。首先为热图定义一个比例,将0-1映射到您的颜色。然后定义将数据集映射到0-1的第二个(动态)比例。然后,您可以组合比例来绘制形状。
var colours = ["#6363FF", "#6373FF", "#63A3FF", "#63E3FF", "#63FFFB", "#63FFCB",
"#63FF9B", "#63FF6B", "#7BFF63", "#BBFF63", "#DBFF63", "#FBFF63",
"#FFD363", "#FFB363", "#FF8363", "#FF7363", "#FF6364"];
var heatmapColour = d3.scale.linear()
.domain(d3.range(0, 1, 1.0 / (colours.length - 1)))
.range(colours);
// dynamic bit...
var c = d3.scale.linear().domain(d3.extent(dataset)).range([0,1]);
// use the heatmap to fill in a canvas or whatever you want to do...
canvas.append("svg:rect")
.data(dataset)
.enter()
// snip...
.style("fill", function(d) {
return heatmapColour(c(d));
另外,您可以使用d3.extent函数一次性获取数据集的最小值和最大值。
答案 1 :(得分:4)
使用Quantitative Scale加Color Brewer
// pick any number [3-9]
var numColors = 9;
var heatmapColour = d3.scale.quantize()
.domain(d3.extent(dataset))
.range(colorbrewer.Reds[numColors]);
// use the heatmap to fill in a canvas or whatever you want to do...
canvas.append("svg:rect")
.data(dataset)
.enter()
// snip...
.style("fill", function(d) {return heatmapColour(d);})
答案 2 :(得分:3)
使用threshold scales。这是一个简单的例子:
coffee> d3 = require 'd3'
coffee> color = d3.scale.threshold().domain([5,30,100]).range(["red","orange","green"]);
coffee> color 6
'orange'
coffee> color 3
'red'
coffee> color 33
'green'