Ich untersuche die Verteilungsmuster von Walen um bestimmte Meeresbodenstrukturen. Ich versuche, einen interaktiven 3D-Plot zeigt zugleich zu erstellen:Mischfläche und Streudiagramm in einem einzigen 3D-Plot
- bathymetry als Oberfläche (
x
= Längengrad,y
= Breitengrade,z
= Tiefe) und - geographische Lage von Walgruppen (
x
= Längengrad,y
= Breitengrad,z
= feste Tiefe -30 Meter zum Beispiel).
Koordinaten werden in einem UTM-Koordinatensystem projiziert.
Ich arbeite normalerweise mit R und dem ggplot2
Paket für die Herstellung von Zahlen. Hier schien das plotly
Paket eine gute Option zu sein.
Ich begann mit einem Bathymetrie-Raster bathy_ras
und einem Datenrahmen der Punkte points
.
> 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 nicht einen Weg finden, um meine zwei Datensätze in der gleichen Grafik/elbe Achse zu kombinieren. Ich habe zwei Methoden ausprobiert, aber keine gab mir die gewünschte Ausgabe.
1) Erstellen des Plots in Rstudio mit Plotly-Paket.
#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) die Handlung Erstellen vollständig von der plotly Website. zuerst konvertierte I die Raster "bathy_ras" in eine Matrix alle Punkte von Koordinaten (x, y) und den Tiefen z, enthaltend
#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 ...
I ein plotly Konto erstellt. Ich habe zwei Dataframes als .txt-Dateien in mein Plotly-Konto importiert: bathy_df
und points
.
Dadurch werden zwei Raster im Plotly-Konto erstellt. Ich kann leicht zwei separate 3D-Plots für diese beiden Datenfelder schreiben: eins ist ein Oberflächendiagramm (siehe unten), das andere ist ein Streudiagramm. Ich habe versucht, das Streudiagramm in das Oberflächendiagramm als eine neue Spur einzufügen, die diesem Tutorial folgt (http://help.plot.ly/update-a-graphs-data/), aber die Option "Einfügen in" scheint gerade nicht verfügbar, wenn das Streudiagramm in 3D ist. surface plot produced from the plotly web interface
Ist es möglich, scatter3D
und ein Oberflächendiagramm in plotly
zu kombinieren?
nb: Ich habe versucht raster::persp
in combinaison mit points()
aber ich bin nicht sehr zufrieden mit der allgemeinen Ästhetik der Oberfläche Grundstück, weshalb ich würde es vorziehen, dies zu tun mit plotly
und/oder ggplot2
.
Dank alistaire, dies war in der Tat sehr nützlich. Die Koordinaten meiner Punkte lagen nicht im Bereich meiner Matrix, weshalb sie nicht auf der Handlung auftauchen. Ich musste diese Koordinaten (zunächst in UTM lat/long, 'Xrange = [755100: 838800]', 'Yrange = [- 2612000, -2525000]') auf die Größe meiner Matrix skalieren ('Xrange = [1: ncol (bathy_matrix)] ',' Yrange = [1: nrow (bathy_matrix)] ') vor der Verwendung von plot_ly und dann hat es funktioniert. –