r - 如何在 persp 中只有其他边界

标签 r plot 3d

我想做以下事情

set.seed(1)
x <- seq(-10, 10, length= 600)
y <- x
f <- function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }
z <- outer(x, y, f)
persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue")

但是网格太薄,所以边框占主导地位(您可以使用 border = NA 确认它确实是边框而不是照明。它变成蓝色):

enter image description here

解决这个问题的一种方法当然是使用不太精细的网格(例如,如果您将 length = 600 更改为 length= 50,它看起来非常令人愉快,实际上是 ?persp 中的示例)。但我想要与这个精细网格完全相同的形状和平滑度。我只是不想绘制所有的边框,例如可能只有它们的 1/5(或者我认为我可以自定义的一半)。

最佳答案

绘制平滑形状然后在其顶部绘制网格的一个问题是,您可以通过形状看到另一侧的网格。为了解决这个问题,您可以首先在白色对象的顶部绘制类(class)网格,这意味着您看不到网格的背面,将结果保存到文件中。

x <- seq(-10, 10, length=50)
y <- x
z <- outer(x, y, f)
png("top.png")
print(persp(x, y, z, theta = 30, phi = 30, expand = 0.5, border="black", col="white"))
dev.off()

enter image description here

然后,您可以绘制平滑的图像,然后是所有白色完全透明的网格。
x <- seq(-10, 10, length= 600)
y <- x
f <- function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }
z <- outer(x, y, f)
png("bottom.png")
print(persp(x, y, z, theta = 30, phi = 30, expand = 0.5, border="lightblue", col="lightblue"))
dev.off()

par(oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0))
library(png)
top.img <- readPNG("top.png")
top.img[,,4][top.img[,,1] + top.img[,,2] + top.img[,,3] > 2] <- 0

plot.new()
rasterImage(bottom.img, 0, 0, 1, 1)
rasterImage(top.img, 0, 0, 1, 1)

enter image description here

关于r - 如何在 persp 中只有其他边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24918604/

相关文章:

math - 将 XYZ 转换为 XY(世界坐标到屏幕坐标)

r - 如何将我的图例组织成子组?

python - 从包含 matplotlib 绘图的 cmd 运行 py 文件

javascript - 如何在 Three.js 中从 OBJ 模型正确渲染四线框?

r - 在 R 中的图像顶部绘制点

python - 如何绘制烛台

python - 如何在 python 中加载 *.obj 文件并对其应用纹理

将(相关)矩阵对角线中的值替换为零,但保留矩阵中所有其他 1 值

r - 渲染 Hugo/blogdown 站点时出现问题

r - 为什么我的列名称更改在 R 中不起作用?