0

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

示例:我的数据存储在 CSV 中,如下所示:

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

然后我用

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

读入文件,我将 id 号转换为整数。

要排序,我执行以下操作:

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 排序,然后再按名称排序。所以轴将显示(从原点开始)1、2、3、4 在 y 轴上,google、nike、youtube 在 x 轴下。现在,如果我尝试对其进行排序,它将是 1、2、3、4 到 y 轴和 youtube、google、nike 在 x 轴上或 google、youtube、nike 在 x 轴下用 1、2 , 4, 3 在 y 轴上。

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

4

1 回答 1

2

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

var scale = d3.scale.ordinal()
   .domain(data.sort(function(a, b) { return d3.ascending(a.name, b.name); }))
   .range([...]);
于 2013-06-11T16:57:46.657 回答