[R] lattice: wireframe "eats up" points; how to make points on wireframe visible?
Marius Hofert
m_hofert at web.de
Wed Mar 30 23:56:42 CEST 2011
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_hofert at 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 at 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.
>>
More information about the R-help
mailing list