#r #plot #lattice #scatter3d
#r #график #решетка #scatter3d
Вопрос:
Я хочу добавить 3D-линию к диаграмме рассеяния облаков в пакете решетки R. Вот подмножество моих данных (3 переменные, все между 0,1):
dat <- structure(c(0.413, 0.879, 0.016, 0.631, 0.669, 0.048, 1, 0.004, 0.523, 0.001,
0.271, 0.306, 0.014, 0.008, 0.001, 0.023, 0.670, 0.027, 0.291, 0.709,
0.002, 0.003, 0.611, 0.024, 0.580, 0.755, 1, 0.003, 0.038, 0.143, 0.214,
0.161, 0.008, 0.027, 0.109, 0.026, 0.229, 0.006, 0.377, 0.191, 0.724,
0.119, 0.203, 0.002, 0.309, 0.011, 0.141, 0.009, 0.340, 0.152, 0.545,
0.001, 0.217, 0.132, 0.839, 0.052, 0.745, 0.001, 1, 0.273), .Dim = c(20L, 3L))
Вот облачный график:
# cloud plot
trellis.par.set("axis.line", list(col="transparent"))
cloud(dat[, 1] ~ dat[, 2] dat[, 3], pch=16, col="darkorange", groups=NULL, cex=0.8,
screen=list(z = 30, x = -70, y = 0),
scales=list(arrows=FALSE, cex=0.6, col="black", font=3, tck=0.6, distance=1) )
Я хочу добавить пунктирную серую линию между 0,0,0 и 1,1,1 (т. Е. По диагонали через график). Я знаю, что могу изменить точки на линии, используя «type =»l», panel.3d.cloud = panel.3dscatter», но я не вижу способа добавить дополнительные точки / линии к графику, используя это.
Вот пример того, чего я хочу достичь, используя scatterplot3d:
# scatterplot3d
s3d <- scatterplot3d(dat, type="p", color="darkorange", angle=55, scale.y=0.7,
pch=16, col.axis="blue", col.grid="lightblue")
# add line
s3d$points3d(c(0,1), c(0,1), c(0,1), col="grey", type="l", lty=2)
Я хочу сделать это с облачным графиком, чтобы контролировать угол, под которым я просматриваю график (scatterplot3d не позволяет мне отображать угол графика 0,0,0). Спасибо за любые предложения.
Комментарии:
1. Не уверен, почему это отклонено — проголосовали за «не показывать исследовательские усилия» — я только что потратил 2 часа на просмотр справочной документации и книги Дипаяна о решетке перед публикацией…
Ответ №1:
Неэлегантно и, вероятно, хрупко, но, похоже, это работает…
cloud(dat[, 1] ~ dat[, 2] dat[, 3], pch=16, col="darkorange",
groups=NULL, cex=0.8,
screen=list(z = 30, x = -70, y = 0),
scales=list(arrows=FALSE, cex=0.6, col="black", font=3,
tck=0.6, distance=1) ,
panel=function(...) {
L <- list(...)
L$x <- L$y <- L$z <- c(0,1)
L$type <- "l"
L$col <- "gray"
L$lty <- 2
do.call(panel.cloud,L)
p <- panel.cloud(...)
})
Следует иметь в виду, что это не приведет к удалению скрытых точек / линий, поэтому линия будет либо перед всеми точками, либо за ними всеми; в этой (отредактированной) версии do.call(panel.cloud,L)
сначала, поэтому точки будут скрывать линию, а не наоборот. Если вы хотите удалить скрытую линию, я считаю rgl
, что это ваш единственный вариант… очень мощный, но не такой красивый и с гораздо более примитивным интерфейсом.
Комментарии:
1. Кажется, это работает очень хорошо, большое спасибо. Я оставлю все открытым на некоторое время, чтобы посмотреть, есть ли у кого-нибудь еще предложения.
2. Привет, Бен, я заметил, что вы указали в своем редактировании — я бы предпочел, чтобы линия была позади всех точек, если это возможно. Вы упоминаете, что это можно сделать, изменив порядок вызовов panel.cloud — как бы мне точно изменить порядок? Извините, если это очевидно, но я этого не вижу.
3. Мне все еще не очевидно, почему два последовательных вызова panel.cloud с этими аргументами не будут работать. (И это не так.)