2016-03-17 28 views
5

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

  1. độ sâu như một bề mặt (x = kinh độ, y = vĩ độ, z = chiều sâu), và
  2. 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_dfpoints.

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

Trả lời

7

Tôi tin rằng những gì bạn đang làm sẽ hoạt động tốt. Tôi nghĩ rằng nó có thể phải làm với các tọa độ x và y của bạn.Mảng bề mặt đang sử dụng 1:ncol(bathy_matrix) làm trục x và 1:row(bathy_matrix) làm trục y điểm (nếu bạn muốn).

điểm của bạn sẽ cần có toạ độ x và y trong phạm vi đó để chúng hiển thị trong ô bề mặt. Dưới đây là một ví dụ đơn giản.

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

tôi có được điều này:

enter image description here

Hope this helps ...

+1

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

Các vấn đề liên quan