2016-05-03 127 views
2

当我处理饼图的数据时,我将所有小值合并到“其他”中。图表使用d3.scale.category20着色。如何从颜色集中将“其他”指定为特定颜色(浅灰色),并使用默认方法指定其他值?d3:为特定值分配颜色

更新:我正在寻找一种惯用的D3解决方案,如果有的话。还有什么我可以破解自己。

+0

您能否提供绘制路径的部分?所以我可以告诉你如何去做。另外,请说明如何创建“其他”。 –

+0

我很使用[这里]的代码(https://bl.ocks.org/mbostock/3887235)。除了我将颜色变量改为'd3.scale.category20'。 '其他'是在python中计算出来的,并将其余数据作为另一个(最后一个)行传入。 –

+0

我删除了我的答案,一旦它没有帮助你。正如我所说,最好的方法就是创建你自己的序数标度,定义域。看看Bostock在这里写的是什么:https://groups.google.com/forum/#!msg/d3-js/jsEmhdT9wiU/Xv3Mqql75vYJ –

回答

0

没有灰色创建自己的d3.scale.category20

var myCategory20Colors = [ 
    0x1f77b4, 0xaec7e8, 
    0xff7f0e, 0xffbb78, 
    0x2ca02c, 0x98df8a, 
    0xd62728, 0xff9896, 
    0x9467bd, 0xc5b0d5, 
    0x8c564b, 0xc49c94, 
    0xe377c2, 0xf7b6d2, 
    0xbcbd22, 0xdbdb8d, 
    0x17becf, 0x9edae5 
].map(function(x) { 
    var value = x + ""; 
    return d3.rgb(value >> 16, value >> 8 & 0xff, value & 0xff).toString(); 
}); 

var myCategory20 = d3.scale.ordinal().range(myCategory20Colors); 

var original = d3.scale.category20(); 

console.log(original("x"), original("y")); 

console.log(myCategory20("x"), myCategory20("y")); 
// they produce the same result #1f77b4 #aec7e8 

从列表中(我删除0x7f7f7f, 0xc7c7c7,),你可以用你自己的颜色代替他们。

然后,您可以简单地检查着色时的数据。

g.append("path") 
     .attr("d", arc) 
     .style("fill", function(d) { 
     if(d.yourRowName == "Other") { 
      return "grey"; 
     } else { 
      return myCategory20(d.data.age); 
     } 
     }); 
+0

这不起作用,因为其他类别中的其他类别也将从category20集合中分配灰色。 –

+0

@DmitryB。编辑来解决这个问题。 – paradite

+0

对不起,我应该先提及我正在寻找一种惯用的D3解决方案。我已经有一个就地破解:) –