2016-10-25 4 views
1

У меня есть rowchart, что в настоящее время выглядит следующим образом:Как я могу применить пользовательский (определенный) порядок к строкам диаграммы строк в DC.js?

deltaChart 
    .width(300) 
    .height(250) 
    .dimension(deltaDim) 
    .group(pointsByDelta) 
    .xAxis().ticks(4); 

В которой deltaDim измерения состоит из 11 или около того уникальных значений строк, pointsByDelta представляет родственные отсчеты и deltaChart имеет типа rowChart.

Поскольку значения deltaDim являются строковыми, а не числовыми, сортировка не соответствует порядку. Я пробовал применить то, что я нашел в вики, а также на других сообщениях здесь, чтобы вручную переупорядочить, не повезло вообще. Независимо от формата я получаю ошибку консоли: .ordering не является функцией()

Я пробовал просто в заказе, как это:

.ordering(function(d){return -d.value}) 

Это приводит к ошибке. В идеале я хотел бы быть в состоянии сделать что-то вроде:

.ordering(function(d) { 
     if(d.value == "5 ft") return 0; 
     else if(d.value == "4 ft") return 1; 
     else if(d.value == "3 ft") return 2; 
     else if(d.value == "2 ft") return 3; 
     else if(d.value == "1 ft") return 4; 
     else if(d.value == "0 ft") return 5; 
     else if(d.value == "-1 ft") return 6; 
     else if(d.value == "-2 ft") return 7; 
     else if(d.value == "-3 ft") return 8; 
     else if(d.value == "-4 ft") return 9; 
     else if(d.value == "-5 ft") return 10; 
     else return 11; 
    }) 

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

Любая помощь приветствуется. Спасибо!

+0

Не знаю, почему люди, отвечая на вопросы о строковыхах, что довольно далеко от базы. Может быть, вы используете действительно старую версию dc.js, которая не поддерживает эту функцию? Он был введен в 1.5 или 1.6. То, что вы показываете выше, должно работать. – Gordon

+0

Гордон, спасибо за записку. Я дважды проверял, я использую 1.6. Из других примеров, которые я видел, я думал, что это выглядит так, как будто это должно сработать ... Я действительно почесываю голову о том, почему я получаю ошибку, даже с менее сложным порядком. – ZFlyGuy

+1

Хмм, может быть, вы пытаетесь вызвать ['.ordering (...)' после вызова '.xAxis (...)'] (https://github.com/dc-js/dc .js/вики/# FAQ почему-делает-все-брейк-после-а-призыв к Xaxis-или-YAxis)? Если вы получаете «.ordering is not a function», это означает, что он либо не существует, либо вы не работаете с объектом диаграммы - не имеет значения, что вы пытаетесь передать ему. – Gordon

ответ

1

В сочетании с входом Гордона сверху относительно .xAxis(), то решение, которое работает следующим образом.

deltaChart 
    .width(300) 
    .height(250) 
    .dimension(bfeDeltaDim) 
    .group(pointsByBFEDelta) 
    .ordering(function(d) { 
     if(d.key == "5 ft") return 0; 
     else if(d.key == "4 ft") return 1; 
     else if(d.key == "3 ft") return 2; 
     else if(d.key == "2 ft") return 3; 
     else if(d.key == "1 ft") return 4; 
     else if(d.key == "0 ft") return 5; 
     else if(d.key == "-1 ft") return 6; 
     else if(d.key == "-2 ft") return 7; 
     else if(d.key == "-3 ft") return 8; 
     else if(d.key == "-4 ft") return 9; 
     else if(d.key == "-5 ft") return 10; 
     else return 11; 
    }) 
    .xAxis().ticks(4); 
1

Если строки похожи на то, что они выше, вы можете работать с ними в функции.
Разделение:

The split() method splits a String object into an array of strings by separating the string into substrings.

разделить строку на место в строке, а затем возвращает первый элемент в массиве
Затем разобрать этот элемент, который будет составлять от 5 до -5 в Int

.ordering(function(d){ 
    return parseInt(d.split(" ")[0]); 
}) 
1

Вы уверены, что d3.js имеет .ordering() метод? Возможно, вы ищете хорошего старого .sort(). Проблема в том, что вы должны заменить блок «ft» при итерации по массиву, и мы можем использовать шаблон регулярного выражения \s+ft$, чтобы удалить его. Образец совпадает с термином <any_amount_of_space>ft в конце строки. После замены просто преобразуйте его в float. Я избегаю использования parseInt(), потому что у вас могут быть нецелые значения.

var arr = ["5 ft", "4 ft", "3 ft", "2 ft", "1 ft", "0 ft", "-1 ft", "-2 ft", "-3 ft", "-4 ft", "-5 ft"]; 
 

 
var arr_sorted = arr.sort(function(a, b) { 
 
    // Convert to float 
 
    var x = parseFloat(a.replace(/\s+ft$/, "")), 
 
     y = parseFloat(b.replace(/\s+ft$/, "")); 
 

 
    // Return, sort by descending order 
 
    return ((x < y) ? 1 : ((x > y) ? -1 : 0)); 
 

 
    // If ascending order is needed, use: 
 
    // return ((x > y) ? 1 : ((x < y) ? -1 : 0)); 
 
}); 
 
console.log(arr_sorted);

0

Лучше избегать длительного, если еще условие.Это может быть легко обработано через d3 scales

  1. Создайте порядковый масштаб и домен с предпочтительным заказом.
  2. Диапазон может быть сделано с помощью индекса по заказу

    var scale = d3.scale.ordinal() 
    .domain(['C','B','A']) 
    .range([0,1,2]); 
    

    сортировки В заказе функции

    chart.ordering(function(k){ 
        return scale(k.key); 
    }) 
    

jsFiddle Working copy

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

  • Нет связанных вопросов^_^