2016-03-17 75 views
5

我學習圍繞具體的海底結構鯨的分佈格局。我試圖創建一個交互式3D圖表示在同一時間:混合面和散點圖在一個單一的3D繪圖

  1. 水深作爲表面x =經度,y =緯度,z =深度),和
  2. 地理位置鯨組x =經度,y =緯度,z =固定深度-30米例如)。

座標投影在UTM座標系。

我通常與R和ggplot2包用於產生數字工作。在這裏,plotly包似乎是一個不錯的選擇。

我從水深柵格bathy_ras開始,點數據框爲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 ... 

我不能找到一種方法,我的兩個數據集結合在同一張圖/同一軸線上。我嘗試了兩種方法,但沒有給我想要的輸出。

1)創建使用plotly包在Rstudio劇情。

#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)完全從plotly網站創建的情節。 首先我轉換光柵「bathy_ras」到含有座標的所有點的矩陣(X,Y)和深度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 ... 

我創建了一個plotly帳戶。我在我的密謀帳戶中導入了兩個數據框作爲.txt文件:bathy_dfpoints

這會在plotly帳戶兩個網格。我可以輕鬆地爲這兩個數據框架編寫兩個單獨的3D圖:一個是曲面圖(如下所示),另一個是散點圖。我嘗試將散點圖包含在曲面圖中作爲本教程後面的新軌跡(http://help.plot.ly/update-a-graphs-data/),但如果散點圖是3D的,則「插入」選項似乎不可用。 surface plot produced from the plotly web interface

是否有可能一個scatter3Dplotly表面情節結合起來?

注:我在combinaison試圖raster::persppoints()但我不會因表面的情節,這就是爲什麼我寧願用plotly和/或ggplot2做到這一點的一般審美非常滿意。

回答

7

我相信你在做什麼應該可以正常工作。我認爲這可能與你的x和y座標有關。曲線圖使用1:ncol(bathy_matrix)作爲x軸,而1:row(bathy_matrix)作爲y軸指向(如果您願意,請使用tick)。

將必須在這個範圍內的X和Y座標,爲他們在曲面圖顯示出來。下面是一個簡單的例子。

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

我得到這個:

enter image description here

希望這有助於...

+1

謝謝alistaire,這確實很有用。我的點的座標不在我矩陣的範圍內,這就是爲什麼他們沒有出現在劇情上。我必須將這些座標重新調整到我的矩陣('Xrange = [1:ncol)'的大小(最初UTM lat/long,'Xrange = [755100:838800]','Yrange = [ - 2612000,-2525000]') (bathy_matrix)]','Yrange = [1:nrow(bathy_matrix)]'),然後使用plot_ly然後它就起作用了。 –