d3.js按两个轴排序图表

时间:2013-06-10 23:23:40

标签: javascript d3.js

我正在绘制一个数字列表(y轴)与标题列表(x轴)。每个号码可以对应多个网站。现在我一直在使用d3提供的升序功能对它们进行排序。我现在有一个下拉菜单,我可以在其中选择数字或标题,每个选项可以根据相应的选择进行单独排序。但是,我想知道是否有一种方法,以便我可以按标题按字母顺序排序,然后按字母顺序排序,也按数字排序。截至目前,我只能做一个或另一个。

实施例: 我的数据存储在这样的CSV中:

"id","name"  
1,"youtube"  
1,"google"  
2,"google"  
3,"nike"  
4,"google"  

然后我用

d3.csv("csvTestFile.csv", function (dataset) 

读入文件并将id号转换为int。

要排序我执行以下操作:

data.sort(function(a, b) { return d3.ascending(a.id, b.id)});  

按ID排序。按名称排序我这样做:

data.sort(function(a, b) { return d3.ascending(a.name, b.name)});  

这两个都正常工作,但是我想首先按ID排序,然后按名称排序。因此,轴将显示(从原点开始)沿y轴显示1,2,3,4,并沿x轴显示google,nike,youtube。现在,如果我尝试排序它将是1,2,3,4直到y轴和youtube,谷歌,nike向下x轴或谷歌,youtube,nike向下x轴与1,2 ,4,向上y轴。

我想要的是在y轴上1,2,3,4(以数字方式排序)和google,nike,youtube同时向下x轴(按字母顺序排序)。鉴于这是一个散点图,它应该只是重新排列轴上的刻度,但我不太清楚如何去做。

1 个答案:

答案 0 :(得分:2)

输入值映射到分类比例的输出值的顺序取决于它们被赋予.domain()的顺序。您需要做的就是在创建比例时相应地对值进行排序,例如

var scale = d3.scale.ordinal()
   .domain(data.sort(function(a, b) { return d3.ascending(a.name, b.name); }))
   .range([...]);