Zoom/pan keybinding for plotly
HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<script type="text/javascript" src="https://cdn.plot.ly/plotly-latest.min.js"></script>
<title>JS Bin</title>
</head>
<body>
<div>click first outside the graph to activate key bindings</div>
<div id="graph"></div>
</body>
</html>
JavaScript
function gaussianRand() {
var rand = 0;
for (var i = 0; i < 6; i += 1) {
rand += Math.random();
}
return (rand / 6)-0.5;
}
var X = [],
Y = [],
n = 10000,
i;
for (i = 0; i < n; i += 1) {
X.push(gaussianRand());
Y.push(gaussianRand());
}
var graph = document.getElementById('graph');
Plotly.plot(graph, [{
type: "scattergl",
mode: "markers",
x: X,
y: Y
}], {}, {scrollZoom: true});
var update;
function pan(axis, dx, mode=1) {
axis += 'axis';
var [min, max] = graph._fullLayout[axis].range;
dx *= max - min;
update[axis+'.range'] = [min+dx, max+mode*dx];
}
function panX(dx) {pan('x', dx)}
function panY(dy) {pan('y', dy)}
function zoomX(dx) {pan('x', dx, -1)}
function zoomY(dy) {pan('y', dy, -1)}
document.addEventListener("keydown", function(e){
var key = e.key;
if (e.ctrlKey) key = 'Ctrl+' + key;
console.log(e, key);
var fac = 0.1; // pan and zoom factor
update = {};
var extremes = graph._fullData[0]._extremes; // only first data set
switch (key) {
case 'Ctrl+ArrowRight': zoomX(fac); break;
case 'Ctrl+ArrowLeft': zoomX(-fac); break;
case 'Ctrl+ArrowUp': zoomY(fac); break;
case 'Ctrl+ArrowDown': zoomY(-fac); break;
case '+': zoomX(fac); zoomY(fac); break;
case '-': zoomX(-fac); zoomY(-fac); break;
case 'X': case 'U':
update['xaxis.range'] = [extremes.x.min[0].val, extremes.x.max[0].val];
case 'Y': case 'U':
update['yaxis.range'] = [extremes.y.min[0].val, extremes.y.max[0].val]; break;
case 'x': case 'u':
update['xaxis.autorange'] = true;
case 'y': case 'u':
update['yaxis.autorange'] = true; break;
case '0': update['yaxis.range[0]'] = 0; break;
case 'ArrowRight': panX(fac); break;
case 'ArrowLeft': panX(-fac); break;
case 'ArrowUp': panY(fac); break;
case 'ArrowDown': panY(-fac); break;
case...