从数据绘制 3D 表面
Plotting a 3D surface from data
我已经编写了 C++ 代码来对 PDE 进行数值求解。我想绘制结果。我已将数据输出到 ascii 文件,作为 3 列数字。 x 坐标、y 坐标和 z 坐标。这可能看起来像
0.01 7 -3
-12 1.2 -0.24
...
我经常有超过 1000 个数据点。我想绘制一个曲面。我能够在 R 和 Octave 中加载数据。在 R scatterplot3D 中工作,在八度 plot3 中工作。但是,我希望生成一个曲面,而不是不同的点 (scatterplot3d) 或曲线 (plot3)。我正在努力让网格或冲浪从八度音程的数据中工作。我正在寻找一种使用八度、R、C++ 或任何其他程序在 3D space 中绘制表面的简单方法。
您可以将数据强制转换为正确的格式,以便使用基本 R 函数 persp
进行绘图。这需要一个包含唯一 x 值的向量、一个包含唯一 y 值的向量和一个包含 length(unique(x))
x length(unique(y))
矩阵的 z 值矩阵。
假设您的数据如下所示:
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 co-ordinates 没有很好地对齐,那么更通用的方法是:
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, 20)), levels(cut(df$x, 20)))),
as.numeric(factor(levels(cut(df$y, 20)), levels(cut(df$y, 20)))),
z, col = "gold", theta = 45, shade = 0.75, ltheta = 90, xlab = "x",
ylab = "y")
我已经编写了 C++ 代码来对 PDE 进行数值求解。我想绘制结果。我已将数据输出到 ascii 文件,作为 3 列数字。 x 坐标、y 坐标和 z 坐标。这可能看起来像
0.01 7 -3
-12 1.2 -0.24
...
我经常有超过 1000 个数据点。我想绘制一个曲面。我能够在 R 和 Octave 中加载数据。在 R scatterplot3D 中工作,在八度 plot3 中工作。但是,我希望生成一个曲面,而不是不同的点 (scatterplot3d) 或曲线 (plot3)。我正在努力让网格或冲浪从八度音程的数据中工作。我正在寻找一种使用八度、R、C++ 或任何其他程序在 3D space 中绘制表面的简单方法。
您可以将数据强制转换为正确的格式,以便使用基本 R 函数 persp
进行绘图。这需要一个包含唯一 x 值的向量、一个包含唯一 y 值的向量和一个包含 length(unique(x))
x length(unique(y))
矩阵的 z 值矩阵。
假设您的数据如下所示:
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 co-ordinates 没有很好地对齐,那么更通用的方法是:
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, 20)), levels(cut(df$x, 20)))),
as.numeric(factor(levels(cut(df$y, 20)), levels(cut(df$y, 20)))),
z, col = "gold", theta = 45, shade = 0.75, ltheta = 90, xlab = "x",
ylab = "y")