我正在尝试在具有网格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
任何帮助将不胜感激。
无论是latticeExtra::wireframe
或rgl::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))
首先,使用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))
有关?wireframe
如何指定视角的详细信息,请参见。
或者,可以persp3d
从rgl
包装中生成可以用鼠标旋转/缩放的3D表面。
library(rgl)
persp3d(1:9, -4:4, z, col = "lightblue", xlab='x', ylab='y')
您也可以为此考虑热图/水平图:
lattice::levelplot(z, col.regions=terrain.colors, xlab='x', ylab='y',
scales=list(tck=1:0))
编辑
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))
控制与参数的插值分辨率xo
,并yo
给interp
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句