R 单个3D图中的混合面和散射图

R 单个3D图中的混合面和散射图,r,gis,plotly,surface,R,Gis,Plotly,Surface,我正在研究鲸鱼在特定海底结构周围的分布模式。我正在尝试创建一个交互式3D绘图,同时显示: 作为表面的测深(x=经度,y=纬度,z=深度),以及 鲸鱼群的地理位置(x=经度,y=纬度,z=固定深度-例如30米) 坐标在UTM坐标系中投影 我通常使用R和ggplot2软件包生成图形。在这里,plotly包似乎是一个不错的选择 我从一个测深光栅和一个点的data.frame开始 > bathy_ras class : RasterLayer dimensions : 784, 8

我正在研究鲸鱼在特定海底结构周围的分布模式。我正在尝试创建一个交互式3D绘图,同时显示:

  • 作为表面的测深
    x
    =经度,
    y
    =纬度,
    z
    =深度),以及
  • 鲸鱼群的地理位置
    x
    =经度,
    y
    =纬度,
    z
    =固定深度-例如30米) 坐标在UTM坐标系中投影

    我通常使用R和
    ggplot2
    软件包生成图形。在这里,
    plotly
    包似乎是一个不错的选择

    我从一个测深光栅和一个点的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 ...
    
    我找不到将两个数据集合并到同一个图形/同一个轴上的方法。我尝试了两种方法,但没有一种能提供我想要的输出

    1) 使用plotly软件包在Rstudio中创建绘图

    #将光栅转换为测深值矩阵
    bathy_矩阵str(bathy_矩阵)
    数字[1:784,1:821]-362-365-367-369-371。。。
    #创建交互式绘图
    
    p我相信你所做的应该很好。我想这可能和你的x和y坐标有关。曲面图使用
    1:ncol(bathy_矩阵)
    作为x轴,使用
    1:row(bathy_矩阵)
    作为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))
    
    set.seed(123)
    x=样品(1:ncol(火山),尺寸=50)
    y=样品(1:nrow(火山),尺寸=50)
    z=c()
    
    对于(我在1:50中){z感谢alistaire,这确实非常有用。我的点的坐标不在我的矩阵范围内,这就是为什么它们没有显示在绘图上。我必须将这些坐标(最初以UTM lat/long,
    Xrange=[755100:838800]
    Yrange=[-261200,-2525000]
    )重新缩放到我矩阵的大小(
    Xrange=[1:ncol(bathy_矩阵)]
    Yrange=[1:nrow(bathy_矩阵)]
    )在使用plot_-ly之前,然后开始工作。
    #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 ...
    
    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))