(Michael Droettboom)
The display at the bottom that says “Cursor
at: X, Y” is in pixels, not in
data units. ?It would be great if this could
display data units, though
being general enough to support custom scales
(eg. log) and projections (eg.
polar) may be tricky without making a round-trip
to the server.
(Simon Ratcliffe)
As you mentioned, the trick is in giving the client
some view on how
pixels should map to data values without fetching
these for each mouse
movement. For simple cartesian plots this is probably
pretty
straightforward. It is something we need to get
working for our
internal use so it should get solved at some stage.
I have accomplished this in one of my applications as
follows:
Axes =figure.get_axes()
#The transform used in this axis is Composite Generic
Transform, so get the two affine transformation matricies
MatrixA = axes[0].transData.inverted()._a.get_matrix()
MatrixB = axes[0].transData.inverted()._b.get_matrix()
I use an Ajax or WebSockets call to get MatrixA and MatrixB
to the client (javascript) side, and then do the affine transform in the
mousemove callback:
function ev_mousemove(ev){
if(affineMatrixPopulated){
//First convert the browser coordinates to the form MPL uses
var x, y, x2, y2;
x = ev.clientX - canvas.offsetLeft;
y = canvas.height - (ev.clientY - canvas.offsetTop);
//Now it’s just a couple matrix multiplications:
// I flattened the Matrix when transferring from the server
process, so affineMatrixA[2] is MatrixA[0,2]
// affineMatrixA[4] is MatrixA[1,1] etc…
x2 = affineMatrixA[0] * x + affineMatrixA[1] * y + affineMatrixA[2];
y2 = affineMatrixA[3] * x + affineMatrixA[4] * y + affineMatrixA[5];
x2 = affineMatrixB[0] * x2 + affineMatrixB[1] * y2 + affineMatrixB[2];
y2 = affineMatrixB[3] * x2 + affineMatrixB[4] * y2 + affineMatrixB[5];
document.getElementById(‘cursor_info’).innerText = "Cursor at: " + x2
- “,” + y2;
}
}
The simple affine transformation can be accomplished by
leaving off the MatrixB part. Non affine will probably be similar to the above
followed by a log or exponential operation.
Ryan Wagner** ** |Senior Technical Support Engineer |
Rogue
Wave Software, Inc.
5500
Flatiron Parkway, Suite 200, Boulder, CO 80301
ryan.wagner@…869…