【问题标题】:d3.js Color Groups for Radar Chart雷达图的 d3.js 颜色组
【发布时间】:2018-06-23 03:24:00
【问题描述】:

我正在使用这个d3 Radar Chart,现在我想为组着色。

这是我的数据 -

var data = [
  [
     {axis:"volume(N)",value:0.074095419,group:"one"},
     {axis:"heightBBOX(N)",value:0.618900916,group:"one"},
     {axis:"floor_area(N)",value:0.239036487,group:"one"},
     {axis:"RatioSunExp_TotWall",value:0.670908597,group:"one"
  }],
  [
     {axis:"volume(N)",value:0.373966243,group:"two"},
     {axis:"heightBBOX(N)",value:0.418068276,group:"two"},
     {axis:"floor_area(N)",value:0.039064467,group:"two"},
     {axis:"RatioSunExp_TotWall",value:0.341108011,group:"two"
  }],
  [
     {axis:"volume(N)",value:0.675991163,group:"two"},
     {axis:"heightBBOX(N)",value:0.815015265,group:"two"},
     {axis:"floor_area(N)",value:0.94061374,group:"two"},
     {axis:"RatioSunExp_TotWall",value:0.974062924,group:"two"
  }],
  [
     {axis:"volume(N)",value:0.875950233,group:"two"},
     {axis:"heightBBOX(N)",value:0.210852068,group:"two"},
     {axis:"floor_area(N)",value:0.540645865,group:"two"},
     {axis:"RatioSunExp_TotWall",value:0.074841546,group:"two"
  }]]

这些是我的颜色选项

    var color = d3.scale.ordinal()
        .domain(["one","two"])
        .range(["#CC333F","#53e87d"]);

我想用特定颜色为组 one 着色,用另一种颜色为组 two 着色。我该怎么办?

更新:当我使用下面的代码时,所有的图表都是黄色的。所以我知道该组是未定义的。我该如何解决这个问题?

color: function(d){
    if(d.group == "one"){
        return "red";
        }
    if(d.group == "two"){
        return "green";
        }
    else{
        return "yellow";
    }
    }

【问题讨论】:

  • 你能给我们看一个完整的代码吗?
  • @Temani-afif 这是一个有效的full code
  • 您评论的第二种方式效果很好...实际效果不佳:jsfiddle.net/c3wu7ftr/2
  • @Temani-afif 但这不是我想要的。我需要用一种颜色(例如红色)为“一”组着色,并用另一种颜色(例如绿色)为“二”组着色。在此代码中,数据集(组“二”)的 3 必须为绿色,一个数据集(组“一”)必须为红色。
  • 好的,让我检查一下

标签: javascript d3.js colors radar-chart


【解决方案1】:

你的代码的问题在于radarChartOptions这个...

color: function(d){

... 不会检索绑定到每个元素的 datum

这里最好的解决方案是查看插件,或通过电子邮件向其作者发送电子邮件,以了解他/她是如何传递选项的。由于我没有时间查看插件文档,这里有一个简单的解决方案,它在 渲染路径/圆圈之后绘制它们:

d3.selectAll(".radarArea").each(function(d){
  d3.select(this).style("fill", color(d[0].group))
});

d3.selectAll(".radarStroke").each(function(d){
  d3.select(this).style("stroke", color(d[0].group))
});

d3.selectAll(".radarCircle").each(function(d){
  d3.select(this).style("fill", color(d.group))
});

这是更新后的小提琴:https://jsfiddle.net/1j59znu9/

【讨论】:

  • 我猜主要问题是 OP 正在改变数据的结构,并且插件似乎是为特定结构设计的,所以没有办法获得 group 元素他添加到结构中。所以我想他需要重新考虑另一种方式,然后改变数据结构
  • 是的,这就是问题所在,正如我在答案中解释的那样。但是,OP 可以简单地操作 DOM,就像我在这里所做的那样:数据绑定到元素。因此,它很容易访问。