放大图表数据时,我如何使用 D3.js "onClick" 事件和 nvd3 柱?
How can I use D3.js "onClick" event with an nvd3 bar when zoomed in on chart data?
另一个晦涩的 nvd3 问题,这次是 onClick
。
我能够使用这个 question to figure out how to add an "onClick" event for bars using nvd3's linePlusBarChart。
jsfiddle here is working。请随时单击栏以查看我的目标(使用 alert
作为测试)。相关代码在JavaScript的底部,也显示在这里:
d3.select('#chart1 svg')
.datum(testdata)
.transition().duration(500).call(chart);
nv.utils.windowResize(chart.update);
chart.dispatch.on('stateChange', function(e) { nv.log('New State:', JSON.stringify(e)); });
return chart;
}, function(){
d3.selectAll(".nv-bar").on('click',
function(e){
console.log(e);
alert("You clicked on bar!");
}
);
});
这真是太棒了!我对这个解决方案感到非常满意。使用 function(e)
从 NVD3 柱获取数据,然后我可以使用柱数据(数量和日期)通过 JavaScript.
做其他很酷的事情
不幸的是,我发现如果我使用底部面板放大特定日期范围,'onClick' 事件将停止工作。
发生了什么导致 onClick
事件与特定柱断开关联?
我是否需要在其他位置添加 onClick
逻辑?
如有任何帮助,我们将不胜感激。
画笔调用historicalBar
图表,选择焦点条。
呈现图表后调度 renderEnd
事件。
我们将 onclick 回调放在一个单独的函数中,因为我们需要它不止一次
function addOnClick() {
d3.selectAll(".nv-bar")
.on('click', function(e) { console.log(e); alert("You clicked on bar!"); } );
}
我们需要为此事件添加回调
chart.bars.dispatch.on('renderEnd', addOnClick);
图表的完整代码为
var chart;
nv.addGraph(function() {
chart = nv.models.linePlusBarChart()
.margin({top: 50, right: 80, bottom: 30, left: 80})
.legendRightAxisHint(' [Using Right Axis]')
.color(d3.scale.category10().range());
chart.xAxis.tickFormat(function(d) {
return d3.time.format('%x')(new Date(d))
}).showMaxMin(false);
chart.y2Axis.tickFormat(function(d) { return '$' + d3.format(',f')(d) });
chart.bars.forceY([-3899468]).padData(false);
chart.lines.forceY([-600]).padData(false);
chart.x2Axis.tickFormat(function(d) {
return d3.time.format('%x')(new Date(d))
}).showMaxMin(false);
d3.select('#chart1 svg')
.datum(testdata)
.transition().duration(500).call(chart);
nv.utils.windowResize(chart.update);
chart.dispatch.on('stateChange', function(e) { nv.log('New State:', JSON.stringify(e)); });
chart.bars.dispatch.on('renderEnd', addOnClick);
return chart;
}, addOnClick
);
function addOnClick() {
d3.selectAll(".nv-bar")
.on('click', function(e) { console.log(e); alert("You clicked on bar!"); } );
}
另一个晦涩的 nvd3 问题,这次是 onClick
。
我能够使用这个 question to figure out how to add an "onClick" event for bars using nvd3's linePlusBarChart。
jsfiddle here is working。请随时单击栏以查看我的目标(使用 alert
作为测试)。相关代码在JavaScript的底部,也显示在这里:
d3.select('#chart1 svg')
.datum(testdata)
.transition().duration(500).call(chart);
nv.utils.windowResize(chart.update);
chart.dispatch.on('stateChange', function(e) { nv.log('New State:', JSON.stringify(e)); });
return chart;
}, function(){
d3.selectAll(".nv-bar").on('click',
function(e){
console.log(e);
alert("You clicked on bar!");
}
);
});
这真是太棒了!我对这个解决方案感到非常满意。使用 function(e)
从 NVD3 柱获取数据,然后我可以使用柱数据(数量和日期)通过 JavaScript.
不幸的是,我发现如果我使用底部面板放大特定日期范围,'onClick' 事件将停止工作。
发生了什么导致 onClick
事件与特定柱断开关联?
我是否需要在其他位置添加 onClick
逻辑?
如有任何帮助,我们将不胜感激。
画笔调用historicalBar
图表,选择焦点条。
呈现图表后调度 renderEnd
事件。
我们将 onclick 回调放在一个单独的函数中,因为我们需要它不止一次
function addOnClick() {
d3.selectAll(".nv-bar")
.on('click', function(e) { console.log(e); alert("You clicked on bar!"); } );
}
我们需要为此事件添加回调
chart.bars.dispatch.on('renderEnd', addOnClick);
图表的完整代码为
var chart;
nv.addGraph(function() {
chart = nv.models.linePlusBarChart()
.margin({top: 50, right: 80, bottom: 30, left: 80})
.legendRightAxisHint(' [Using Right Axis]')
.color(d3.scale.category10().range());
chart.xAxis.tickFormat(function(d) {
return d3.time.format('%x')(new Date(d))
}).showMaxMin(false);
chart.y2Axis.tickFormat(function(d) { return '$' + d3.format(',f')(d) });
chart.bars.forceY([-3899468]).padData(false);
chart.lines.forceY([-600]).padData(false);
chart.x2Axis.tickFormat(function(d) {
return d3.time.format('%x')(new Date(d))
}).showMaxMin(false);
d3.select('#chart1 svg')
.datum(testdata)
.transition().duration(500).call(chart);
nv.utils.windowResize(chart.update);
chart.dispatch.on('stateChange', function(e) { nv.log('New State:', JSON.stringify(e)); });
chart.bars.dispatch.on('renderEnd', addOnClick);
return chart;
}, addOnClick
);
function addOnClick() {
d3.selectAll(".nv-bar")
.on('click', function(e) { console.log(e); alert("You clicked on bar!"); } );
}