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)
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)
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
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")
Your data looks like a grid within each level of
n
, so inrgl
you could coerce thex
,y
, andvalue
columns to matrices and usepersp3d
:(The
add = level > 1
line is there so that levels after the first one are added to the same plot.)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,You need the
aspect3d
anddecorate3d
calls at the end becausepersp3d.deldir
doesn't automatically set the aspect ratio or set custom axis labels. This gives