dc.js - 如何在 dc.js numberDisplay 中获取动态字段计数?
问题描述
我目前正在尝试弄清楚如何使用 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。
谢谢一百万,任何帮助将不胜感激
解决方案
您走在正确的轨道上 - groupAll 对象通常是正确使用的对象dc.numberDisplay
。
但是,dimension.groupAll不使用维度的键功能。像任何 groupAll 一样,它查看所有记录并返回一个值;dimension.groupAll()
和之间的唯一区别crossfilter.groupAll()
是前者不观察维度的过滤器,而后者观察所有过滤器。
如果要使用dimension.groupAll
,则必须编写 reduce 函数来观察行的添加和删除,并记录它看到的独特艺术家的数量。听起来有点乏味,可能有问题。
相反,我们可以编写一个“假 groupAll”,一个对象,其.value()
方法返回一个根据当前过滤器动态计算的值。
普通的 group 对象已经有一个唯一的计数:bin 的数量。所以我们可以创建一个假的 groupAll 包装一个普通组并返回由返回的数组的长度group.all()
:
function unique_count_groupall(group) {
return {
value: function() {
return group.all().filter(kv => kv.value).length;
}
};
}
请注意,我们还必须在计数之前过滤掉任何零值箱。
像这样使用假的 groupAll:
var uniqueArtist = unique_count_groupall(dim.group());
我刚刚将此添加到常见问题解答中。
推荐阅读
- php - 删除 opencart 产品模型
- java - 在通知流上播放声音
- javascript - 在新选项卡中打开 base64 pdf 会冻结某个文件大小的选项卡
- python - 在 Python 中锁定 Tkinter 主窗口并保持 X 按钮运行
- javascript - 如何在 Laravel 中通过多次浏览上传多个图像?
- python-3.x - 如何在没有发件人和服务器的情况下在python中将文本发送到电子邮件地址
- python-3.x - Python:如何在 x 轴上正确缩放此图中的点?
- python - Kivy 运行但不打开窗口
- azureservicebus - MassTransit:发布事件创建了一个名为完全命名空间接口的附加主题
- clojurescript - 如何将环境变量传递给 ClojureScript 应用程序?