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

d3.js equivalent to columns in R dataframes

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

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" 是 "team" 所有级别的数组(即本例中的 ["team1","team2"])。 "b" 是与 "a" 长度相同的序数颜色数组。 colourScale() 应该将 "team" 值作为输入,并且 return 每个团队的独特颜色。

如何创建 "a" 和 "b"?在 javascript 或 d3.js 中是否有等同于 R's levels(data[ ,"team"]) 的东西?

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

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

然后在要着色的对象上,绑定到适当的数据,链

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

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

我认为您还需要执行一些额外的步骤。您首先需要创建一组 'unique' 可能的域值。然后您可以创建一个将每个值映射到一种颜色的函数。可能是这样的:

// 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);})

希望对您有所帮助。