0

Это то, что у меня есть до сих пор: https://gist.github.com/daluu/fc1cbcab68852ed3c5fa и http://bl.ocks.org/daluu/fc1cbcab68852ed3c5fa. Я пытаюсь реплицировать функциональность Excel.Установите совокупную процентную линию на сортированный вывод гистограммы с d3 для гистограммы диаграммы парето

Линия соответствует гистограмме по умолчанию, которая отлично подходит как в базе/оригинале http://bl.ocks.org/daluu/f58884c24ff893186416. И я могу сортировать гистограмму в нисходящей частоте, хотя при этом я переключил x масштабов (от линейного до порядкового). Кажется, я не могу правильно отобразить линию на отсортированную гистограмму. Это должно выглядеть следующим образом примеры с точки зрения визуального представления:

  • скриншот Excel в comment in my gist указанным выше
  • Парето диаграммы отсортирован гистограмму в this SO post
  • парето график (по аналогии, но не совсем сортированная гистограмма), сделанная с d3 here

Какой лучший подход к дизайну для работы оставшейся части? Должен ли я начать с одной шкалы x и не нужно переключаться с линейного на порядковый? Если это так, я не уверен, как правильно использовать макет гистограммы, используя порядковый масштаб, или как не использовать линейную шкалу x в качестве источника ввода для макета гистограммы и все равно получить желаемый результат.

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

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

+0

Было ли мое решение отвечать на ваш вопрос? – WittyID

+0

да, это делает, достаточно близко для меня, чтобы работать. извините, забыли следить за этим сообщением. – David

ответ

1

Основная проблема с линией является то, что кумулятивное распределение должно быть пересчитано после бара сортируется, или если вы стреляете по статическому паретограмме, кумулятивное распределение должно быть рассчитано в целевом порядке сортировки. Для этой цели я создал небольшую функцию, чтобы сделать этот расчет:

function calcCDF(data){ 
    data.forEach(function(d,i){ 
     if(i === 0){ 
     d.cum = d.y/dataset.length 
    }else{ 
     d.cum = (d.y/dataset.length) + data[i-1].cum 
    } 
    }) 
    return data 
} 

В моем случае, я уверен, переключая паретовского рода вкл/выкл и перерасчет свойству d.cum каждый раз. Теоретически можно было бы создать два кумулятивных свойства dist; т. е. d.cum для регулярного упорядоченного распределения и скажем d.ParetoCum для отсортированного кумулятивного, но я использую d.cum для всплывающей подсказки и решил против этого.

По оси, я использую единую ординальную шкалу, которая, по моему мнению, более чистая, но требует некоторой работы по получению ярлыков для значимых диапазонов чисел, так как метки и метки больше не очерчивают бункеры, как можно было бы получить с линейной шкалой. Мое решение здесь состояло в том, чтобы просто использовать диапазон номеров в качестве метки. «1 - 1.99» и добавьте функцию для альтернативных меток (получил это решение некоторое время назад от Alternating tick padding in d3.js).

Для сортировки штрих-кода я использую этот пример d3 как ссылку, если вам нужно понять в контексте более простого/меньшего примера.

См. Это fiddle, который включает в себя все вышеперечисленное.Если вы хотите использовать его, я бы предложил добавить проверку, чтобы пользователь не мог переключать обе строки и строку (оставил примечание в коде ... должно быть тривиально)

0

Вместо сортировки y.

data.sort(function(a,b){ return b.y - a.y;}); 

вы должны сортировка х

data.sort(function(a,b){ return a.x - b.x;}); 

Рабочего кода here

+0

Сортировка по x не является предполагаемым поведением. Если вы посмотрите на ссылку gist, комментарий с скриншотом Excel, вот как должна выглядеть диаграмма (например, гистограмма диаграммы парето). Сортируется по наивысшему количеству бинов, по убыванию. Частота подсчета бина равна y не x. Не проверял, может быть, линия может быть правильной, но презентация bin не с вашим решением. Я просто посмотрел на визуализированный график. – David

+0

Не уверен, что я хорошо понимаю вашу проблему, но я думаю, что вы должны использовать руководство x на sortedXScale, например 'var guide = d3.svg.line() .x (function (d) {return sortedXScale (dx) + sortedXScale. rangeBand()/2}) .y (функция (d) {return ycum (d.cum)}) .interpolate ('linear'); 'plunk http://plnkr.co/edit/hOh2tzKBFyXE49m19BMe?p=preview – Cyril

+0

Это ближе к тому, что я ищу, но оно должно действительно выглядеть как [цветные гистограммы с линией здесь] (http: // stackoverflow.com/questions/27554817/r-pareto-chart-grouping-like-histogram?rq=1) или [этот образец d3] (http://bl.ocks.org/daluu/d43ec5e610dd5dedbbe1), который - это тот же тип диаграммы, но не построена гистограмма (макет) (т.е. это настраиваемая диаграмма). В вашем примере линия не перепутана, как мой OP, но это тоже не правильная кривая. – David

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

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