gpt4 book ai didi

r - 在单个3D图中混合表面和散点图

转载 作者:行者123 更新时间:2023-12-04 10:36:01 25 4
gpt4 key购买 nike

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

  • 水深作为表面(x =经度,y =纬度,z =深度)和
  • 鲸鱼群的地理位置(例如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 ...

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

    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)完全从绘图网站创建绘图。
    首先,我将栅格“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 ...

    我创建了一个帐户。我将两个数据框作为.txt文件导入了我的帐户: bathy_dfpoints

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

    是否可以在 scatter3D中组合 plotly和表面图?

    nb:我尝试将 raster::persppoints()结合使用,但对表面图的总体美感并不十分满意,这就是为什么我更愿意使用 plotly和/或 ggplot2来做到这一点。

    最佳答案

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

    希望这可以帮助...

    关于r - 在单个3D图中混合表面和散点图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36049595/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com