dc.js 条形图 - 通过多个数据条目的总和计算条形大小
dc.js bar chart - calculate bar size by sum of multiple data entries
对不起标题,很难用一句话概括我想要实现的目标。
我有一个条形图,它使用了其他 6 个图表也使用的交叉过滤器。我的数据看起来如下(注意:这只是一个小样本,每个object)
中的键更多
var data = [
{ clientime : '20210603000000', calendarweek : '22', x : 9, y : 4 },
{ clientime : '20210603000007', calendarweek : '22', x : 5, y : 5 },
{ clientime : '20210607000000', calendarweek : '23', x : 1, y : 2 },
{ clientime : '20210607000007', calendarweek : '23', x : 5, y : 5 },
{ clientime : '20210615000000', calendarweek : '24', x : 10, y : 20 },
{ clientime : '20210615000011', calendarweek : '24', x : 5, y : 5 },
];
每个柱的类别是日历周,我希望该值是所有 x 的总和除以所有 y 的总和。
根据上面的示例,我希望看到 3 个柱状图。
Bar '22' should have the value `sum(9,5)/sum(4,5)` = 1.556
Bar '23' should have the value `sum(1,5)/sum(2,5)` = 0.857
Bar '24' should have the value `sum(10,5)/sum(20,5)` = 0.6
我的第一个意图是使用 reduce
函数,我可以在自定义字典中添加或删除总和。
var x_key = "calendarweek";
var dim = crossfilter.dimension( d => d[x_key] );
var grp = dim.group().reduce(
( p, v ) => {
p.sum_x += v.x;
p.sum_y += v.y;
return p;
},
( p, v ) => {
p.sum_x -= v.x;
p.sum_y -= v.y;
return p;
},
() => ( { sum_x : 0, sum_y : 0 } )
);
var chart = dc.barChart( "#chart" );
chart
.width( 490 )
.height( 280 )
.dimension( dim )
.group( grp )
.x( d3.scaleBand() )
.xUnits( dc.units.ordinal )
.elasticX( true )
.elasticY( true )
.controlsUseVisibility( true )
.margins( {
top : 10, right : 50, bottom : 20, left : 40,
} );
grp.all()
看起来确实不错,但从现在开始我不确定如何将数据正确设置为图表。使用创建的组根本没有显示任何条形图,因为我在 dc.js 不理解的 reduce 函数中创建了一个 object。
此外,我仍然希望能够将柱状图限制为 N 个条目。
感谢 Gordon 在评论中为我指明了正确的方向,我得以使用 valueAccesor
.
解决了我的问题
chart_mttrhist.valueAccessor( function( d ) {
return ( d.value.sum_x / d.value.sum_y );
} );
请注意问题中的代码略有改动。
对不起标题,很难用一句话概括我想要实现的目标。
我有一个条形图,它使用了其他 6 个图表也使用的交叉过滤器。我的数据看起来如下(注意:这只是一个小样本,每个object)
中的键更多var data = [
{ clientime : '20210603000000', calendarweek : '22', x : 9, y : 4 },
{ clientime : '20210603000007', calendarweek : '22', x : 5, y : 5 },
{ clientime : '20210607000000', calendarweek : '23', x : 1, y : 2 },
{ clientime : '20210607000007', calendarweek : '23', x : 5, y : 5 },
{ clientime : '20210615000000', calendarweek : '24', x : 10, y : 20 },
{ clientime : '20210615000011', calendarweek : '24', x : 5, y : 5 },
];
每个柱的类别是日历周,我希望该值是所有 x 的总和除以所有 y 的总和。
根据上面的示例,我希望看到 3 个柱状图。
Bar '22' should have the value `sum(9,5)/sum(4,5)` = 1.556
Bar '23' should have the value `sum(1,5)/sum(2,5)` = 0.857
Bar '24' should have the value `sum(10,5)/sum(20,5)` = 0.6
我的第一个意图是使用 reduce
函数,我可以在自定义字典中添加或删除总和。
var x_key = "calendarweek";
var dim = crossfilter.dimension( d => d[x_key] );
var grp = dim.group().reduce(
( p, v ) => {
p.sum_x += v.x;
p.sum_y += v.y;
return p;
},
( p, v ) => {
p.sum_x -= v.x;
p.sum_y -= v.y;
return p;
},
() => ( { sum_x : 0, sum_y : 0 } )
);
var chart = dc.barChart( "#chart" );
chart
.width( 490 )
.height( 280 )
.dimension( dim )
.group( grp )
.x( d3.scaleBand() )
.xUnits( dc.units.ordinal )
.elasticX( true )
.elasticY( true )
.controlsUseVisibility( true )
.margins( {
top : 10, right : 50, bottom : 20, left : 40,
} );
grp.all()
看起来确实不错,但从现在开始我不确定如何将数据正确设置为图表。使用创建的组根本没有显示任何条形图,因为我在 dc.js 不理解的 reduce 函数中创建了一个 object。
此外,我仍然希望能够将柱状图限制为 N 个条目。
感谢 Gordon 在评论中为我指明了正确的方向,我得以使用 valueAccesor
.
chart_mttrhist.valueAccessor( function( d ) {
return ( d.value.sum_x / d.value.sum_y );
} );
请注意问题中的代码略有改动。