当我处理饼图的数据时,我将所有小值合并到“其他”中。图表使用d3.scale.category20着色。如何从颜色集中将“其他”指定为特定颜色(浅灰色),并使用默认方法指定其他值?d3:为特定值分配颜色
更新:我正在寻找一种惯用的D3解决方案,如果有的话。还有什么我可以破解自己。
当我处理饼图的数据时,我将所有小值合并到“其他”中。图表使用d3.scale.category20着色。如何从颜色集中将“其他”指定为特定颜色(浅灰色),并使用默认方法指定其他值?d3:为特定值分配颜色
更新:我正在寻找一种惯用的D3解决方案,如果有的话。还有什么我可以破解自己。
没有灰色创建自己的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);
}
});
这不起作用,因为其他类别中的其他类别也将从category20集合中分配灰色。 –
@DmitryB。编辑来解决这个问题。 – paradite
对不起,我应该先提及我正在寻找一种惯用的D3解决方案。我已经有一个就地破解:) –
您能否提供绘制路径的部分?所以我可以告诉你如何去做。另外,请说明如何创建“其他”。 –
我很使用[这里]的代码(https://bl.ocks.org/mbostock/3887235)。除了我将颜色变量改为'd3.scale.category20'。 '其他'是在python中计算出来的,并将其余数据作为另一个(最后一个)行传入。 –
我删除了我的答案,一旦它没有帮助你。正如我所说,最好的方法就是创建你自己的序数标度,定义域。看看Bostock在这里写的是什么:https://groups.google.com/forum/#!msg/d3-js/jsEmhdT9wiU/Xv3Mqql75vYJ –