2016-03-17 16 views
5

Studiuję wzorce rozmieszczenia wielorybów wokół konkretnych struktur dna morskiego. Próbuję utworzyć interaktywny 3D wykres pokazując jednocześnie:Mieszanie powierzchni i wykresu rozproszenia w pojedynczej działce 3D

  1. batymetria jako powierzchnia (x = długość geograficzna, y = szerokość, z = głębokość), a
  2. położenie geograficzne grup wielorybów (x = długość geograficzna, y = szerokość geograficzna, z = stała głębokość -30 metrów na przykład).

Współrzędne są wyświetlane w układzie współrzędnych UTM.

Zazwyczaj pracuję z R i pakietem ggplot2 do produkcji figurek. Tutaj pakiet plotly wydawał się dobrym rozwiązaniem.

Zacząłem od rastra batymetrycznego bathy_ras i data.frame punktów 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 ... 

nie mogę znaleźć sposób na połączenie moich dwóch zestawów danych na tym samym wykresie/samej osi. Próbowałem dwóch metod, ale żadna nie dała mi tego, czego chciałem.

1) Tworzenie działki w Rstudio za pomocą pakietu spiskowego.

#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) Tworzenie fabuły całości z plotly stronie. Najpierw konwertowane rastrowe "bathy_ras" w matrycy zawierającej wszystkich punktów współrzędnych (x, y), a głębokości z

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

utworzonego konto plotly. Zaimportowałem dwie ramki danych jako pliki .txt na moim sprytnym koncie: bathy_df i points.

To tworzy dwie siatki w sprytnym rachunku. Mogę z łatwością napisać dwie oddzielne wykresy 3D dla tych dwóch danych.frame: jedna to wykres powierzchni (pokazany poniżej), drugi to wykres rozrzutu. Próbowałem włączyć wykres rozproszenia na wykresie powierzchni jako nowy ślad po tym samouczku (http://help.plot.ly/update-a-graphs-data/), ale opcja "wstaw do" wydaje się być niedostępna, jeśli wykres rozproszenia jest w 3D. surface plot produced from the plotly web interface

Czy można połączyć scatter3D i powierzchnię w plotly?

nb: Próbowałem raster::persp w combinaison z points() ale nie jestem bardzo zadowolony z ogólnego estetyką powierzchni działki, dlatego wolałbym to zrobić z plotly i/lub ggplot2.

Odpowiedz

7

Wierzę, że to, co robisz, powinno działać dobrze. Myślę, że może to mieć związek z twoimi współrzędnymi xiy.Na wykresie powierzchni użyto 1:ncol(bathy_matrix) jako osi X i 1:row(bathy_matrix) jako punktów osi y (zaznacza się, jeśli wolisz).

Twoje punkty będą musiały mieć współrzędne X i Y w tym zakresie, aby pojawiły się na wykresie powierzchni. Poniżej znajduje się prosty przykład.

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)) 

uzyskać to:

enter image description here

Nadzieja to pomaga ...

+1

Dzięki alistaire, to było rzeczywiście bardzo przydatne. Współrzędne moich punktów nie znajdowały się w zasięgu mojej matrycy, dlatego nie pojawiły się na działce. Musiałem zmienić skalę tych współrzędnych (początkowo w UTM lat/long, 'Xrange = [755100: 838800]', 'Yrange = [- 2612000, -2525000]') do rozmiaru mojej macierzy ('Xrange = [1: ncol (bathy_matrix)] ',' Yrange = [1: nrow (bathy_matrix)] ') przed użyciem plot_ly, a następnie zadziałało. –

Powiązane problemy