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
- batymetria jako powierzchnia (
x
= długość geograficzna,y
= szerokość,z
= głębokość), a - 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
.
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. –