Как вращать 3D Scatterplot - PullRequest
       32

Как вращать 3D Scatterplot

0 голосов
/ 18 января 2020

Ниже приведен код, который работает с использованием функции scatterplot3d () для запуска трехмерной диаграммы рассеивания по высоте в зависимости от веса и объема, где точки представляют собой значения класса в диапазоне от 1 до 6. Угол в настоящее время составляет 45 градусов, и я знаю, что могу наклонить график, изменив угол. Какой код я использую для поворота графика влево или вправо, чтобы я мог предоставить несколько видов графика?

df
#    Class   height     weight    volume
# 1    4     0.83         0.85      0.83
# 2    2     0.75         0.80      0.76
# 3    3     0.75         0.80      0.84
# 4    5     0.52         0.59      1
# 5    6     0.52         0.59      0.99

 color <- c(rgb(0.68, 0.93, 0.96), rgb(0, 0.74, 0.92), rgb(0.68, 0.86, 0.49), rgb(1, 0.8, 0.3), 
 rgb(1, 0, 0))
 scatterplot3d(x=c(0.0, 0.5, 0.5, 0, 0), y=c(0, 0, 0.5, 0.5, 0), z=c(0, 0, 0, 0, 0), box=T, type='l', 
 color='grey', grid=F, lwd=2, xlab='height', ylab='', zlab='volume', xlim=c(0, 1), ylim=c(0, 1), 
 zlim=c(0,1), angle=45)
 text(7, 0, 'weight', srt=45)
 par(new=T)

 scatterplot3d(x=c(0.0, 0.5, 0.5, 0.0, 0.0), y=c(0.5, 0.5, 1, 1, 0.5), z=rep(0,5), box=F, type='l', 
 color='grey', grid=F, lwd=2,xlab='', ylab='', zlab='', xlim=c(0, 1), ylim=c(0, 1), zlim=c(0,1), 
 axis=F, angle=45)
 par(new=T)

 scatterplot3d(x=c(0.5, 1, 1, 0.5, 0.5), y=c(0.0, 0.0, 0.5, 0.5, 0.0), z=rep(0,5), box=F, type='l', 
 color='grey', grid=F, lwd=2,
          xlab='', ylab='', zlab='', xlim=c(0, 1), ylim=c(0, 1), zlim=c(0,1), axis=F, angle=45)
 par(new=T)

 scatterplot3d(x=c(0.5, 1, 1, 0.5, 0.5), y=c(0.5, 0.5, 1, 1, 0.5), z=rep(0,5), box=F, type='l', 
 color='grey', grid=F, lwd=2,
          xlab='', ylab='', zlab='', xlim=c(0, 1), ylim=c(0, 1), zlim=c(0,1), axis=F, angle=45)
 par(new=T)

 for (i in 6:2) {

 scatterplot3d(height[Class==i], weight[Class==i], volume[Class==i], box=F, pch=c(2,1,0,1,20)[i-1], 
 color=color[i-1], grid=F,
            xlab='', ylab='', zlab='', xlim=c(0, 1), ylim=c(0, 1), zlim=c(0, 1), axis=F, angle=45)
 par(new=T)
 }
 legend(0.2, 4.7, legend=c(paste('Level', 2:6)), pch=c(2,1,0,1,19), col=color, title='Class', 
 cex=0.70)

1 Ответ

1 голос
/ 22 января 2020

Вот два просмотра ваших данных. Вы всегда должны использовать dput() для вставки ваших данных в вопрос, чтобы мы могли легко получить к ним доступ:

dfa <- structure(list(Class = c(4L, 2L, 3L, 5L, 6L), height = c(0.83, 
     0.75, 0.75, 0.52, 0.52), weight = c(0.85, 0.8, 0.8, 0.59, 0.59),
     volume = c(0.83, 0.76, 0.84, 1, 0.99)), class = "data.frame",
     row.names = c("1", "2", "3", "4", "5"))

Мы можем значительно упростить ваш код, используя функции, которые scatterplot3d возвращает следующим образом:

library(scatterplot3d)
color <- c(rgb(0.68, 0.93, 0.96), rgb(0, 0.74, 0.92), rgb(0.68, 0.86, 0.49),
     rgb(1, 0.8, 0.3), rgb(1, 0, 0))
plt <- with(dfa, scatterplot3d(height, weight, volume, xlim=c(0, 1), ylim=c(0, 1),
     zlim=c(0, 1), ylab="", color=color, pch=c(2, 1, 0, 1, 20), grid=FALSE,
     scale.y=1, angle=45))
plt$points3d(x=c(0, 1), y=c(0.5, 0.5), z=c(0, 0), type="l", col="grey")
plt$points3d(x=c(0.5, 0.5), y=c(0, 1), z=c(0, 0), type="l", col="grey")
xy <- unlist(plt$xyz.convert(1.25, .5, 0))
text(xy[1], xy[2], "weight", srt=45, pos=2)
legend(0.2, 4.7, legend=c(paste('Level', 2:6)), pch=c(2,1,0,1,19), col=color,
     title='Class', cex=0.70)

Plot 1

Обратите внимание, что мы оцениваем положение метки оси Y и используем функцию для преобразования 3d-координат в 2d для построения. Теперь мы сделаем поворот на 135 градусов:

plt <- with(dfa, scatterplot3d(height, weight, volume, xlim=c(0, 1), ylim=c(0, 1),
     zlim=c(0, 1), ylab="", color=color, pch=c(2, 1, 0, 1, 20), grid=FALSE,
     scale.y=.75, angle=135))
plt$points3d(x=c(0, 1), y=c(0.5, 0.5), z=c(0, 0), type="l", col="grey")
plt$points3d(x=c(0.5, 0.5), y=c(0, 1), z=c(0, 0), type="l", col="grey")
xy <- unlist(plt$xyz.convert(-0.2, .5, 0))
text(xy[1], xy[2], "weight", srt=-45, pos=4)
legend(0.2, 4.7, legend=c(paste('Level', 2:6)), pch=c(2,1,0,1,19), col=color,
     title='Class', cex=0.70)

Plot 2

...