这个问题在这里已有答案:
我使用色标:
var color = d3.scale.category10();
我使用它根据它们的值为力布局图的边缘着色
var links = inner.selectAll("line.link")
.style("stroke", function(d) { return color(d.label); });
现在我需要一个'图例'来向用户显示每种颜色的含义:
edgesArray = [];
edgesArrayIndex = [];
for (i=0;i<data.edges.length;i++) {
if(!edgesArray[data.edges[i].name])
{
edgesArray[data.edges[i].name]=1;
edgesArrayIndex.push(data.edges[i].name);
}
}
var colourWidth = 160;
var colourHeight = 25;
for(i=0; i<edgesArrayIndex.length; i++){
if (edgeColour == true){
svg.append('rect')
.attr("width", colourWidth)
.attr("height", colourHeight)
.attr("x", Marg*2)
.attr("y", Marg*2 + [i]*colourHeight)
.style("fill", color(i))
;
svg.append("text")
.attr("x", Marg*3)
.attr("y", Marg*2 + [i]*colourHeight + colourHeight/2)
.attr("dy", ".35em")
.text(color(i) + " : " + data.edges[i].name);
}
//console.log(edgesArrayIndex);
}
颜色都错了 . 当我将颜色附加到图形时,前6种颜色附着到边缘,因为有6种不同类型的边缘 .
但是当我将颜色标度应用到6'rects'时,我附加到SVG,就好像颜色标度数组的前6种颜色在应用到边缘时用完了,当我从颜色开始执行for循环时( 0)它实际上给我颜色的颜色(5)(因为0是第一个) .
例如,说我有红色,蓝色,绿色,白色,黑色,粉红色,橙色,黄色,靛蓝色,浅绿色 . 我的边缘得到 - 红色,蓝色,绿色,白色,黑色,粉红色,现在当我想将比例应用于我制作的镜片时,我希望镜片具有相同的值 - 红色,蓝色,绿色,白色,黑色,粉 .
但它们实际上有:橙色,黄色,靛蓝色,浅绿色,红色,蓝色 .
它们从颜色[5]开始,就好像它们绕回到开头并回到红色,蓝色等等 .
2 回答
您使用两个不同的数据部分作为色标 - 首先是标签,然后是名称 . 根据定义,这将为您提供不同的颜色(在给定输出范围的情况下,不同的输入尽可能映射到不同的输出) .
要获得相同的颜色,请传入相同的属性,例如标签(如果我理解你的数据结构正确):
这个问题对我有帮助 -
d3.scale.category10() not behaving as expected
基本上你必须在规模上放置一个域名 . 而不是
将其更改为: