首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用d3生成任意数量的颜色?

如何使用d3生成任意数量的颜色?
EN

Stack Overflow用户
提问于 2013-12-30 20:39:02
回答 8查看 35.5K关注 0票数 22

我正在使用d3.js构建饼图,并可视化一个大数据集。有更多的137个项目,在图表上可视化。我有10颜色使用这个函数。

代码语言:javascript
复制
d3.scale.category10().range()

通过探索其他选项:https://github.com/mbostock/d3/wiki/Ordinal-Scales

代码语言:javascript
复制
d3.scale.category20().range()

var chart = nv.models.pieChart()
    .x(function(d) {
        return d.key
    })
    .y(function(d) {
        return d.y
    })
    .color(d3.scale.category10().range())
    .width(width)
    .height(height);

如何使用d3生成任意数量的颜色?

EN

回答 8

Stack Overflow用户

发布于 2014-08-14 07:14:34

Update:d3v5现在包括连续的色标,如d3.interpolateSpectral。这可能是最简单的选择。

我也有同样的问题,所以我写了一个小工具来生成很多感知不同的颜色:类别颜色发生器

此工具生成一个颜色列表。然后,您可以使用该列表如下:

代码语言:javascript
复制
color = d3.scale.ordinal()
    .domain(YOUR_DATA_CATEGORIES)
    .range(["#30c514", "#9321ff", ...]);

如果两盏灯不够,也有一个泛化版本

这里有一些预先生成的示例颜色集

票数 33
EN

Stack Overflow用户

发布于 2015-06-18 10:16:45

由于您使用的类别很多,所以不可能使用明显不同的颜色。好消息是,在饼图中,每个饼图旁边只有两种颜色,那么所有颜色都不需要不同,只是相邻的颜色。

我要做的是生成两个不同的色阶,都使用d3.interpolateHcl()。HCL和Lab是生成自然颜色梯度的更好的颜色模型,也是category20()用来生成明显不同颜色的颜色模型。

代码语言:javascript
复制
var colorScales =[
  d3.scale.linear()
    .interpolate(d3.interpolateHcl) 
    .range(["#9AF768", "#F27A4D"]),
  d3.scale.linear()
    //.domain([0,1])
    .interpolate(d3.interpolateHcl) 
    .range(["#112231","#3C769D"])
];

将您想要的颜色放到range([...])中,并应用这些函数,添加一些随机性。我使用数据的索引i在两种颜色方案之间交替使用。

代码语言:javascript
复制
.color(function(d,i) {
  return colorScales[i%2]       
          (Math.random());
})

更多关于颜色理论和颜色模型:

和一个很好的HCL颜色空间选择器:

  • http://tristen.ca/hcl-picker

更新

较新版本的d3提供了更多的颜色方案和插值器有着更复杂的模型。有一些类型的方案,我认为这个用例最有用的是序列多色调内插器

我开发了一个交互式小部件来探索这些缩放和内插器,同时改变颜色的数量。见下文。

注意,这些方案也很难提供几种明显不同的颜色。

代码语言:javascript
复制
const categorical = [{
    "name": "interpolateViridis"  },
  { "name": "interpolateInferno"  },
  { "name": "interpolateMagma"    },
  { "name": "interpolatePlasma"   },
  { "name": "interpolateWarm"     },
  { "name": "interpolateCool"     },
  { "name": "interpolateCubehelixDefault"  },
  { "name": "interpolateRainbow"  },
  { "name": "interpolateSinebow"  }
]

const width = 600,
  height = 80;

const svg = d3.select("body")
  .append("svg")
  .attr("width", width)
  .attr("height", height)
  .append("g")


const unit = (s) => width / s.n;
const state = {
  n: 12,
  colorScale: d3.scaleSequential(d3[categorical[8].name])
};

const update = () => {

  bars.data(d3.range(0, 1, 1 / state.n))
    .enter().append("rect")
    .attr("class", "bars")
    .attr("y", 0)
    .attr("height", height)
    .attr("width", unit(state))
    .attr("x", (d, i) => i * unit(state))
    .style("fill", state.colorScale)
    .merge(bars);
    
  bars.exit().remove();

}

const bars = svg.selectAll(".bars");

update()

const sequentialButtons = d3.select(".categoricalButtons")
  .selectAll("button")
  .data(categorical)
  .enter().append("button")
  .text(d => d.name)
  .on("click",  (buttonValue) =>{ 
    state.colorScale = d3.scaleSequential(d3[buttonValue.name]);
    update();
    });

const itemsInput = d3.select('#items')
  .on('change',(d,i,arr)=>{
    state.n = arr[i].value;
    update();
    });
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

<div class="categoricalButtons">Color Scales: </div>
<div><input id="items" type="number" value="12"></div>

票数 21
EN

Stack Overflow用户

发布于 2013-12-30 20:56:44

我们可以使用自定义颜色,例如,您可以创建您自己的颜色范围:.range(["#fff","#000","#333"]);。下面是一个类似的StackOverflow线程:https://stackoverflow.com/a/13013162/1848540

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20847161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档