根据数据绘制3D曲面

问题描述

我已经编写了C ++代码以数字方式求解PDE。我想绘制结果。我已将数据输出为3列数字的ascii文件。 x坐标,y坐标和z坐标。看起来像

0.01 7 -3
-12 1.2 -0.24
...

我经常有超过1000个数据点。我想绘制一个表面。我能够同时以R和八度加载数据。在R中,scatterplot3D有效,而在八度中,plot3有效。但是,我希望生成一个曲面,而不是不同的点(scatterplot3d)或曲线(plot3)。我正在努力从倍频程的数据中获取网格或冲浪。我正在寻找一种使用八度,R,C ++或任何其他程序在3D空间中绘制表面的简单方法

解决方法

您可以使用基本的R函数persp将数据强制转换为正确的格式以进行绘图。这需要一个唯一的x值向量,一个唯一的y值向量和z值矩阵,该矩阵是length(unique(x)) x length(unique(y))矩阵。

假设您的数据如下所示:

x    <- y <- seq(-pi,pi,length = 20)
df   <- expand.grid(x = x,y = y)
df$z <- cos(df$x) + sin(df$y)

head(df)
#>           x         y           z
#> 1 -3.141593 -3.141593 -1.00000000
#> 2 -2.810899 -3.141593 -0.94581724
#> 3 -2.480205 -3.141593 -0.78914051
#> 4 -2.149511 -3.141593 -0.54694816
#> 5 -1.818817 -3.141593 -0.24548549
#> 6 -1.488123 -3.141593  0.08257935

然后您可以创建一个像这样的矩阵:

z <- tapply(df$z,list(df$x,df$y),mean)

所以你的情节看起来像这样:

persp(unique(df$x),unique(df$y),z,col = "gold",theta = 45,shade = 0.75,ltheta = 90)

如果您的x和y坐标没有很好地对齐,那么更通用的方法是:

z <- tapply(df$z,list(cut(df$x,20),cut(df$y,20)),mean,na.rm = TRUE)

persp(as.numeric(factor(levels(cut(df$x,levels(cut(df$x,20)))),as.numeric(factor(levels(cut(df$y,levels(cut(df$y,ltheta = 90,xlab = "x",ylab = "y")