使用 ggplot(。)+ geom_smooth(),我们可以通过分组数据点获得漂亮的曲线。
With ggplot(.) + geom_smooth() we can achieve nice curves through points with grouped data.
library(ggplot2) span <- 10 ggplot(data, aes(x = x, y = value, group = n)) + geom_smooth(aes(linetype = n), color = "blue", se = FALSE)
现在我有了第三维,想将之间的关系可视化值和两个变量 var1,var2 在3D中。我做了几次尝试,只有 car :: scatter3d 使我更接近自己想要的东西。但是我在那里找不到平滑选项,也没有保存图的选项。
Now I have a third dimension and want to visualize the relation between value and the two variables var1, var2 in 3D. I made several attempts of which only car::scatter3d brought me more closely to what I want. But I couldn't find a "smooth" option there and also no option to save the plot.
library(car) scatter3d(value ~ var1 + var2, data, surface = FALSE, point.col = "blue", axis.ticks = TRUE, sphere.size = .8)
我也尝试了 rgl,plot3D,lattice 和 plotly 包,但没有成功;从前两个中我收到错误,从最后两个中我收到错误网格。
I also tried rgl, plot3D, lattice and plotly package but with no success; from first two I'm receiving errors and from the last two just empty grids.
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()中的组一样):
How is it possible to achieve smoothed surfaces with third dimension in grouped data? I'm aiming at something like this (just with the groups like in ggplot() above):
数据:
Data:
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")推荐答案
您的数据在每个级别 n 中看起来像一个网格,因此在 rgl 中,您可以强制 x , y 和 value 列到矩阵并使用 persp3d :
Your data looks like a grid within each level of n, so in rgl you could coerce the x, y, and value columns to matrices and use 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) }( add = level> 1 行是为了将第一个之后的级别添加到同一图中。)
(The add = level > 1 line is there so that levels after the first one are added to the same plot.)
如果您的数据不一定在网格中,您仍然可以绘制曲面,但是还需要做更多的工作。您需要 deldir 包对数据进行三角测量。例如,
If your data isn't necessarily in a grid, you can still plot the surfaces, but it's a bit more work. You need the deldir package to triangulate your data. For example,
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 不会自动设置纵横比或设置自定义轴标签。这样会
You need the aspect3d and decorate3d calls at the end because persp3d.deldir doesn't automatically set the aspect ratio or set custom axis labels. This gives
更多推荐
如何从分组数据中的点获得平滑的表面?
发布评论