Как получить динамическое количество полей в dc.js numberDisplay? - PullRequest
3 голосов
/ 10 октября 2019

В настоящее время я пытаюсь выяснить, как получить количество уникальных записей для отображения с использованием DJ.js и D3.js

Набор данных выглядит следующим образом:

id,name,artists,genre,danceability,energy,key,loudness,mode,speechiness,acousticness,instrumentalness,liveness,valence,tempo,duration_ms,time_signature
6DCZcSspjsKoFjzjrWoCd,God's Plan,Drake,Hip-Hop/Rap,0.754,0.449,7,-9.211,1,0.109,0.0332,8.29E-05,0.552,0.357,77.169,198973,4
3ee8Jmje8o58CHK66QrVC,SAD!,XXXTENTACION,Hip-Hop/Rap,0.74,0.613,8,-4.88,1,0.145,0.258,0.00372,0.123,0.473,75.023,166606,4

В наборе данных содержится 100 записей, и я ожидаю, что счетчик покажет 70 для числа уникальных художников.

var ndx = crossfilter(spotifyData);
totalArtists(ndx);

....

function totalArtists(ndx) {
    // Select the artists
    var totalArtistsND = dc.numberDisplay("#unique-artists");
    // Count them
    var dim = ndx.dimension(dc.pluck("artists"));
    var uniqueArtist = dim.groupAll();
    totalArtistsND.group(uniqueArtist).valueAccessor(x => x);

    totalArtistsND.render();
}

В результате я получаю только 100, когда мне нужно получить 70.

Спасибо за миллион, любая помощь будет оценена

1 Ответ

2 голосов
/ 11 октября 2019

Вы на правильном пути - объект groupAll обычно является правильным видом объекта для использования с dc.numberDisplay.

Однако dimension.groupAll не использует размерностьключевая функция. Как и любой groupAll, он просматривает все записи и возвращает одно значение;единственное различие между dimension.groupAll() и crossfilter.groupAll() состоит в том, что первый не наблюдает фильтры измерения, в то время как последний наблюдает все фильтры.

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

Вместо этого мы можем написать «поддельный groupAll», объект, метод которого .value() возвращает значение, динамически вычисляемое в соответствии с текущими фильтрами.

Обычный групповой объект уже имеет уникальный счетчик: количество бинов. Таким образом, мы можем создать фальшивую groupAll, которая оборачивает обычную группу и возвращает длину массива, возвращаемого group.all():

function unique_count_groupall(group) {
  return {
    value: function() {
      return group.all().filter(kv => kv.value).length;
    }
  };
}

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

Использование фальшивой группыВсе вот так:

var uniqueArtist = unique_count_groupall(dim.group());

Демо-скрипка .

Я только что добавил это в FAQ .

...