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

时间:2016-03-17 00:37:22

标签: r gis plotly surface

我正在研究特定海底结构周围鲸鱼分布的模式。我正在尝试同时创建交互式3D情节

  1. 水深测量作为表面x =经度,y =纬度,z =深度)和
  2. 鲸鱼群的地理位置x =经度,y =纬度,z =固定深度 - 例如30米)。
  3. 坐标以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)完全从情节网站创建情节。 首先,我转换了光栅&#34; bathy_ras&#34;到包含所有坐标点(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 ...
    

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

    这会在图表帐户中创建两个网格。我可以轻松地为这两个data.frames写两个单独的3D图:一个是曲面图(如下所示),另一个是散点图。我尝试在本教程(http://help.plot.ly/update-a-graphs-data/)之后将散点图作为新曲线包含在曲面图中,但是&#34;插入&#34;如果散点图是3D,则选项似乎不可用。 surface plot produced from the plotly web interface

    是否可以在scatter3D中合并plotly和曲面图?

    nb:我与raster::persp结合使用了points(),但我对表面情节的整体美感并不十分满意,这就是为什么我更喜欢用plotly做到这一点和/或ggplot2

1 个答案:

答案 0 :(得分:11)

我相信你在做什么应该可以正常工作。我认为这可能与您的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))

我明白了:

enter image description here

希望这会有所帮助......