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

如何从分组数据中的点实现平滑曲面?

  •  0
  • jay.sf  · 技术社区  · 7 年前

    具有 ggplot(.) + geom_smooth() 我们可以通过分组数据的点获得漂亮的曲线。

    library(ggplot2)
    span <- 10
    
    ggplot(data, aes(x = x, y = value, group = n)) +
      geom_smooth(aes(linetype = n), color = "blue", 
                  se = FALSE)
    

    enter image description here

    价值 这两个变量 var1,var2 在3D中。我做了几次尝试 car::scatter3d 让我更接近我想要的。但我在那里找不到“平滑”选项,也没有保存绘图的选项。

    library(car)
    scatter3d(value ~ var1 + var2, data, 
              surface = FALSE, point.col = "blue",
              axis.ticks = TRUE, sphere.size = .8)
    

    enter image description here

    我也试过了 rgl, plot3D, lattice plotly 打包但没有成功;前两个我收到了错误,后两个只是空网格。

    library(rgl)
    persp3d(value ~ var1 + var2, data, col="skyblue")
    # Error in seq.default(0, 1, len = nrow(z)) : 
    #   argument 'length.out' must be of length 1
    
    library(plot3D)
    surf3D(as.matrix(data1[, 1]), as.matrix(data1[, 2]), as.matrix(data1[, 3]))
    # Error in if (is.na(var)) ispresent <- FALSE else if (length(var) == 1) if (is.logic
    # al(var)) if (!var) ispresent <- FALSE : 
    #   argument is of length zero
    
    library(lattice)
    wireframe(value ~ var1 + var2, data)
    # empty or wrong
    
    library(plotly)
    plot_ly(x = data$var1, y = data$value, z = data$var1, type = "surface")
    # empty
    

    如何在分组数据中实现三维平滑曲面?我的目标是这样的(就像 ggplot() 以上内容):

    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("1", "2", "3", "4"
                                           ), 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")
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   user2554330    7 年前

    您的数据看起来像一个网格,位于 n ,所以在 rgl 你可以强迫 x , y value 列到矩阵并使用 persp3d :

    library(rgl)
    open3d()
    for (level in unique(data$n)) {
      sub <- subset(data, n == level)
      x <- matrix(sub$x, 6,6)
      y <- matrix(sub$y, 6,6)
      value <- matrix(sub$value, 6,6)
      persp3d(x, y, value, col = level, alpha = 0.5, add = level > 1)
    }
    

    (The add = level > 1 直线位于此处,以便将第一条线之后的标高添加到同一绘图中。)

    如果数据不一定在网格中,您仍然可以绘制曲面,但这需要更多的工作。你需要 deldir 打包以三角化数据。例如

    library(rgl)
    library(deldir)
    open3d()
    for (level in unique(data$n)) {
      sub <- subset(data, n == level)
      surf <- deldir(sub$x, sub$y, z = sub$value, suppressMsge = TRUE)
      persp3d(surf, col = level, alpha = 0.5, add = TRUE)
    }
    aspect3d(1,1,1)
    decorate3d(zlab = "value")
    

    你需要 aspect3d decorate3d 在末尾调用,因为 persp3d.deldir 不会自动设置纵横比或设置自定义轴标签。这给了

    surfaces