javascript - 使用 dc.js 创建一个简单的饼图

标签 javascript d3.js data-visualization dc.js crossfilter

我正在尝试使用 dc.js 创建一些交互式饼图来表示篮球队的统计数据。一个饼图会显示每个球员的积分,另一个饼图会显示他们的薪水等,代表球队总分的一部分。

我不太明白如何使用交叉过滤器 .dimension().group()功能。 reduceSum() 真的需要在里面吗?我得到的只是一个空饼图。我见过的其他示例具有不同的结构化数据,不适用于这种情况。

下面是一些与薪水饼图相关的代码:

var data = [
{"player":"boomhauer", "rebound_avg":12.1, "salary":4000, "point_avg":15},
{"player":"bill", "rebound_avg":4.2, "salary":3000, "point_avg":20},
{"player":"hank", "rebound_avg":12.1, "salary":4000, "point_avg":15},
{"player":"dale", "rebound_avg":16.1, "salary":6000, "point_avg":4},
];

var ndx = crossfilter(data);
var playerDim = ndx.dimension(function(d) {return d.player;});  

var salaryPerPlayer = playerDim.group().reduceSum(function(d) {return d.salary;});

var salaryGroupPerPlayer = salaryPerPlayer.group(function(d) {return d.player; });

var salaryRingChart = dc.pieChart("#chart-ring-salary");

salaryRingChart
        .width(200)
        .height(200)
        .slicesCap(17)
        .innerRadius(10)
        .dimension(salaryPerPlayer)
        .group(salaryGroupPerPlayer)
        .renderLabel(true);


dc.renderAll();

我得到的只是一个空饼图。

感谢您的帮助!

最佳答案

我想只是失去salaryGroupPerPlayer:

var data = [
{"player":"boomhauer", "rebound_avg":12.1, "salary":4000, "point_avg":15},
{"player":"bill", "rebound_avg":4.2, "salary":3000, "point_avg":20},
{"player":"hank", "rebound_avg":12.1, "salary":4000, "point_avg":15},
{"player":"dale", "rebound_avg":16.1, "salary":6000, "point_avg":4},
];

var ndx = crossfilter(data);
var playerDim = ndx.dimension(function(d) {return d.player;});  

var salaryPerPlayer = playerDim.group().reduceSum(function(d) {return d.salary;});

var salaryRingChart = dc.pieChart("#chart-ring-salary");

salaryRingChart
        .width(200)
        .height(200)
        .slicesCap(17)
        .innerRadius(10)
        .dimension(salaryPerPlayer)
        .group(salaryPerPlayer)
        .renderLabel(true);


dc.renderAll();

这是一个很好的 Crossfilter 教程:http://blog.rusty.io/2012/09/17/crossfilter-tutorial/

reduceSum 是必需的,因为 Crossfilter 中组的默认聚合是计数。这只会计算每个玩家的记录数,即 1。所以,不是很有趣!

不过,我会质疑您为什么要使用 Crossfilter。数据都是预先聚合的,你只会有 1 个维度(玩家)。对这些图表进行过滤实际上没有任何意义。 Crossfilter 的设计更多地适用于您有分解数据(每场比赛中每个玩家可能有 1 条记录,甚至是逐场数据)并且您想要聚合数据并在不同维度上动态过滤的场景。

关于javascript - 使用 dc.js 创建一个简单的饼图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32289886/

相关文章:

javascript - Three.js 三 Angular 形未绘制

javascript - 设置 HTML5 页面使其适合所有设备而无需滚动

javascript - d3 : will selection. 样式 ('font-size' ) 总是以 px 为单位返回值?

javascript - 如何向 CanvasJS 中的散点图添加一条最佳拟合线(趋势线)?

JavaScript 抛出 TypeError 说我的变量未定义

javascript - 无法使用 Nodemailer 发送邮件

javascript - d3 时间线根据时间偏移使轴分段(颜色代码)

svg - 使用 d3.js 和 css 应用属性的区别?

data-visualization - Vega Visualization timeunit hoursminutes 顺序错误

javascript - SVG 路径渲染是否可以在 geometricPrecision 选项之外消除锯齿?