多维crossfilter求和降维时折叠多余维度的实现方法咨询
dc.js多维度分组折叠实现方案
要实现保留维度内Age Group字段供后续筛选、同时折叠分组中Age Group维度做求和聚合的需求,可通过dc.js支持的伪分组(Fake Group)实现,具体代码如下:
// 定义包含Date、Hair Color、Age Group的三维度,保留Age Group供后续筛选使用 const dateColorAgeDimension = cf.dimension(d => [d.Date, d['Hair Color'], d['Age Group']]); // 基于三维度做初始分组求和 const rawGroup = dateColorAgeDimension.group().reduceSum(d => +d.Value); // 自定义伪分组工具函数,折叠Age Group维度,仅按日期+发色聚合数值 function collapseAgeGroup(rawGroup) { return { all: function() { const aggregateMap = {}; rawGroup.all().forEach(item => { // 提取前两位作为聚合key:日期、发色 const groupKey = [item.key[0], item.key[1]]; const mapKey = JSON.stringify(groupKey); if (!aggregateMap[mapKey]) { aggregateMap[mapKey] = { key: groupKey, value: 0 }; } // 累加同日期同发色下所有年龄组的数值 aggregateMap[mapKey].value += item.value; }); return Object.values(aggregateMap); } }; } // 生成折叠后的分组实例 const collapsedGroup = collapseAgeGroup(rawGroup); // 图表配置保持原有逻辑,仅替换group为折叠后的实例即可 chart .dimension(dateColorAgeDimension) .group(collapsedGroup) .seriesAccessor(d => d.key[1]) .keyAccessor(d => d.key[0]) .valueAccessor(d => d.value)
实现说明
- 原始锯齿问题是因为三维度分组后,每个日期+发色组合会拆分出多个对应不同年龄组的独立条目,图表逐点绘制时就会出现多次数值跳动形成锯齿。通过伪分组折叠后,每个日期+发色组合仅返回一个聚合后的数值,图表即可正常平滑展示。
- 该方案无需修改原有维度定义,Age Group字段始终保留在维度中,后续需要做年龄组筛选、特定发色下钻等操作时可直接调用该维度字段实现。
可选优化方案
如果对图表渲染性能要求较高,也可以拆分维度实现:单独创建仅包含日期+发色的二维度用于图表分组,另外单独创建Age Group维度用于筛选操作,crossfilter的筛选规则为全局生效,两个维度的筛选操作会自动联动,该方案性能更优,仅需多占用少量内存存储额外维度。
内容的提问来源于stack exchange,提问作者Daniel Baker
相关产品推荐
相关产品推荐

