将百分比添加到dc.js中的饼图标签

时间:2014-08-08 18:27:10

标签: javascript d3.js dc.js crossfilter

我有一个饼图,我想为标签添加百分比。这是饼图的jsfiddle,代码如下。现在图表显示了实际值。我查看了dc.js Getting Started and How-To Guide这是仪表板的一个示例。它的图表中有百分比。但是,当我尝试复制结构时,我收到一个错误。例如,当我使用像这样的标签函数时

.label(function(d) {if(all.value){return d.key + " " + d.value / all.value();}
.renderLabel(true)

在控制台中,它说所有都没有定义。此外,d.key也不会返回任何内容。我想我的数据有不同的结构。帮助赞赏。感谢。

HTML

<body>
    <div id='Chart'>
    </div>
</body>

JS

var ndx = crossfilter(data);

var XDimension = ndx.dimension(function (d) {
    return d.Category;
});

var YDimension = XDimension.group();

dc.pieChart("#Chart")
    .width(480).height(300)
    .dimension(XDimension)
    .group(YDimension)
    .label(function(d){return d.value});

dc.renderAll();

数据

var data = [{
    Category: "A",
    ID: "1"
}, {
    Category: "A",
    ID: "1"
}, {
    Category: "A",
    ID: "1"
}, {
    Category: "A",
    ID: "2"
}, {
    Category: "A",
    ID: "2"
}, {
    Category: "B",
    ID: "1"
}, {
    Category: "B",
    ID: "1"
}, {
    Category: "B",
    ID: "1"
}, {
    Category: "B",
    ID: "2"
}, {
    Category: "B",
    ID: "3"
}, {
    Category: "B",
    ID: "3"
}, {
    Category: "B",
    ID: "3"
}, {
    Category: "B",
    ID: "4"
}, {
    Category: "C",
    ID: "1"
}, {
    Category: "C",
    ID: "2"
}, {
    Category: "C",
    ID: "3"
}, {
    Category: "C",
    ID: "4"
}, {
    Category: "C",
    ID: "4"
},{
    Category: "C",
    ID: "5"
}];

3 个答案:

答案 0 :(得分:9)

你很亲密!在这种情况下,我建议做类似以下的事情:

.label(function(d) {
    console.log(JSON.stringify(d));
})

了解数据结构。如果您这样做,您会发现keyvalue位于d.data下,因此您可以拥有类似

的标签
.label(function(d) {
    return d.data.key + ' ' + d.data.value + '%';
})

如果您只想计算所显示圈子的分数,可以使用startAngleendAngle属性。

.label(function(d) {
    return d.data.key + ' ' + Math.round((d.endAngle - d.startAngle) / Math.PI * 50) + '%';
});

(d.endAngle - d.startAngle)将为您提供切片显示的弧度数,因此您可以通过除以圆圈中的弧度数来计算其中的百分比。

答案 1 :(得分:0)

确实,它没有d.data。相反,我使用.renderlet(): :

.renderlet(function(chart){
        chart.selectAll('text.pie-slice').text( function(d) {
        return d.data.key + ' ' + dc.utils.printSingleValue((d.endAngle - d.startAngle) / (2*Math.PI) * 100) + '%';
        })
    })

答案 2 :(得分:0)

.label是修改饼图的正确方法有bug, 通过登录d

进行检查
.label(d => {
    console.log(d);
    // {
    //  key: 'which you return in dimension',
    //  value: 'ex: 259.91'
    // }
})

Ex,阵列中有6个obj,但是日志可能只有3个或4个@@ 解决这个错误

.on('pretransition', function(chart){
    chart.selectAll('text.pie-slice').text(d => {
        console.log(d);
        // {
        //  data: {
        //      key: 'which you return in dimension',
        //      value: 'ex: 259.91'
        //  },
        //  endAngle: 'xxx',
        //  startAngle: 'yyy'
        // }
    })
})

d obj inside text()

通过这种方式,我们可以在数组中记录足够的6个obj 标签文本是text(d => {})

内的返回值
chart.selectAll('text.pie-slice').text(function(d){
    let label = d.data.key;
    return label + ': ' + Number(d.data.value).toFixed(2);
})

//Or play with percentage
chart.selectAll('text.pie-slice').text(function(d){
    return d.data.key + ' ' + dc.utils.printSingleValue((d.endAngle - d.startAngle) / (2*Math.PI) * 100) + '%';
})
相关问题