HOWTO · R
So erstellen Sie ein 3D-Oberflächendiagramm aus (x,y,z)-Koordinaten
Erstellen Sie ein 3D-Oberflächendiagramm in R aus verstreuten (x, y, z)-Beobachtungen, indem Sie ein Gitter mit akima interpolieren und es mit rgl zeichnen.
Auf dieser Seite
Um ein 3D-Oberflächendiagramm in R aus verstreuten (x, y, z)-Beobachtungen zu erstellen, schätzen Sie z-Werte auf einem Gitter mit akima::interp() und zeichnen Sie dieses Gitter dann mit rgl::persp3d(). Fügen Sie die ursprünglichen Beobachtungen mit rgl::points3d() hinzu, um die Messungen mit der geschätzten Oberfläche zu vergleichen. Die Interpolation liefert Schätzungen zwischen den Beobachtungen; sie garantiert nicht, dass die geschätzte Oberfläche mit einer unbekannten zugrunde liegenden Funktion übereinstimmt.
Z-Werte mit akima::interp() interpolieren
Ein Oberflächen-Renderer benötigt z-Werte, die einem Gitter aus x- und y-Koordinaten zugeordnet sind. Verstreute Beobachtungen bilden dieses Gitter normalerweise nicht, daher schätzt die Interpolation Werte an Gitterpositionen aus den gemessenen x-, y- und z-Daten. Halten Sie die drei Eingabevektoren aufeinander abgestimmt: Werte am selben Index müssen dieselbe Beobachtung beschreiben. Zum Beispiel sind x[i], y[i] und z[i] ein gemessener Punkt.
Die Funktion akima::interp() akzeptiert diese Koordinatenvektoren und gibt x- und y-Gitterkoordinaten zusammen mit einer Matrix interpolierter z-Werte zurück. Diese Struktur ist nützlich für das Zeichnen, weil die Matrixeinträge Positionen über das zurückgegebene Koordinatengitter hinweg entsprechen. Die Schätzungen hängen von den Messungen und der Interpolationsmethode ab; sie sind keine zusätzlichen Beobachtungen. Prüfen Sie die zurückgegebenen Koordinaten und die Matrix, wenn Sie das Beispiel an Ihre Daten anpassen, besonders wenn Ihre Beobachtungen spärlich oder ungleichmäßig verteilt sind.
Installieren Sie die benötigten Pakete einmal mit install.packages(c("akima", "rgl")). Laden Sie sie in der R-Sitzung mit library(akima) und library(rgl), oder rufen Sie ihre Funktionen mit den unten gezeigten Paketpräfixen auf. Die Interpolations- und Rendering-Funktionen sind im Beispiel auch mit expliziten Paketpräfixen geschrieben, um ihre Herkunft klar zu machen.
Die Oberfläche mit rgl::persp3d() zeichnen
Übergeben Sie die x-Koordinaten, y-Koordinaten und die z-Matrix des Interpolationsergebnisses an rgl::persp3d(). Dies zeichnet das geschätzte Gitter als Oberfläche. Übergeben Sie dann die ursprünglichen x-, y- und z-Vektoren an rgl::points3d(), um die gemessenen Punkte darüberzulegen. Beide Ebenen sichtbar zu halten hilft, beobachtete Daten von Werten zu unterscheiden, die zwischen Beobachtungen geschätzt wurden.
Die rgl-Ansicht ist in einer geeigneten Grafikumgebung interaktiv: Drehen Sie sie, um die Form aus einem anderen Winkel zu betrachten, und zoomen Sie, um Details zu untersuchen. Wie die Ansicht erscheint, hängt von der R-Sitzung und der Grafikumgebung ab. In einem nicht-interaktiven Kontext öffnet sich die Anzeige möglicherweise nicht als Desktop-Fenster; verwenden Sie eine Umgebung, die rgl unterstützt, wenn Sie die Ansicht manipulieren müssen.
Vollständiges Beispiel: Eine 3D-Oberfläche interpolieren und zeichnen
Installieren Sie akima und rgl einmal mit install.packages(c("akima", "rgl")). Wenn beide Pakete verfügbar sind, ist der Paket-Workflow surface <- akima::interp(x, y, z, nx = 3, ny = 3), gefolgt von rgl::persp3d(surface$x, surface$y, surface$z) und rgl::points3d(x, y, z). Das ausführbare Beispiel unten verwendet einen vollständigen 3-mal-3-Satz von Beispielbeobachtungen, sodass Base R dasselbe Gitter auch zeichnen kann, wenn eines der optionalen Zeichenpakete nicht verfügbar ist. Verwenden Sie für verstreute Messungen den obigen Aufruf akima::interp(), um Gitterwerte vor dem Zeichnen zu schätzen.
x <- c(0, 1, 2, 0, 1, 2, 0, 1, 2)
y <- c(0, 0, 0, 1, 1, 1, 2, 2, 2)
z <- c(0, 1, 0, 1, 2, 1, 0, 1, 0)
if (requireNamespace("akima", quietly = TRUE)) {
surface <- akima::interp(x = x, y = y, z = z, nx = 3, ny = 3)
z_grid <- surface$z
x_grid <- surface$x
y_grid <- surface$y
} else {
z_grid <- matrix(z, nrow = 3, byrow = TRUE)
x_grid <- y_grid <- 0:2
}
if (requireNamespace("rgl", quietly = TRUE)) {
rgl::persp3d(x = x_grid, y = y_grid, z = z_grid, col = "lightblue")
rgl::points3d(x = x, y = y, z = z, col = "red", size = 6)
} else {
persp(x = x_grid, y = y_grid, z = z_grid, col = "lightblue")
}
cat("Grid dimensions:", nrow(z_grid), "x", ncol(z_grid), "\n")
Die Beispielvektoren beschreiben neun Beobachtungen auf einem regelmäßigen Gitter. Wenn akima installiert ist, erhält das Skript sein Gitter von akima::interp(); andernfalls verwendet es die mitgelieferten Werte des regelmäßigen Gitters direkt. Es verwendet rgl::persp3d() und rgl::points3d(), wenn rgl installiert ist, mit Base R persp() als Zeichen-Fallback. Die Kommandozeilenausgabe ist:
Grid dimensions: 3 x 3
Installieren Sie für verstreute Messungen beide Pakete und verwenden Sie die oben beschriebenen akima- und rgl-Aufrufe. Die angezeigten Gitterwerte sind Schätzungen, die aus den Eingabedaten abgeleitet wurden, während die überlagerten Punkte die ursprünglichen Beobachtungen bleiben. Die interaktive Ansicht hängt von der R-Sitzung und der Grafikumgebung ab; verwenden Sie eine grafikfähige Sitzung, wenn Sie sie drehen oder zoomen müssen. Halten Sie die x-, y- und z-Einträge aufeinander abgestimmt, wenn Sie die Beispielvektoren ersetzen.