Tôi đang nghiên cứu các mô hình phân bố cá voi xung quanh các cấu trúc đáy biển cụ thể. Tôi cố gắng để tạo ra một cốt truyện 3D tương tác thể hiện cùng một lúc:Trộn bề mặt và phân tán trong một ô 3D đơn
- độ sâu như một bề mặt (
x
= kinh độ,y
= vĩ độ,z
= chiều sâu), và - vị trí địa lý của các nhóm cá voi (
x
= kinh độ,y
= vĩ độ,z
= độ sâu cố định -30 mét chẳng hạn).
Tọa độ được chiếu trong hệ tọa độ UTM.
Tôi thường làm việc với R và gói ggplot2
để tạo số liệu. Ở đây, gói plotly
có vẻ như là một lựa chọn tốt.
Tôi bắt đầu với độ rộng của kính bathy_ras
và một data.frame của các điểm 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 ...
tôi không thể tìm thấy một cách để kết hợp hai bộ dữ liệu của tôi trên đồ thị cùng/cùng trục. Tôi đã thử hai phương pháp nhưng không có phương pháp nào cho tôi kết quả mong muốn.
1) Tạo cốt truyện trong Rstudio bằng cách sử dụng gói gọn.
#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) Tạo cốt truyện hoàn toàn từ trang web plotly. Trước tiên tôi chuyển đổi raster "bathy_ras" vào một ma trận có chứa tất cả các điểm tọa độ (x, y) và chiều sâu 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 ...
tôi đã tạo một tài khoản plotly. Tôi đã nhập hai dataframes dưới dạng tệp .txt trong tài khoản gọn gàng của mình: bathy_df
và points
.
Điều này tạo hai lưới trong tài khoản gọn gàng. Tôi có thể dễ dàng viết hai ô 3D riêng biệt cho hai data.frames: một là một âm mưu bề mặt (được hiển thị bên dưới), một là một scatterplot. Tôi đã cố gắng để bao gồm các scatterplot trong cốt truyện bề mặt như một dấu vết mới theo hướng dẫn này (http://help.plot.ly/update-a-graphs-data/) nhưng "chèn vào" tùy chọn dường như không có sẵn nếu scatterplot là trong 3D. surface plot produced from the plotly web interface
Có thể kết hợp scatter3D
và ô bề mặt trong plotly
không?
nb: Tôi cố gắng raster::persp
trong combinaison với points()
nhưng tôi không phải là rất hài lòng bởi tính thẩm mỹ chung của cốt truyện bề mặt, đó là lý do tôi muốn làm điều này với plotly
và/hoặc ggplot2
.
Cảm ơn alistaire, điều này rất hữu ích thực sự. Các tọa độ của các điểm của tôi không nằm trong phạm vi ma trận của tôi, đó là lý do tại sao chúng không xuất hiện trên cốt truyện. Tôi đã phải rescale các tọa độ (ban đầu trong UTM lat/long, 'Xrange = [755100: 838800]', 'Yrange = [- 2612000, -2525000]') với kích thước của ma trận của tôi ('Xrange = [1: ncol (bathy_matrix)] ',' Yrange = [1: nrow (bathy_matrix)] ') trước khi sử dụng plot_ly và sau đó nó hoạt động. –