如何使用任意数据在 R 中绘制曲面图,即不是 x 和 y 的函数

Pra*_*hal 1 plot r

我正在尝试在带有网格 x 和 y 轴的数据的 R 中构建曲面图。x 轴从 1 到 8,而 y 轴从 -4 到 4。

以下是该图的数据:

   -4  -3  -2  -1   0   1   2  3   4
1 159 144 133 132 138 123  80 28 -22
2 153 135 121 122 160 162 110 50  -7
3 148 126 107 104 161 190 135 67   3
4 145 120  96  92 161 202 149 77   8
5 144 117  92  89 161 205 153 80  10
6 145 120  96  92 161 202 149 77   8
7 148 126 107 104 161 190 135 67   3
8 153 135 121 122 160 162 110 50  -7
9 159 144 133 132 138 123  80 28 -22
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。

jba*_*ums 5

无论是latticeExtra::wireframergl::persp3d可以绘制三维表面图。

z <- as.matrix(read.table(text='-4  -3  -2  -1   0   1   2  3   4
1 159 144 133 132 138 123  80 28 -22
2 153 135 121 122 160 162 110 50  -7
3 148 126 107 104 161 190 135 67   3
4 145 120  96  92 161 202 149 77   8
5 144 117  92  89 161 205 153 80  10
6 145 120  96  92 161 202 149 77   8
7 148 126 107 104 161 190 135 67   3
8 153 135 121 122 160 162 110 50  -7
9 159 144 133 132 138 123  80 28 -22', header=TRUE, check.names=FALSE))
Run Code Online (Sandbox Code Playgroud)

首先,与latticeExtra

library(latticeExtra)
wireframe(z, scales=list(arrows=FALSE), xlab='x', ylab='y', drape=TRUE,
          col.regions=terrain.colors(10), at=seq(min(z), max(z), len=11))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

有关?wireframe如何指定视角的详细信息,请参阅。

或者,persp3drgl包中可以生成可以用鼠标旋转/缩放的 3D 表面。

library(rgl)
persp3d(1:9, -4:4, z, col = "lightblue", xlab='x', ylab='y')
Run Code Online (Sandbox Code Playgroud)

您还可以考虑为此使用热图/级别图:

lattice::levelplot(z, col.regions=terrain.colors, xlab='x', ylab='y', 
          scales=list(tck=1:0))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


编辑

akima如果您想提高绘图的分辨率,您可以使用来插入您的数据。

例如:

library(akima)

xyz <- transform(expand.grid(x=as.numeric(rownames(z)), 
                             y=as.numeric(colnames(z))), z=c(z))

z_interp <- interp(xyz$x, xyz$y, xyz$z)

xyz_interp <- transform(expand.grid(x=z_interp$x, y=z_interp$y), z=c(z_interp$z))

wireframe(z ~ x * y, data=xyz_interp, scales=list(arrows=FALSE),
          drape=TRUE, col.regions=terrain.colors(10), 
          at=seq(min(xyz_interp$z), max(xyz_interp$z), len=11))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

使用参数xoyoto控制内插分辨率interp