代码之家  ›  专栏  ›  技术社区  ›  jay.sf

如何绘制信息丰富的分层曲面图?

  •  1
  • jay.sf  · 技术社区  · 6 年前

    我想打印3D数据 d1 其分层依据 n . 幸亏 this answer 我实现了以下解决方案 rgl 到目前为止,这已经很好了,尽管我找不到一种方法来将情节旋转到最好的角度。在这方面,更直截了当的是 plotly ,可以使用鼠标旋转图形。后者也已经有了我需要的颜色阴影和相应的图例。虽然在这两方面,我都不知道如何保存图形响应。如何将其融入我的计划中。我不依赖于特定的软件包,只需要以下内容:

    • 地层
    • 颜色/纹理阴影带图例
    • 可切割、可切割

    这是我的尝试,数据如下。

    car::some(d1, 5)
    #        n   x   y        value
    # 37  1000 0.0 0.0 0.000000e+00
    # 93  2000 0.3 0.2 2.500834e-04
    # 101 2000 0.4 0.4 3.201067e-04
    # 111 4000 0.0 0.2 2.400160e-05
    # 142 4000 0.5 0.3 6.400427e-05
    
    # change levels
    levels <- levels(d1$n)  # preserve for later
    d1$n <- as.factor(as.numeric(d1$n))
    
    # arrayer
    arrayIt <- function(x){
      # makes array of d1 by x, y, z
      d <- sqrt(nrow(x)/length(unique(x[, 1])))  # dim. of matrices
      ar <- array(NA, c(d, d, 3))  # init. array
      ar[, , 1] <- matrix(x[, 2], d, d)  # x
      ar[, , 2] <- matrix(x[, 3], d, d)  # y
      ar[, , 3] <- matrix(x[, 4], d, d)  # z
      return(ar)
    }
    
    # list of 4 arrays for each  n
    ls1 <- lapply(seq_along(unique(d1[, 1])), function(n) arrayIt(d1[d1[, 1] == n, ]))
    
    # plot
    library(rgl)
    lapply(seq_along(unique(d1$n)), function(i){
      x <- ls1[[i]][,,1]
      y <- ls1[[i]][,,2]
      z <- ls1[[i]][,,3]
      persp3d(x, y, z, col = i, alpha = .5, add = i > 1)  # MARK
    })
    

    enter image description here

    例如。 绘声绘色地 已经提供了颜色阴影和图例,这是非常丰富的信息,但 plot_ly 不会在 lapply 在上面,我也没有找到如何添加层的选项。

    library(plotly)
    plot_ly(x=x, y=y, z=z, type = "surface")  # inserted at MARK didn't work
    

    enter image description here

    总之,期望的结果类似于两个图的交集。

    数据:

    data <- structure(list(n = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                                       1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                                       1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                                       2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
                                       2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
                                       3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
                                       3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
                                       3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
                                       4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
                                       4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("500", "1000", "2000", 
                                                                                   "4000"), class = "factor"), x = c(0, 0, 0, 0, 0, 0, 0.1, 0.1, 
                                                                                                                     0.1, 0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.3, 0.3, 0.3, 
                                                                                                                     0.3, 0.3, 0.3, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.5, 0.5, 0.5, 0.5, 
                                                                                                                     0.5, 0.5, 0, 0, 0, 0, 0, 0, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2, 
                                                                                                                     0.2, 0.2, 0.2, 0.2, 0.2, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.4, 0.4, 
                                                                                                                     0.4, 0.4, 0.4, 0.4, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0, 0, 0, 0, 
                                                                                                                     0, 0, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.2, 0.2, 
                                                                                                                     0.2, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 
                                                                                                                     0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0, 0, 0, 0, 0, 0, 0.1, 0.1, 0.1, 
                                                                                                                     0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.3, 0.3, 0.3, 0.3, 
                                                                                                                     0.3, 0.3, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.5, 0.5, 0.5, 0.5, 0.5, 
                                                                                                                     0.5), y = c(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0, 0.1, 0.2, 0.3, 0.4, 
                                                                                                                                 0.5, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 
                                                                                                                                 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0, 0.1, 
                                                                                                                                 0.2, 0.3, 0.4, 0.5, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0, 0.1, 0.2, 
                                                                                                                                 0.3, 0.4, 0.5, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0, 0.1, 0.2, 0.3, 
                                                                                                                                 0.4, 0.5, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0, 0.1, 0.2, 0.3, 0.4, 
                                                                                                                                 0.5, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 
                                                                                                                                 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0, 0.1, 
                                                                                                                                 0.2, 0.3, 0.4, 0.5, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0, 0.1, 0.2, 
                                                                                                                                 0.3, 0.4, 0.5, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0, 0.1, 0.2, 0.3, 
                                                                                                                                 0.4, 0.5, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0, 0.1, 0.2, 0.3, 0.4, 
                                                                                                                                 0.5), value = c(0, 0.000253671562082777, 0.00048064085447263, 
                                                                                                                                                 0.000680907877169559, 0.000854472630173565, 0.00100133511348465, 
                                                                                                                                                 0.000253671562082777, 0.00048064085447263, 0.000680907877169559, 
                                                                                                                                                 0.000854472630173565, 0.00100133511348465, 0.0011214953271028, 
                                                                                                                                                 0.00048064085447263, 0.000680907877169559, 0.000854472630173565, 
                                                                                                                                                 0.00100133511348465, 0.0011214953271028, 0.00121495327102804, 
                                                                                                                                                 0.000680907877169559, 0.000854472630173565, 0.00100133511348465, 
                                                                                                                                                 0.0011214953271028, 0.00121495327102804, 0.00128170894526035, 
                                                                                                                                                 0.000854472630173565, 0.00100133511348465, 0.0011214953271028, 
                                                                                                                                                 0.00121495327102804, 0.00128170894526035, 0.00132176234979973, 
                                                                                                                                                 0.00100133511348465, 0.0011214953271028, 0.00121495327102804, 
                                                                                                                                                 0.00128170894526035, 0.00132176234979973, 0.00133511348464619, 
                                                                                                                                                 0, 0.000126751167444963, 0.000240160106737825, 0.000340226817878586, 
                                                                                                                                                 0.000426951300867245, 0.000500333555703803, 0.000126751167444963, 
                                                                                                                                                 0.000240160106737825, 0.000340226817878586, 0.000426951300867245, 
                                                                                                                                                 0.000500333555703803, 0.000560373582388259, 0.000240160106737825, 
                                                                                                                                                 0.000340226817878586, 0.000426951300867245, 0.000500333555703803, 
                                                                                                                                                 0.000560373582388259, 0.000607071380920614, 0.000340226817878586, 
                                                                                                                                                 0.000426951300867245, 0.000500333555703803, 0.000560373582388259, 
                                                                                                                                                 0.000607071380920614, 0.000640426951300867, 0.000426951300867245, 
                                                                                                                                                 0.000500333555703803, 0.000560373582388259, 0.000607071380920614, 
                                                                                                                                                 0.000640426951300867, 0.000660440293529019, 0.000500333555703803, 
                                                                                                                                                 0.000560373582388259, 0.000607071380920614, 0.000640426951300867, 
                                                                                                                                                 0.000660440293529019, 0.00066711140760507, 0, 6.33544514838279e-05, 
                                                                                                                                                 0.000120040013337779, 0.000170056685561854, 0.000213404468156052, 
                                                                                                                                                 0.000250083361120373, 6.33544514838279e-05, 0.000120040013337779, 
                                                                                                                                                 0.000170056685561854, 0.000213404468156052, 0.000250083361120373, 
                                                                                                                                                 0.000280093364454818, 0.000120040013337779, 0.000170056685561854, 
                                                                                                                                                 0.000213404468156052, 0.000250083361120373, 0.000280093364454818, 
                                                                                                                                                 0.000303434478159386, 0.000170056685561854, 0.000213404468156052, 
                                                                                                                                                 0.000250083361120373, 0.000280093364454818, 0.000303434478159386, 
                                                                                                                                                 0.000320106702234078, 0.000213404468156052, 0.000250083361120373, 
                                                                                                                                                 0.000280093364454818, 0.000303434478159386, 0.000320106702234078, 
                                                                                                                                                 0.000330110036678893, 0.000250083361120373, 0.000280093364454818, 
                                                                                                                                                 0.000303434478159386, 0.000320106702234078, 0.000330110036678893, 
                                                                                                                                                 0.000333444481493831, 0, 1.26675111674112e-05, 2.40016001066738e-05, 
                                                                                                                                                 3.40022668177879e-05, 4.26695113007534e-05, 5.00033335555704e-05, 
                                                                                                                                                 1.26675111674112e-05, 2.40016001066738e-05, 3.40022668177879e-05, 
                                                                                                                                                 4.26695113007534e-05, 5.00033335555704e-05, 5.60037335822388e-05, 
                                                                                                                                                 2.40016001066738e-05, 3.40022668177879e-05, 4.26695113007534e-05, 
                                                                                                                                                 5.00033335555704e-05, 5.60037335822388e-05, 6.06707113807587e-05, 
                                                                                                                                                 3.40022668177879e-05, 4.26695113007534e-05, 5.00033335555704e-05, 
                                                                                                                                                 5.60037335822388e-05, 6.06707113807587e-05, 6.40042669511301e-05, 
                                                                                                                                                 4.26695113007534e-05, 5.00033335555704e-05, 5.60037335822388e-05, 
                                                                                                                                                 6.06707113807587e-05, 6.40042669511301e-05, 6.60044002933529e-05, 
                                                                                                                                                 5.00033335555704e-05, 5.60037335822388e-05, 6.06707113807587e-05, 
                                                                                                                                                 6.40042669511301e-05, 6.60044002933529e-05, 6.66711114074272e-05
                                                                                                                                 )), .Names = c("n", "x", "y", "value"), row.names = c(NA, -144L
                                                                                                                                 ), class = "data.frame")
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   emilliman5    6 年前

    你需要利用 add_surface() 在plotly中。。。曲面图需要以矩阵形式显示数据。plotly网站有各种绘图的体面文档。 https://plot.ly/r/3d-surface-plots/ . 仅获取一个色阶集 showscale==FALSE plotly 命令,然后为其中一个绘图重新启用该命令。

    z <- lapply(unique(data$n), 
                function(x) as.matrix(reshape(data[data$n==x,-1], 
                                              idvar = "x", timevar = "y", direction = "wide") ))
    
    plot_ly(showscale=FALSE) %>% add_surface(z=~z[[1]][, -1], cmin=min(data$value), cmax=max(data$value), showscale=TRUE) %>%
      add_surface(z = ~z[[2]][, -1], cmin=min(data$value), cmax=max(data$value)) %>%
      add_surface(z=~z[[3]][,-1], cmin=min(data$value), cmax=max(data$value)) %>%
      add_surface(z~z[[4]][,-1], cmin=min(data$value), cmax=max(data$value))
    

    具有的旧绘图 cmin cmax 取消设置

    enter image description here

    使用新绘图 cmin公司 cmax 设置以使z值在所有地层上的颜色一致

    enter image description here

        2
  •  2
  •   liborm    6 年前

    正如数据上的不同视图一样-因为单个3D绘图中的四个曲面看起来有点太忙-您可以尝试在 value . (我不确定您需要强调/分析数据集的哪个方面。)

    contour lines

    library(tidyverse)
    library(viridis)
    
    data %>%
      ggplot(aes(x, y)) +
      geom_raster(aes(fill = value), interpolate = T) +
      geom_contour(aes(z = value), bins = 15) +
      facet_wrap(~ n, nrow = 1) +
      scale_fill_viridis()