2013-06-10 5 views
0

В настоящее время я рисую список чисел (ось y) по списку названий (по оси x). Каждый номер может соответствовать нескольким веб-сайтам. Прямо сейчас я использую функцию увеличения, предоставляемую d3, для сортировки. В настоящее время у меня есть раскрывающееся меню, в котором я могу выбрать номер или название, и каждый вариант индивидуально сортируется по соответствующему выбору. Однако мне было интересно, есть ли способ, чтобы я мог сортировать по алфавиту по названию, а затем сохранять его в алфавитном порядке, а также сортировать по числу. На данный момент я могу только сделать то или другое.d3.js сортировка по обеим осям

Пример: Мои данные сохраняются в формате CSV, как это:

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

Затем я использую

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

прочитать в файле, и я преобразовать номер документа к Интс.

Для сортировки я сделать следующее:

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

Обе эти работы должным образом, однако я хотел бы сортировать по идентификатору, а затем также сортировать по имени. Таким образом, ось будет отображать (начиная с начала координат) 1, 2, 3, 4 по оси y и google, nike, youtube вниз по оси x. Прямо сейчас, если я попытаюсь отсортировать его, это будет 1, 2, 3, 4 до оси y и youtube, google, по оси x OR google, youtube, по оси x с 1, 2 , 4, 3 по оси y.

То, что я хочу, - это 1, 2, 3, 4 по оси Y (отсортировано по цифре) и google, nike, youtube по оси x (отсортировано по алфавиту) одновременно. Учитывая, что это диаграмма рассеяния, это должно быть что-то вроде перестановки тиков на оси, но я не совсем уверен, как это сделать.

+0

Можете ли вы привести пример кода, который у вас есть? В основном вам просто нужно изменить функцию сортировки в соответствии с тем, что вы хотите. –

+0

Я добавил намного больше деталей. Любая помощь будет оценена! – Andrew

+0

Спасибо Кристофер Чиче за редактирование! – Andrew

ответ

2

Порядок, в котором входные значения сопоставляются с выходными значениями для категориального масштаба, зависит от порядка, в котором они указаны, .domain(). Все, что вам нужно сделать, чтобы достичь того, что вам нужно, - это сортировать значения соответственно при создании шкалы, например,

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

Это интересно. Означает ли это, когда я выбираю другой вариант в раскрывающемся меню, я должен сортировать данные, а затем изменять масштаб? – Andrew

+0

Это был бы один из способов сделать это, да. –

+0

Ваше предложение, похоже, не работает для меня, но я считаю, что это может быть проблема с тем, как я описал график для вас. Прямо сейчас это выглядит как эта скрипка, которую я нашел здесь: http://jsfiddle.net/WEsUe/1/. Очевидно, что в этом примере ось одновременно сортируется, но, учитывая, что данные не были введены в отсортированном формате, как бы я обходился, чтобы обе мои оси отсортировались в одно и то же время? – Andrew

Смежные вопросы