【问题标题】:Gradient color in a treemap for D3D3 树形图中的渐变颜色
【发布时间】:2013-05-30 14:37:08
【问题描述】:

首先,这与帖子中提出的上一个问题不同,因为我想要实现的是 d3 中整个树形图的渐变,就像我们在谷歌树形图中所拥有的那样。

我正在尝试实现 http://bost.ocks.org/mike/treemap/ 并进行相同的工作,但在 d3 中我试图在其中添加颜色渐变。

目前我正在这样做

color = d3.scale.category20c()

和

.style("fill", function(d) { return color(d.name)})

在我的 svg 元素上。但我希望有一个更像热图的渐变颜色,以便使树图中的较大框更绿,而较小的框更不绿。 d3/css 中有没有办法指定它?

【问题讨论】:

  • 你可以使用SVG gradients。
  • 我有兴趣构建类似的东西。我可以通过某种方式访问​​链接中的代码吗?

标签: css d3.js gradient treemap


【解决方案1】:

听起来您希望将色阶应用于树形图中的每个框。这很简单:

var colorScale = d3.scale.linear()
    .range(['lightgreen', 'darkgreen']) // or use hex values
    .domain([minValue, maxValue]);

然后申请

.style("fill", function(d) { return colorScale(d.value)});

这里的困难部分是确定域 - 根据您的数据的结构,您可能需要遍历树来收集它。在 Bostock 示例中,您可以在将数据连接到如下元素后获取数据的范围:

d3.extent(d3.selectAll('rect.child').data(), function(d) { return d.value; });

【讨论】:

  • 谢谢。我还尝试使用 d3.scale.ordinal().range([需要颜色代码])。这也有助于我使用自己的颜色范围。
  • 我用了这个:color = d3.scale.ordinal().range(['009933','00CC33','00FF33','#3D9140','#4BB74C','#6AC06D ','#81CD82','#62E46B','#CBF7CB','#FADEE0','#F6BABE','#FF9A9E','#EB7273','#FF4F56','#C80000 ','#D80000 ','#E00000 ','#E80000 ','#F00000 ','#F80000 ','#FF0000']).domain([d3.extent(d3.selectAll('rect.child').data() )]) 但这似乎没有正确地为节点着色?你能指导我吗?
  • 您需要线性刻度,而不是序数。要使用线性比例,您需要与范围颜色一样多的域数据点 - 因此您需要在数据范围的低端和高端之间进行插值,以获得域中所需的尽可能多的点。
  • 我尝试使用线性刻度。问题是范围颜色是有限的,然后它们会四处走动(域非常大)并且颜色会重复。此外,我正在尝试为每个容器中相对于它们的子节点着色,而不是根据所有 rect.child 节点着色。如果我错了,请纠正我,但 selectAll('rect.child') 会包含图中当前绘制的所有节点,对吗?不属于一个父容器?
  • 是的,所有节点都被选中——你是说你想要不同的父容器有不同的颜色渐变吗?在这种情况下,您需要为每个渐变制作或引用不同的色标。听起来你真的需要一个线性比例 - 你描述的是序数行为。您希望刻度为计算值插入颜色,对吗?这是线性的。
猜你喜欢
  • 2021-06-23
  • 2020-11-24
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多