【问题标题】:Creating a simple pie chart using dc.js使用 dc.js 创建一个简单的饼图
【发布时间】:2015-08-29 19:22:06
【问题描述】:

我正在尝试使用 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();

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

感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    我想只是丢了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 条记录,甚至是逐个播放数据)并且您希望聚合数据并在不同维度上动态过滤的场景而设计的。

    【讨论】:

    • 谢谢!你是对的——我想我不需要这种数据集的交叉过滤器。我喜欢 dc.js 中的饼图,所以也许我会找到一种不使用交叉过滤器来创建它们的方法。摆脱salaryGroupPerPlayer 仍然给我留下一个空饼图。我想在再次尝试之前,我必须真正了解 crossfilter、dc.js 和 mapreduce。感谢您的教程,我会通过它。
    • dc.js 只期望具有某些特定属性/函数的对象,这些属性/函数提供要传递给其 dimension() 和 group() 方法的数据。 IIRC,维度对象需要filterfilterExactfilterRangefilterFunction 方法,而组对象需要all 方法(或有时top)。如果您只是将空对象传递给它们,然后查看错误控制台,它将告诉您缺少哪个方法。祝你好运!
    • 我认为在不需要的时候使用交叉过滤器并没有太大的危害。它可能会慢一点,但您可能不会注意到它。可视化的大部分成本是 DOM 元素而不是计算。所以,在你有理由不这样做之前,它可能更容易使用。
    • 我明白你的意思。但是您在代码中看到任何结构性问题吗?它仍在输出一个空饼图。它正在创建一个可视化,所以我们必须走在正确的轨道上。
    • @user5279393 我同意 Gordon 的观点,即使用 Crossfilter 不会受到伤害。尽管它的 API 和状态性本身可能会令人困惑。关于您的可视化 - 我看不出有什么特别的错误。你能创建一个 jsFiddle 并向我们展示问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多