Sto studiando i modelli di distribuzione delle balene attorno a specifiche strutture del fondale marino. Sto cercando di creare un interattivo grafico 3D mostrando allo stesso tempo:Superficie di miscelazione e diagramma a dispersione in un unico grafico 3D
- batimetria come superficie (
x
= longitudine,y
= latitudine,z
= profondità), e - posizione geografica di gruppi di balene (
x
= longitudine,y
= latitudine,z
= profondità fissa -30 metri per esempio).
Le coordinate sono proiettate in un sistema di coordinate UTM.
Di solito lavoro con R e il pacchetto ggplot2
per la produzione di cifre. Qui, il pacchetto plotly
sembrava una buona opzione.
Ho iniziato con una batimetria raster bathy_ras
e un data.frame di punti 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 ...
non riesco a trovare un modo per combinare i miei due insiemi di dati sullo stesso grafico/stesso asse. Ho provato due metodi ma nessuno mi ha dato l'output che volevo.
1) Creazione del grafico in Rstudio utilizzando il pacchetto di stampa.
#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) Creare la trama del tutto dal sito plotly. Prima ho convertito i raster "bathy_ras" in una matrice contenente tutti i punti di coordinate (x, y) e la profondità 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 ...
ho creato un account plotly. Ho importato due dataframes come file .txt nel mio account plot: bathy_df
e points
.
Ciò crea due griglie nell'account di trama. Posso facilmente scrivere due grafici 3D separati per questi due data.frames: uno è un grafico di superficie (mostrato sotto), l'altro è un grafico a dispersione. Ho cercato di includere lo scatterplot nel grafico di superficie come nuova traccia seguendo questo tutorial (http://help.plot.ly/update-a-graphs-data/) ma l'opzione "insert into" sembra non essere disponibile se lo scatterplot è in 3D. surface plot produced from the plotly web interface
E 'possibile combinare un scatter3D
e un complotto di superficie in plotly
?
nb: ho provato raster::persp
in combinaison con points()
ma io non sono molto soddisfatto per l'estetica generale della trama superficiale, che è il motivo per cui preferirei farlo con plotly
e/o ggplot2
.
Grazie Alistaire, questo è stato davvero molto utile. Le coordinate dei miei punti non erano nella gamma della mia matrice, motivo per cui non si sono mostrati sulla trama. Ho dovuto ridimensionare queste coordinate (inizialmente in UTM lat/long, 'Xrange = [755100: 838800]', 'Yrange = [- 2612000, -2525000]') alla dimensione della mia matrice ('Xrange = [1: ncol (bathy_matrix)] ',' Yrange = [1: nrow (bathy_matrix)] ') prima di usare plot_ly e poi ha funzionato. –