d3.js相当于R数据帧中的列

时间:2015-01-16 14:27:39

标签: r d3.js

我有一些以这种格式存储的数据(除了很多情况外):

var data = [
     {"name":"John", "team":"team1"},
     {"name":"Megan", "team":"team2"},
     {"name":"Rupert", "team":"team2"},
     {"name":"Albert", "team":"team1"}
     ];

我想创建这个:

var colourScale = d3.scale.ordinal() 
  .range(a)
  .domain(b)

“a”是所有级别“团队”的数组(在这种情况下为[“team1”,“team2”])。 “b”是与“a”长度相同的序数颜色数组。 colourScale()应该将“团队”值作为输入,并为每个团队返回一种独特的颜色。

如何创建“a”和“b”?在javascript或d3.js中是否有与R的级别(数据[,“团队”])相当的东西?

2 个答案:

答案 0 :(得分:1)

它并不完全是您的解决方案,因为您没有明确找到指定的ab,但我找到了

var colourScale = d3.scale.category10();
function colour(d) { return d.team; }

并在要着色的对象上,绑定到相应的数据链

.style("fill", function(d) { return colourScale(colour(d)); });

具有我假设您正在搜索的效果。希望这会有所帮助。

答案 1 :(得分:0)

我认为您需要做一些额外的步骤。您首先需要创建一个独特的'一组可能的域值。然后,您可以创建一个将每个值映射到颜色的函数。也许是这样的事情:

// A function to get unique values, can be optimized further
function unique(x) {
    return x.reverse().filter(function (e, i, x) {return x.indexOf(e, i+1) === -1;}).reverse();
}

var data = [
 {"name":"John", "team":"team1"},
 {"name":"Megan", "team":"team2"},
 {"name":"Rupert", "team":"team2"},
 {"name":"Albert", "team":"team1"}
 ];

// An arbitrary set of colors
colors = ['#005824','#1A693B','#347B53','#4F8D6B','#699F83','#83B09B','#9EC2B3','#B8D4CB','#D2E6E3','#EDF8FB','#FFFFFF','#F1EEF6','#E6D3E1','#DBB9CD','#D19EB9','#C684A4','#BB6990','#B14F7C','#A63467','#9B1A53','#91003F']

//Create the ordinary scale based on your color set above
colorScale= d3.scale.ordinal()
   .domain(unique(data.map(function(d){return d.team;})))
   .range(colors)

然后您可以通过以下方式访问颜色:

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

希望这有帮助。