找到解决办法了:
http://tolstoy.newcastle.edu.au/R/e10/help/10/05/3533.html
</p>
<p>rescale <- function(x, from, to)<br />
{</p>
<p> ans <- min(to) + abs(diff(to)) * (x - min(from)) / abs(diff(from))<br />
ans[ans > min(to) & ans < max(to)]<br />
}</p>
<p>panel.3dgrid <-</p>
<p> function(rot.mat, distance,</p>
<p> xlim, ylim, zlim,<br />
xlim.scaled, ylim.scaled, zlim.scaled,<br />
zero.scaled,<br />
...)</p>
<p>{<br />
xgrid <- rescale(pretty(xlim), xlim, xlim.scaled)<br />
ygrid <- rescale(pretty(ylim), ylim, ylim.scaled)<br />
zgrid <- rescale(pretty(zlim), zlim, zlim.scaled)<br />
## helper functions<br />
drawGridSegments <- function(xyz1, xyz2) {<br />
m1 <- ltransform3dto3d(t(xyz1), rot.mat, distance)<br />
m2 <- ltransform3dto3d(t(xyz2), rot.mat, distance)<br />
panel.segments(m1[1,], m1[2,], m2[1,], m2[2,], col = "grey")<br />
}<br />
drawBox <- function(xyz1, xyz2)<br />
{<br />
m1 <- ltransform3dto3d(t(xyz1), rot.mat, distance)<br />
m2 <- ltransform3dto3d(t(xyz2), rot.mat, distance)<br />
panel.segments(m1[1,], m1[2,], m2[1,], m2[2,], col = "black")<br />
}<br />
## xgrid * ygrid * min(z) (bottom)<br />
drawGridSegments(expand.grid(x = xgrid, y = ylim.scaled[1], z = zlim.scaled[1]),<br />
expand.grid(x = xgrid, y = ylim.scaled[2], z =<br />
zlim.scaled[1]))<br />
drawGridSegments(expand.grid(x = xlim.scaled[1], y = ygrid, z = zlim.scaled[1]),</p>
<p> expand.grid(x = xlim.scaled[2], y = ygrid, z =<br />
zlim.scaled[1]))<br />
## max(x) * ygrid * zgrid<br />
drawGridSegments(expand.grid(x = xlim.scaled[2], y = ygrid, z = zlim.scaled[1]),</p>
<p> expand.grid(x = xlim.scaled[2], y = ygrid, z =<br />
zlim.scaled[2]))<br />
drawGridSegments(expand.grid(x = xlim.scaled[2], y = ylim.scaled[1], z = zgrid),</p>
<p> expand.grid(x = xlim.scaled[2], y =<br />
ylim.scaled[2], z = zgrid))<br />
## xgrid * max(y) * zgrid<br />
drawGridSegments(expand.grid(x = xgrid, y = ylim.scaled[2], z = zlim.scaled[1]),</p>
<p> expand.grid(x = xgrid, y = ylim.scaled[2], z =<br />
zlim.scaled[2]))<br />
drawGridSegments(expand.grid(x = xlim.scaled[1], y = ylim.scaled[2], z = zgrid),</p>
<p> expand.grid(x = xlim.scaled[2], y =<br />
ylim.scaled[2], z = zgrid))<br />
## boxes around the faces<br />
drawBox(expand.grid(x = xlim.scaled[1], y = ylim.scaled, z = zlim.scaled[1]),</p>
<p> expand.grid(x = xlim.scaled[2], y = ylim.scaled, z = zlim.scaled[1]))</p>
<p> drawBox(expand.grid(x = xlim.scaled, y = ylim.scaled[1], z = zlim.scaled[1]),</p>
<p> expand.grid(x = xlim.scaled, y = ylim.scaled[2], z = zlim.scaled[1]))</p>
<p> drawBox(expand.grid(x = xlim.scaled[2], y = ylim.scaled, z = zlim.scaled[1]),</p>
<p> expand.grid(x = xlim.scaled[2], y = ylim.scaled, z = zlim.scaled[2]))</p>
<p> drawBox(expand.grid(x = xlim.scaled[2], y = ylim.scaled[1], z = zlim.scaled),</p>
<p> expand.grid(x = xlim.scaled[2], y = ylim.scaled[2], z = zlim.scaled))</p>
<p> drawBox(expand.grid(x = xlim.scaled[1], y = ylim.scaled[2], z = zlim.scaled),</p>
<p> expand.grid(x = xlim.scaled[2], y = ylim.scaled[2], z = zlim.scaled))</p>
<p> drawBox(expand.grid(x = xlim.scaled, y = ylim.scaled[2], z = zlim.scaled[1]),</p>
<p> expand.grid(x = xlim.scaled, y = ylim.scaled[2], z = zlim.scaled[2]))<br />
}</p>
<p>cloud(Sepal.Length ~ Petal.Length * Petal.Width,</p>
<p> data = iris, cex = .8,<br />
groups = Species,<br />
par.box = list(col = "transparent"),<br />
screen = list(z = 20, x = -70, y = 3),<br />
panel.3d.cloud = function(...) {<br />
panel.3dgrid(...)<br />
panel.3dscatter(...)<br />
},<br />
par.settings = list(axis.line = list(col = "transparent")),<br />
scales = list(arrows = FALSE, col = "black"))</p>
<p>wireframe(volcano, shade = TRUE,<br />
par.box = list(col = "transparent"),<br />
screen = list(z = 20, x = -70, y = 3),<br />
panel.3d.wireframe = function(...) {<br />
panel.3dgrid(...)<br />
panel.3dwire(...)<br />
},<br />
par.settings = list(axis.line = list(col = "transparent")),<br />
scales = list(arrows = FALSE, col = "black"))<br />
</p>
[attachment=212104,761]