Mischen von Oberfläche und Streudiagramm in einem einzigen 3D-Diagramm
Ich untersuche die Verteilungsmuster von Walen um bestimmte Meeresbodenstrukturen. Ich versuche ein @ zu erstellinteraktives 3D-Diagramm gleichzeitig anzeigen:
Bathymetrie als Oberfläche (x
= Länge,y
= Breite,z
= Tiefe) undgeographische Position der Walgruppen (x
= Länge,y
= Breite,z
= feste Tiefe -30 Meter zum Beispiel).Koordinaten werden in ein UTM-Koordinatensystem projiziert.
Ich arbeite normalerweise mit R und demggplot2
paket zur herstellung von figuren. Hier dieplotly
Paket schien eine gute Option.
Ich habe mit einem Bathymetrie-Raster begonnenbathy_ras
und ein data.frame von Punktenpoints
.
> bathy_ras
class : RasterLayer
dimensions : 784, 821, 643664 (nrow, ncol, ncell)
resolution : 102, 111 (x, y)
extent : 755070, 838812, -2612148, -2525124 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=58S +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
data source : in memory
names : bathymetry
values : -1949.42, -34.27859 (min, max)
> str(points)
'data.frame': 214 obs. of 3 variables:
$ x: num 774264 777293 775476 773430 773284 ...
$ y: num -2534165 -2533556 -2531012 -2532904 -2533695 ...
$ z: num -30 -30 -30 -30 -30 -30 -30 -30 -30 -30 ...
Ich kann keine Möglichkeit finden, meine beiden Datensätze auf demselben Diagramm / derselben Achse zu kombinieren. Ich habe zwei Methoden ausprobiert, aber keine hat mir die gewünschte Ausgabe geliefert.
1)Erstellen des Plots in Rstudio mithilfe des Plot-Pakets.
#convert raster into a matrix of bathymetry values
bathy_matrix <- as.matrix(bathy_ras)
> str(bathy_matrix)
num [1:784, 1:821] -362 -365 -367 -369 -371 ...
#create interactive plot
p <- plot_ly(z=bathy_matrix, type="surface",showscale=FALSE)
#this works fine, it get a 3D interactive surface plot of the seabed
#but if I try to add the "points" layer it doesn't show on the plot
p <- plot_ly(z=bathy_matrix, type="surface",showscale=FALSE) %>%
add_trace(x = gp_seamounts_df$utmx, y = gp_seamounts_df$utmy, z = gp_seamounts_df$z, type = "scatter3d", mode = "markers", showscale=FALSE, opacity=0.98)
2)Erstellung des Grundstücks vollständig von der Grundstückswebsite. Zuerst habe ich das Raster "bathy_ras" in eine Matrix umgewandelt, die alle Koordinatenpunkte (x, y) und die Tiefe z @ enthäl
#convert raster into a dataframe
bathy_df <- as.data.frame(coordinates(bathy_ras))
bathy_df$z <- values(bathy_ras)
> str(bathy_df)
'data.frame': 643664 obs. of 3 variables:
$ x: num 755121 755223 755325 755427 755529 ...
$ y: num -2525179 -2525179 -2525179 -2525179 -2525179 ...
$ z: num -362 -361 -360 -359 -358 ...
Ich habe ein Plotly-Konto erstellt. Ich habe zwei Datenrahmen als TXT-Dateien in mein Plot-Konto importiert:bathy_df
undpoints
.
Dadurch werden zwei Raster im Plotkonto erstellt. Ich kann leicht zwei separate 3D-Diagramme für diese beiden data.frames schreiben: Eines ist ein Oberflächendiagramm (siehe unten), das andere ist ein Streudiagramm. Ich habe versucht, das Streudiagramm im Anschluss an dieses Tutorial als neue Kurve in das Oberflächendiagramm aufzunehmen http: //help.plot.ly/update-a-graphs-data), aber die Option "Einfügen in" scheint nur dann nicht verfügbar zu sein, wenn das Streudiagramm in 3D vorliegt.Surface-Plot, der über die grafische Weboberfläche erstellt wurde
Ist es möglich ein @ zu kombinierscatter3D
und ein Flächendiagramm inplotly
?
nb: Ich habe versucht,raster::persp
in Kombination mitpoints()
aber ich bin nicht sehr zufrieden mit der allgemeinen Ästhetik des Oberflächenplots, weshalb ich es vorziehen würde, dies mit @ zu tplotly
und / oderggplot2
.