user2443444 user2443444 - 11 days ago 4
R Question

Match gridlines to axis ticks in 3D regression plot (persp and rockchalk)

I am trying to match my gridlines to my axis ticks in this plot so the numbers are uniform across the axis and easy to read between. Does anyone have any idea how to do this? As i am using two different packages (persp and rockchalk) at the same time i'm finding it quite difficult to find code that definitely works.

Sample Coral.cover Coral.richness Water.Temp fish.rich
r.2002.c.1 59 5 23.90 57
r.2002.c.2 71 9 33.43 70
r.2002.c.3 55 10 23.33 55
r.2002.c.4 58 10 22.14 56
r.2002.c.5 62 8 26.82 61
r.2002.c.6 65 10 29.07 64
r.2002.s.1 86 10 38.76 84
r.2002.s.2 71 10 30.28 68
r.2002.s.3 91 6 27.85 89
r.2002.s.4 63 0 28.03 62
r.2002.s.5 75 2 31.67 75
r.2002.s.6 63 2 29.43 63

require(Hmisc)
require(car)
require(vegan)
require(rockchalk)
require(reshape)
require(persp)

mod3 <- mcGraph3(Coral.cover, Coral.richness, fish.rich,
interaction = F,
theta = -40 ,
phi =20,
x1lab = "",
x2lab = "",
ylab = "",
x1lim = c(46,100),
ylim = c(-2.5, 12.5),
zlim =c(40, 100),
r=10,
col = 'white',
border = 'black',
box = T,
axes = T,
ticktype = "detailed",
ntick = 4)


Here is what i currently have (ignoring the labels which are photoshopped):

3D Regression Plot with unaligned axis and ticks

Any help is appreciated.

Thanks

data

df <- structure(list(Sample = structure(1:12, .Label = c("r.2002.c.1",
"r.2002.c.2", "r.2002.c.3", "r.2002.c.4", "r.2002.c.5", "r.2002.c.6",
"r.2002.s.1", "r.2002.s.2", "r.2002.s.3", "r.2002.s.4", "r.2002.s.5",
"r.2002.s.6"), class = "factor"), Coral.cover = c(59L, 71L, 55L,
58L, 62L, 65L, 86L, 71L, 91L, 63L, 75L, 63L), Coral.richness = c(5L,
9L, 10L, 10L, 8L, 10L, 10L, 10L, 6L, 0L, 2L, 2L), Water.Temp = c(23.9,
33.43, 23.33, 22.14, 26.82, 29.07, 38.76, 30.28, 27.85, 28.03,
31.67, 29.43), fish.rich = c(57L, 70L, 55L, 56L, 61L, 64L, 84L,
68L, 89L, 62L, 75L, 63L)), .Names = c("Sample", "Coral.cover",
"Coral.richness", "Water.Temp", "fish.rich"), class = "data.frame", row.names = c(NA,
-12L))

Coral.cover <- df[,2]
Coral.richness <- df[,3]
fish.rich <- df[,5]

Answer

I think it would be good idea to draw the graph without rockchalk package and manually add something. I used plot3D package (it provides extended functions of persp).

 ## preparation of some values for mesh of fitted value
fit <- lm(fish.rich ~ Coral.cover + Coral.richness)  # model
x.p <- seq(46, 100, length = 20)                     # x-grid of mesh
y.p <- seq(-2.5, 12.5, length = 20)                  # y-grid of mesh
z.p <- matrix(predict(fit, expand.grid(Coral.cover = x.p, Coral.richness = y.p)), 20) # prediction from xy-grid

library(plot3D)
  # box, grid, bottom points, and so on
scatter3D(Coral.cover, Coral.richness, rep(40, 12), colvar = NA, bty = "b2", 
          xlim = c(46,100), ylim = c(-2.5, 12.5), zlim = c(40,100), theta = -40, phi = 20, 
          r = 10, ticktype = "detailed", pch = 19, col = "gray", nticks = 4)
  # mesh, real points
scatter3D(Coral.cover, Coral.richness, fish.rich, add = T, colvar = NA, col = "blue",
          surf = list(x = x.p, y = y.p, z = z.p, facets = NA, col = "gray80"))
  # arrow from prediction to observation
arrows3D(x0 = Coral.cover, y0 = Coral.richness, z0 = fit$fitted.values, z1 = fish.rich, 
         type = "simple", lty = 2, add = T, col = "red")


 ### [bonus] persp() version
pmat <- persp(x.p, y.p, z.p, xlim = c(46,100), ylim = c(-2.5, 12.5), zlim = c(40,100), theta = -40, phi = 20, 
              r = 10, ticktype = "detailed", pch = 19, col = NA, border = "gray", nticks = 4)
for (ix in seq(50, 100, 10)) lines (trans3d(x = ix, y = c(-2.5, 12.5), z= 40, pmat = pmat), col = "black") 
for (iy in seq(0, 10, 5)) lines (trans3d(x = c(46, 100), y = iy, z= 40, pmat = pmat), col = "black")

points(trans3d(Coral.cover, Coral.richness, rep(40, 12), pmat = pmat), col = "gray", pch = 19)
points(trans3d(Coral.cover, Coral.richness, fish.rich, pmat = pmat), col = "blue")

xy0 <- trans3d(Coral.cover, Coral.richness, fit$fitted.values, pmat = pmat)
xy1 <- trans3d(Coral.cover, Coral.richness, fish.rich, pmat = pmat)
arrows(xy0[[1]], xy0[[2]], xy1[[1]], xy1[[2]], col = "red", lty = 2, length = 0.1)

enter image description here

Comments