2016-03-17 5 views
5

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

  1. bathymetry als Oberfläche (x = Längengrad, y = Breitengrade, z = Tiefe) und
  2. 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.

Antwort

7

Ich glaube, was Sie tun, sollte gut funktionieren. Ich denke, es könnte mit Ihren x- und y-Koordinaten zu tun haben.Das Flächendiagramm verwendet 1:ncol(bathy_matrix) als x-Achse und 1:row(bathy_matrix) als y-Achse Punkte (Ticks, wenn Sie so wollen).

Ihre Punkte müssen X- und Y-Koordinaten in diesem Bereich haben, damit sie im Oberflächendiagramm angezeigt werden. Unten ist ein einfaches Beispiel.

set.seed(123) 

x = sample(1:ncol(volcano), size = 50) 
y = sample(1:nrow(volcano), size = 50) 

z = c() 

for(i in 1:50) {z <- c(z, volcano[y[i], x[i]])} 

df <- data.frame(x, y, z) 

plot_ly(z = volcano, type = "surface") %>% 
    add_trace(data = df, x = x, y = y, z = z, mode = "markers", type = "scatter3d", 
      marker = list(size = 5, color = "red", symbol = 104)) 

ich dieses:

enter image description here

Hope this helps ...

+1

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. –

Verwandte Themen