2016-03-17 20 views
5

私は特定の海底構造の周りの鯨の分布のパターンを研究しています。単一の3Dプロットでの表面と散布図の混合

  1. 地形面としてx =経度、y =緯度、z =深さ)、及び
  2. 地理的位置:I同時に示すインタラクティブな3Dプロットを作成しようとしてい緯度グループx =経度、y =緯度、z =固定深度-30メートル)。

座標はUTM座標系で投影されます。

私は通常、図の作成にRパッケージとggplot2パッケージを使用しています。ここでは、plotlyパッケージが良い選択肢のように思えました。

バスメトリラスタbathy_rasとポイントpointsのdata.frameから始めました。

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

私は、同じグラフ/同じ軸上の私の2つのデータセットを結合する方法を見つけることができません。私は2つの方法を試しましたが、私が望む出力は得られませんでした。

1)プロットパッケージを使用してRstudioでプロットを作成する。 plotlyウェブサイトから完全にプロットを作成

#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アカウントを作成した(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 ... 

座標のすべての点を含むマトリックス中にラスタ「bathy_ras」に変換。私は、私のプロットアカウントに.txtファイルとして2つのデータフレームをインポートした:bathy_dfpoints

これは、プロットアカウントに2つのグリッドを作成します。私はこれらの2つのデータのための2つの別々の3Dプロットを簡単に書くことができます。フレームはサーフェスプロット(下図)と、散布図です。私はこのチュートリアル(http://help.plot.ly/update-a-graphs-data/)の後に新しいトレースとして表面プロットにscatterplotを含めることを試みましたが、 "into into"オプションはscatterplotが3Dの場合は使用できないように見えます。 surface plot produced from the plotly web interface

scatter3Dとサーフェスプロットをplotlyに組み合わせることはできますか?

NB:私はpoints()でcombinaisonでraster::perspを試みたが、私はplotlyおよび/またはggplot2でこれを行うことを好む理由である表面プロットの一般的な審美的にとても満足していません。

答えて

7

私はあなたがやっていることはうまくいくと信じています。私はそれがあなたのxとyの座標と関係があるかもしれないと思う。サーフェスプロットは、x軸に1:ncol(bathy_matrix)、y軸に1:row(bathy_matrix)を使用しています。

ポイントは、表面プロットに表示される範囲の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が、これは確かに非常に有用でした。私のポイントの座標は私のマトリックスの範囲にはないので、プロット上に現れなかったのです。私は自分の行列のサイズに合わせてこれらの座標を再スケールしなければなりませんでした(最初はUrange lat/longで、 'Xrange = [755100:838800]'、 'Yrange = [ - 2612000、-2525000] (bathy_matrix)] '、' Yrange = [1:nrow(bathy_matrix)])を使ってplot_lyを使い、それがうまくいきました。 –