user2443444 - 8 months ago 37

R Question

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):

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 Source

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)
```