okay, I found a solution: library(lattice)
f <- function(x) 1/((1-x[1])*(1-x[2])+1) u <- seq(0, 1, length.out=20) grid <- expand.grid(x=u, y=u) x <- grid[,1] y <- grid[,2] z <- apply(grid, 1, f) pt.x <- c(0.4, 0.7) pt.y <- c(0.6, 0.8) eps <- 0.4 pts <- rbind(c(pt.x, f(pt.x)-eps), c(pt.y, f(pt.y))) # points to add to the wireframe trellis.device("pdf", onefile=FALSE, paper="special", width=5.4, height=5.4) wireframe(z~x*y, pts=pts, aspect=1, scales=list(col=1, arrows=FALSE), zlim=c(0,1), panel.3d.wireframe = function(x,y,z,xlim,ylim,zlim,xlim.scaled, ylim.scaled,zlim.scaled,pts,drape=drape,...){ panel.3dwire(x=x, y=y, z=z, xlim=xlim, ylim=ylim, zlim=zlim, xlim.scaled=xlim.scaled, ylim.scaled=ylim.scaled, zlim.scaled=zlim.scaled,drape=TRUE,...) panel.3dscatter(x=pts[,1], y=pts[,2], z=pts[,3], xlim=xlim, ylim=ylim, zlim=zlim, xlim.scaled=xlim.scaled, ylim.scaled=ylim.scaled, zlim.scaled=zlim.scaled, type="p", col=c(2,3), cex=1.8, pch=c(3,4), .scale=TRUE, ...) }) dev.off() On 2011-03-30, at 23:56 , Marius Hofert wrote: > Dear Deepayan, > > thanks for answering. It's never too late to be useful. > > I see your point in the minimal example. I checked the z-axis limits in my > original problem for the point to be inside and it wasn't there. I can't > easily > reproduce it from the minimal example though. I'll get back to you if I run > into > this problem again. > > In the example below, both points are shown. Although one lies clearly > below/under > the surface, it looks as if it lies above. One would probably have to plot > this > point first so that the wire frame is above the point. But still, this is > misleading since the eye believes that the wireframe is *not* transparent. > This > happens because the lines connecting (0,1,0)--(1,1,0)--(1,0,0) [dashed ones] > are > not completely visible [also not the one from (1,1,0) to (1,1,1)]. How can I > make > them visible even if they lie behind/under the wireframe? I tried to work > with > col="transparent" and with alpha=... but neither did work as I expected. > My goal is to make the small "rectangles" between the wire transparent. > I also use these plots in posters with a certain gradient-like background > color > and so it's a bit annoying that the "rectangles" are filled with white color. > > Cheers and many thanks for helping [as usual], > > Marius > > library(lattice) > > f <- function(x) 1/((1-x[1])*(1-x[2])+1) > > u <- seq(0, 1, length.out=20) > grid <- expand.grid(x=u, y=u) > x <- grid[,1] > y <- grid[,2] > z <- apply(grid, 1, f) > > pt.x <- c(0.4, 0.7) > pt.y <- c(0.6, 0.8) > eps <- 0.4 > pts <- rbind(c(pt.x, f(pt.x)-eps), c(pt.y, f(pt.y))) # points to add to the > wireframe > > trellis.device("pdf", onefile=FALSE, paper="special", width=5.4, height=5.4) > wireframe(z~x*y, pts=pts, aspect=1, scales=list(col=1, arrows=FALSE), > zlim=c(0,1), > panel.3d.wireframe = function(x,y,z,xlim,ylim,zlim,xlim.scaled, > ylim.scaled,zlim.scaled,pts,...){ > panel.3dwire(x=x, y=y, z=z, xlim=xlim, ylim=ylim, zlim=zlim, > xlim.scaled=xlim.scaled, ylim.scaled=ylim.scaled, > zlim.scaled=zlim.scaled,...) > panel.3dscatter(x=pts[,1], y=pts[,2], z=pts[,3], > xlim=xlim, ylim=ylim, zlim=zlim, > xlim.scaled=xlim.scaled, ylim.scaled=ylim.scaled, > zlim.scaled=zlim.scaled, type="p", col=c(2,3), > cex=1.8, pch=c(3,4), .scale=TRUE, ...) > }) > dev.off() > > On 2011-03-30, at 10:52 , Deepayan Sarkar wrote: > >> On Fri, Mar 4, 2011 at 1:47 PM, Marius Hofert <m_hof...@web.de> wrote: >>> Dear expeRts, >>> >>> I would like to add two points to a wireframe plot. The points have (x,y,z) >>> coordinates >>> where z is determined to be on the wireframe [same z-value]. Now something >>> strange >>> happens. One point is perfectly plotted, the other isn't shown at all. It >>> only >>> appears if I move it upwards in z-direction by adding a positive number. So >>> somehow >>> it disappears in the wireframe-surface *although* the plot symbol [the >>> cross] has >>> a positive length in each dimension [I also chose cex=5 to make it large >>> enough so >>> that it should (theoretically) be visible]. >>> >>> My wireframe plot is a complicated function which I cannot post here. Below >>> is a minimal >>> example, however, it didn't show the same problem [the surface is too nice >>> I guess]. >>> I therefore *artifically* create the problem in the example below so that >>> you know >>> what I mean. For one of the points, I subtract an epsilon [=0.25] in >>> z-direction and >>> suddenly the point completely disappears. The strange thing is that the >>> point is >>> not even "under" the surface [use the screen-argument to rotate the >>> wireframe plot to check this], >>> it's simply gone, eaten up by the surface. >>> >>> How can I make the two points visible? >>> I also tried to use the alpha-argument to make the wireframe transparent, >>> but I couldn't >>> solve the problem. >>> >>> Cheers, >>> >>> Marius >>> >>> PS: One also faces this problem for example if one wants to make points >>> visible that are on "opposite sides" of the wireframe. >>> >>> library(lattice) >>> >>> f <- function(x) 1/((1-x[1])*(1-x[2])+1) >>> >>> u <- seq(0, 1, length.out=20) >>> grid <- expand.grid(x=u, y=u) >>> x <- grid[,1] >>> y <- grid[,2] >>> z <- apply(grid, 1, f) >>> >>> pt.x <- c(0.2, 0.5) >>> pt.y <- c(0.6, 0.8) >>> eps <- 0.25 >>> pts <- rbind(c(pt.x, f(pt.x)-eps), c(pt.y, f(pt.y))) # points to add to the >>> wireframe >> >> The reason in this case is fairly obvious: you have >> >>> pts >> [,1] [,2] [,3] >> [1,] 0.2 0.5 0.4642857 >> [2,] 0.6 0.8 0.9259259 >> >> So the z-value for Point 1 is 0.4642857, which is less than 0.5, the >> minimum of the z-axis.panel.3dscatter() "clips" any points outside the >> range of the bounding box, so this point is not plotted. >> >> I can't say what the problem was in your original example without >> looking at it, but I would guess it's caused by something similar. >> >> Hope this is not too late to be useful. >> >> -Deepayan >> >> >> >>> >>> wireframe(z~x*y, pts=pts, aspect=1, scales=list(col=1, arrows=FALSE), >>> panel.3d.wireframe = function(x,y,z,xlim,ylim,zlim,xlim.scaled, >>> ylim.scaled,zlim.scaled,pts,...){ >>> panel.3dwire(x=x, y=y, z=z, xlim=xlim, ylim=ylim, zlim=zlim, >>> xlim.scaled=xlim.scaled, ylim.scaled=ylim.scaled, >>> zlim.scaled=zlim.scaled, ...) >>> panel.3dscatter(x=pts[,1], y=pts[,2], z=pts[,3], >>> xlim=xlim, ylim=ylim, zlim=zlim, >>> xlim.scaled=xlim.scaled, >>> ylim.scaled=ylim.scaled, >>> zlim.scaled=zlim.scaled, type="p", col=c(2,3), >>> cex=1.8, .scale=TRUE, ...) >>> }, key=list(x=0.5, y=0.95, points=list(col=c(2,3)), >>> text=list(c("Point 1", "Point 2")), >>> cex=1, align=TRUE, transparent=TRUE)) >>> >>> ______________________________________________ >>> R-help@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-help >>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >>> and provide commented, minimal, self-contained, reproducible code. >>> > ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.