在单个3D图中混合曲面和散点图

S.D*_*lle 7 gis r surface plotly

我正在研究特定海底结构周围鲸鱼分布的模式.我正在尝试创建一个同时显示的交互式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 ...
Run Code Online (Sandbox Code Playgroud)

我找不到将两个数据集组合在同一图表/同一轴上的方法.我尝试了两种方法,但都没有给我我想要的输出.

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)
Run Code Online (Sandbox Code Playgroud)

2)完全从绘图网站创建情节.首先,我将光栅"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 ...
Run Code Online (Sandbox Code Playgroud)

我创建了一个阴谋帐户.我在我的情节帐户中导入了两个数据帧作为.txt文件:bathy_dfpoints.

这会在图表帐户中创建两个网格.我可以轻松地为这两个data.frames写两个单独的3D图:一个是曲面图(如下所示),另一个是散点图.我试图在本教程(http://help.plot.ly/update-a-graphs-data/)之后将散点图作为新曲线包含在曲面图中,但如果散点图,"插入到"选项似乎不可用是3D. 从绘图网络界面产生的表面图

是否可以将a scatter3D和曲面图组合在一起plotly

nb:我尝试raster::persp过组合,points()但是我对表面图的一般美学不太满意,这就是为什么我更喜欢用plotly和/或ggplot2.

roy*_*yr2 12

我相信你在做什么应该工作得很好.我认为这可能与您的x和y坐标有关.曲面图1:ncol(bathy_matrix)用作x轴和1:row(bathy_matrix)y轴点(如果你愿意,则用于勾选).

您的需要在该范围内具有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))
Run Code Online (Sandbox Code Playgroud)

我明白了:

在此输入图像描述

希望这可以帮助...