如何绘制信息分层表面图?

时间:2018-02-19 17:37:09

标签: r plot 3d plotly rgl

我想绘制由 n 分层的3D数据d1。感谢this answer到目前为止,我已经使用rgl获得了以下解决方案,虽然我无法找到将绘图旋转到最佳视角的方法,但已经很好看了。在这方面更直接似乎是plotly,其中可以用鼠标旋转图形。后者也已经具有我需要的相应图例的色调。虽然在这两方面我都不了解如何保存图表。如何将它编织成rmarkdown我打算做什么。我不依赖于特定的包,只需要以下内容:

  • 地层
  • 带传奇的颜色/纹理阴影
  • savable,knitable

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

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

E.g。 plotly已经提供了色彩阴影和图例,这提供了非常丰富的信息,但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 个答案:

答案 0 :(得分:2)

就像对数据的不同观点一样 - 因为单个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()

答案 1 :(得分:2)

您需要在情节中使用enum Gyr_Int_Set_Bits { HR_FILT = 0x80, AM_FILT = 0x40, HR_Z_AXIS = 0x20, HR_Y_AXIS = 0x10, HR_X_AXIS = 0x08, AM_Z_AXIS = 0x04, AM_Y_AXIS = 0x02, AM_X_AXIS = 0x01, }; ...并且您的数据需要采用矩阵形式绘制表面图。这个阴谋网站有各种各样的情节文件。 https://plot.ly/r/3d-surface-plots/。要在SetGyroInterruptBits(34); 命令中仅设置一个色阶add_surface(),然后为其中一个图重新打开。

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)) 未设置

的旧图

enter image description here

设置cmincmax的新情节,以便z值在所有阶层中均匀着色

enter image description here