【发布时间】:2020-02-03 16:21:45
【问题描述】:
我有多个数字列的 D3 数据集,我成功地使用这些列来呈现 DC.js 图表。该图表目前固定为仅使用其中一个数字列。
但是,我希望能够在数字列之间动态切换,以将它们交换为 DC.js 图表中的值。
我计划通过在页面顶部使用一组带有 onclick 事件的 html 链接来创建变量以更改在 D3 数据集中选择的列。这工作正常。
但是,我不知道如何刷新 DC.js 图表以使用更新的数据集。
我看到过其他类似的问题here 和here,但它们对我没有帮助。
这是我的代码:
bucket.getObject({
Bucket: 's3-google-analytics',
Key: 'merged.csv'
},
function awsDataFile(error, data) {
if (error) {
return console.log(error);
}
mergedcsv = d3.csv.parse(data.Body.toString());
var parseDate = d3.time.format("%Y%m%d").parse;
var counter = 0;
var varMetric = 'sessions';
// Note, i can successfully manually change varMetric variable
//to change numeric column is used in chart.
mergedcsv.forEach(function(d) {
d.date = parseDate(d.date);
d.dateString = formatDateYYYYMMDD(d.date);
if (varMetric == 'sessions') {
d.metric = +d.sessions;
} else if (varMetric == 'users') {
d.metric = +d.users;
} else if (varMetric == 'bounceRate') {
d.metric = +d.bounceRate;
} else if (varMetric == 'newUsers') {
d.metric = +d.newUsers;
} else if (varMetric == 'sessionDuration') {
d.metric = +d.sessionDuration;
} else if (varMetric == 'sessionsPerUser') {
d.metric = +d.sessionsPerUser;
} else if (varMetric == 'twitterSessions') {
d.metric = +d.twitterSessions;
}
countLoop = counter++;
});
var ndx = crossfilter(mergedcsv);
// where to put this?
$('#metric a').click(function(e) {
var varMetric = $(e.target).text();
console.log(varMetric);
ndx.remove();
// which to use .. add or crossfilter?
//ndx.add(mergedcsv);
//ndx = crossfilter(mergedcsv);
// which to use .. redrawAll or renderAll?
//dc.redrawAll();
//dc.renderAll();
});
var yyyymmDim = ndx.dimension(function(d) { return d["yyyymm"]; });
var PPCCByYYYYMM = yyyymmDim.group().reduceSum( function(d) { return +d.metric; });
BarChartAlltimeByMonth = dc.barChart("#barchart-alltime-by-month");
BarChartAlltimeByMonth
.height(100)
.width(1000)
.margins({top: 0, right: 10, bottom: 50, left: 35})
.dimension(yyyymmDim)
.group(PPCCByYYYYMM)
dc.renderAll();
//on click put here but doesn't work
$('#metric a').click(function(e) {
var varMetric = $(e.target).text();
console.log('onclick ' + varMetric);
ndx.remove();
ndx.add(mergedcsv);
//dc.redrawAll();
dc.renderAll();
});
});
我将onclick 处理程序放在脚本底部。
在上面的其他 SO 问题中,这似乎是通过 1) 删除旧数据、2) 添加新数据和 3) 重绘所有图表来完成的。
ndx.remove() 会删除数据,但ndx.add(mergedcsv) 不会添加数据。
dc.redrawAll() 不做任何事情,但 dc.renderAll() 确实会导致图表再次呈现,但数据没有变化。
这可能是 DC.js 和一般 Javascript 问题,因为我都不流利。
【问题讨论】:
-
应该可以。基本问题是,为什么没有定义
ndx?通常 JavaScript 通过它们的 作用域 使变量可用;也就是说,如果这两个片段是同一个文件的一部分并且没有被函数包围,那么ndx应该是可用的。您能否编辑您的问题并详细说明这些片段在更大的程序/页面中的位置? -
(替换
ndx的行不起作用,但删除/添加数据行应该起作用。) -
感谢您将问题重新定义为通用 javascript 问题,.它不是 DC.js。
click函数在var ndx = crossfilter(mergedcsv);之前,所以为什么没有声明它。在var ndx之后放置click函数确实允许ndx.remove();工作,例如清除图表数据。所以我需要重构click函数可以更新mergedcsv数据,然后重绘/渲染图表。将更新有问题的代码以显示更大的图片。 -
太棒了。是的,您应该在接收 AWS 数据的块内定义您的点击处理程序。
-
或者至少这是解决问题的最简单方法,其他方法包括类和显式全局变量,如
window.ndx
标签: javascript d3.js dc.js