6

所以我在玩 d3.js 桑基图。

在此处输入图像描述

此示例中(如上图所示),颜色是使用定义的

var color = d3.scale.category20();

对于每个节点,都有一个矩形,并且通过改变样式来填充该矩形:

.style("fill", function(d) {
    return d.color = color(d.name.replace(/ .*/, ""));
})

我正在寻找有关使用自定义颜色的建议。如果我只想使用 6 种颜色,但根据 .json 文件中的值选择节点矩形颜色。

例如,假设我想展示 NFL 球队的蛇形图表。每种颜色代表球队所在的分区。因此,如果他们移动到不同的分区,颜色会发生变化。并且为每个季节创建节点。类似的东西。

那么是否可以运行

node.append("rect")
    .attr("height", function(d) { return d.dy; })
    .attr("width", sankey.nodeWidth())
    .style("fill", function(d) {
        return d.color = color(d.name.replace(/ .*/, ""));
    })
    .style("stroke", function(d) {
        return d3.rgb(d.color).darker(2);
    })
   .append("title")
    .text(function(d) { return d.name + "\n" + format(d.value); });

基于 json 文件中的值的颜色?我只是在想一个 if 语句,但有没有更简单的方法?我可以在 json 中包含十六进制颜色代码吗?

4

3 回答 3

26

或者,您可以使用文档中提到的 d3 序数比例将颜色显式映射到分区。请参阅底部的 Colorbrewer。

var color = d3.scale.ordinal()
    .domain(["foo", "bar", "baz"])
    .range(["#fff","#000","#333"]);

进而

.attr("fill", function(d) { return color(d.division); });
于 2012-10-22T14:05:53.260 回答
6

在这种情况下,听起来您想在 JSON 中包含颜色。您可以以浏览器识别的任何方式包含它,例如作为名称(“white”)或十六进制(“#fff”)。有关支持的颜色规范的完整列表,请参阅SVG 规范

于 2012-10-22T09:27:55.227 回答
1

替换const color = d3.scaleOrdinal(d3.schemeCategory20);为:

const color = d3.scaleOrdinal() 
.domain(["Crude oil","Natural gas",...])
.range(["#FD3E35","#FFCB06",...]);

并留在:

.style('fill', (d,i) => {
  d.color = color(d.name.replace(/ .*/, ''));
  return d.color;})
于 2017-07-23T14:44:22.107 回答