Daniel.
2008/11/19 Felix Andrews <felix at nfrac.org>
2008/11/20 Deepayan Sarkar <deepayan.sarkar at gmail.com>:
On Wed, Nov 19, 2008 at 8:55 AM, Daniel Kornhauser
<dkor at northwestern.edu> wrote:
Hi:
(Tried to find a bug report about this issue, but was unable to find
it, let
me know if this is a known issue)
I have been working on an interface to highlight xyplot panels on mouse
overs in JavaGD but I have stumbled with what seems to be a bug in
trellis.focus.
I am using R 2.8 with lattice 0.17-15
*** To replicate the bug:
1.- display an xyplot. For example, from the xyplot help page:
library(lattice)
require(stats)
EE <- equal.count(ethanol$E, number=9, overlap=1/4)
## Constructing panel functions on the fly; prepanel
xyplot(NOx ~ C | EE, data = ethanol,
prepanel = function(x, y) prepanel.loess(x, y, span = 1),
xlab = "Compression Ratio", ylab = "NOx (micrograms/J)",
panel = function(x, y) {
panel.grid(h=-1, v= 2)
panel.xyplot(x, y)
panel.loess(x,y, span=1)
},
aspect = "xy")
2.- resize to window be rectangular and have large margins in the left
hand
and right hand side.
3.- run trellis.focus() and try to select the first or last panel, you
should observe that it does not select the right one.
sidenotes:
There are other problems with the focus in JavaGD but I just wanted to
include a simple self contained example in this mail.
If you make the window smaller, trellis.focus() works fine, you have to
make
it bigger than the initial size.
*** To Fix the bug:
I tried to fix this bug in interraction.R but I was unsuccesful.
The problem should stem from the a bad calculation of the pads in the
follwoing lines :
leftPad <-
convertX(sum(glayout$page.layout$widths[1:(colRange[1]-1)]), "npc",
valueOnly = TRUE)
rightPad <-
convertX(sum(glayout$page.layout$widths[(colRange[2]+1):layCols]),
"npc",
valueOnly = TRUE)
topPad <-
convertY(sum(glayout$page.layout$heights[1:(rowRange[1]-1)]), "npc",
valueOnly = TRUE)
botPad <-
convertY(sum(glayout$page.layout$heights[(rowRange[2]+1):layRows]),
"npc",
valueOnly = TRUE)
I was succesful in tweaking the follwing lines adding arbitrary
constants to
make it work for a particular instance of a xyplot with a particular
size of
a window
clickXScaled <- (as.numeric(clickLoc$x) - leftPad +
Danielconstant1)
/ (1 - leftPad - rightPad + Danielconstant1)
....
clickYScaled <- (as.numeric(clickLoc$y) - botPad +
Danielconstant2)
/ (1 - botPad - topPad + Danielconstant3)
This is of course a useless fix, since you want the fix to work for any
plot
with any window size, but I might be valuable information.
*** Questions:
- Is this a real bug ?
- Any suggestions for fixing it ?
- If it can't be fixed, is there a way around this bug ?
(For example, setting the margins to be zero and set a fixed size for
the
xplot)
It appears that the conversions used in the current implementation
(contributed by Felix Andrews) don't work when aspect != "fill"
(probably leading back to the use of 'respect = TRUE' in grid.layout).
Yep, my fault, didn't think it through.
The right way to do this is to first go down to the subregion
containing just the panels, and then locate the click location within
it. But this requires a suitable viewport to be predefined.
I have changed print.trellis to create such a dummy viewport
(accessible by trellis.focus("figure")), and modified trellis.focus()
to use it. I will test it a bit more before uploading a new version
(and also give Felix a chance to see if this breaks anything in
It won't affect playwith; playwith now uses a different approach: a
function
inViewport(x.px, y.px, viewport)
reports whether a click location in pixels is inside the given
viewport. I loop through each panel viewport and check whether the
click is inside.