【发布时间】:2024-04-16 03:10:01
【问题描述】:
我有数据域为 [0, 100] 但它们不均匀,它们非常向右倾斜,即它们的值大多在 80 到 100 之间。
我想用这些数据进行可视化并使用颜色来区分它们(例如:热图、地图……)。
什么是正确的色标?
我尝试了线性刻度、幂刻度和分位数刻度。 最好的似乎是分位数刻度,但仍然存在问题:
- 我想更好地区分最后一个值(右边的值)的颜色,它们看起来都是黑色的,可以吗?
- 在这个例子中我使用了灰度,如果我想使用 Viridis 或 Magma 比例?
这是我的代码。
function sortNumber(a, b) {
return a - b;
}
var data = [90, 95, 50, 1, 99, 89.1, 87, 94, 95, 99, 99.5, 94.3, 96, 97, 85, 74, 66, 92, 68, 91, 93, 87, 79, 86, 89, 93.5, 97, 98];
data.sort(sortNumber); // [1, 50, 66, 68, 74, 79, 85, 86, 87, 87, 89, 89.1, 90, 91, 92, 93, 93.5, 94, 94.3, 95, 95, 96, 97, 97, 98, 99, 99, 99.5]
console.log(data);
var colMin = '#ffffff';
var colMax = '#000000';
// LINEAR SCALE
var scaleLinear = d3.scaleLinear()
.domain([0, 100])
.range([colMin, colMax]);
var div = d3.select("#lin").selectAll(null)
.data(data)
.enter()
.append("div")
.attr("class", "dive")
.style("background-color", d => scaleLinear(d));
// POWER SCALE
var scalePow = d3.scalePow()
.exponent(10)
.domain([0, 100])
.range([colMin, colMax]);
var div = d3.select("#pow").selectAll(null)
.data(data)
.enter()
.append("div")
.attr("class", "dive")
.style("background-color", d => scalePow(d));
// QUANTILE SCALE (using https://meyerweb.com/eric/tools/color-blend/#:::hex to find intermediate colors)
var scaleQuantile = d3.scaleQuantile()
.domain(data)
.range([colMin, "#E8E8E8", "#D1D1D1", "#B9B9B9", "#A2A2A2", "#8B8B8B", "#747474", "#5D5D5D", "#464646", "#2E2E2E", "#171717", colMax]);
var div = d3.select("#qua").selectAll(null)
.data(data)
.enter()
.append("div")
.attr("class", "dive")
.style("background-color", d => scaleQuantile(d));
.dive {
width: 20px;
height: 20px;
display: inline-block;
margin: 4px;
border: 0.5px black solid;
}
<html lang="en">
<head>
<meta charset="utf-8">
<title>color scheme</title>
<script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
<script src="//d3js.org/d3-scale-chromatic.v0.3.min.js"></script> <!-- for scale color -->
<script src="https://d3js.org/d3-scale-chromatic.v1.min.js"></script> <!-- for scale color -->
<link rel="stylesheet" type="text/css" href="./style.css" media="screen"/>
</head>
<body>
<div id="lin">
<p>Scale linear</p>
</div><br>
<div id="pow">
<p>Scale power</p>
</div><br>
<div id="qua">
<p>Scale quantile</p>
</div>
<script src="./script.js"></script>
</body>
</html>
这是结果:
【问题讨论】:
-
分位数可能是您最好的选择。 Updated我做了一个小更新,量化了分位数上的一个比例,看起来很相似。
-
这个问题有 24 个视图和两个答案,这很有趣(也很烦人),但 没有人 支持它。如果这不是一个问题“展示研究成果,有用且清晰”,我不知道它是什么。 +1。
标签: javascript d3.js colors data-visualization