使用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)
现在我有了第三个维度,想要在3D中可视化值和两个变量 var1,var2 之间的关系。我做了几次尝试,只有car::scatter3d
让我更接近我想要的东西。但是我找不到那里的“平滑”选项,也没有保存情节的选项。
library(car)
scatter3d(value ~ var1 + var2, data,
surface = FALSE, point.col = "blue",
axis.ticks = TRUE, sphere.size = .8)
我还尝试了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()
中的小组一样):
数据:的
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")
答案 0 :(得分:1)
您的数据在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)
}
(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
不会自动设置宽高比或设置自定义轴标签。这给了