Как изменить шкалу на оси диаграммы рассеяния? - PullRequest
0 голосов
/ 10 июля 2019

У меня есть код ниже, который работает, где он строит трехмерный график рассеяния, используя scatterplot3d Тем не менее, я хотел бы изменить масштаб оси z «Count» так, чтобы максимальное значение находилось в начале координат. Как мне отредактировать код, чтобы я мог построить точки данных, в которых ось z имеет максимальное число в начале координат?

   df
   ID   Height  Weight  Class    Count
   1    0.75     0.98     6        13
   2    0.62     0.11     2        18
   3    0.33     0.13     3        300
   4    0.34     0.15     4        43
   5    0.67     0.14     5        2000

  Height <- APP$Height
  Weight <- APP$Weight
  Class <- APP$Class
  Count <- APP$Count

 color <- c(rgb(0, 1, 0), rgb(0.25, 0.75, 0), rgb(0.5, 0.5, 0), 
 rgb(0.75, 0.25, 0), rgb(1, 0, 0))

scatterplot3d(x=c(0.0, 0.45, 0.45, 0, 0), y=c(0, 0, 0.45, 0.45, 0), 
z=c(0, 0, 0, 0, 0), box=T, type='l', color='black', grid=F, lwd=2,
      xlab='Height)', ylab='', zlab='Count',
      xlim=c(0, 1), ylim=c(0, 1), zlim=c(2260,0), angle=15)
text(7, 0, '                             Weight', 
srt=11)
par(new=T)
scatterplot3d(x=c(0.0, 0.45, 0.45, 0.0, 0.0), y=c(0.55, 0.55, 1, 1, 
0.55), z=rep(0,5), box=F, type='l', color='black', grid=F, lwd=2,
      xlab='', ylab='', zlab='', xlim=c(0, 1), ylim=c(0, 1), 
zlim=c(0,2260), axis=F, angle=15)
par(new=T)
scatterplot3d(x=c(0.55, 1, 1, 0.55, 0.55), y=c(0.0, 0.0, 0.45, 0.45, 
0.0), z=rep(0,5), box=F, type='l', color='black', grid=F, lwd=2,
      xlab='', ylab='', zlab='', xlim=c(0, 1), ylim=c(0, 1), 
zlim=c(0,2260), axis=F, angle=15)
par(new=T)
scatterplot3d(x=c(0.55, 1, 1, 0.55, 0.55), y=c(0.55, 0.55, 1, 1, 0.55), 
z=rep(0,5), box=F, type='l', color='black', grid=F, lwd=2,
      xlab='', ylab='', zlab='', xlim=c(0, 1), ylim=c(0, 1), 
zlim=c(0,2260), axis=F, angle=15)
par(new=T)


for (i in 6:2) {

scatterplot3d(Height[Class==i], Weight[Class==i], Count[Class==i],box=F, 
pch=c(1,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, 2260), axis=F, angle=15)
par(new=T)


}

Ожидаемые результаты будут иметь точки, нанесенные на график, где ось z (число) имеет значение max (2000) в начале координат и min (13) в верхней части оси. Оси X и Y находятся в диапазоне от 0 (начало координат) до 1, как написано в этом сценарии.

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Я не совсем уверен, что вы пытаетесь сделать, но используя ваш код, это будет примерно так:

library(readr)
library(dplyr)
library(scatterplot3d)

"ID   Height  Weight  Class    Count
1    0.75     0.98     6        13
2    0.62     0.11     2        18
3    0.33     0.13     3        300
4    0.34     0.15     4        43
5    0.67     0.14     5        2000" %>% read_table() -> APP

Height <- APP$Height
Weight <- APP$Weight
Class <- APP$Class
Count <- APP$Count
Count_rev <- max(Count) + min(Count) - Count

color <- c(rgb(0, 1, 0), 
           rgb(0.25, 0.75, 0), 
           rgb(0.5, 0.5, 0), 
           rgb(0.75, 0.25, 0), 
           rgb(1, 0, 0))

scatterplot3d(x=c(0.0, 0.45, 0.45, 0, 0), 
              y=c(0, 0, 0.45, 0.45, 0), 
              z=c(13, 13, 13, 13, 13), box=T, type='l', color='black', grid=F, lwd=2,
              xlab='Height)', ylab='', zlab='Count',
              xlim=c(0, 1), ylim=c(0, 1), zlim=c(13, 2000), angle=15, z.ticklabs = c(2000, 1500, 1000, 500, 13))
text(7, 0, 'Weight', srt=11)
par(new=T)
scatterplot3d(x=c(0.0, 0.45, 0.45, 0.0, 0.0), 
              y=c(0.55, 0.55, 1, 1, 0.55), 
              z=rep(13,5), box=F, type='l', color='black', grid=F, lwd=2,
              xlab='', ylab='', zlab='', xlim=c(0, 1), ylim=c(0, 1), 
              zlim=c(13, 2000), axis=F, angle=15, z.ticklabs = c(2000, 1500, 1000, 500, 13))
par(new=T)
scatterplot3d(x=c(0.55, 1, 1, 0.55, 0.55), 
              y=c(0.0, 0.0, 0.45, 0.45, 0.0), 
              z=rep(13,5), box=F, type='l', color='black', grid=F, lwd=2,
              xlab='', ylab='', zlab='', xlim=c(0, 1), ylim=c(0, 1), 
              zlim=c(13,2000), axis=F, angle=15, z.ticklabs = c(2000, 1500, 1000, 500, 13))
par(new=T)
scatterplot3d(x=c(0.55, 1, 1, 0.55, 0.55), y=c(0.55, 0.55, 1, 1, 0.55), 
              z=rep(13,5), box=F, type='l', color='black', grid=F, lwd=2,
              xlab='', ylab='', zlab='', xlim=c(0, 1), ylim=c(0, 1), 
              zlim=c(13,2000), axis=F, angle=15, z.ticklabs = c(2000, 1500, 1000, 500, 13))
par(new=T)
for (i in 6:2) {
  scatterplot3d(Height[Class==i], Weight[Class==i], Count_rev[rev(Class==i)],box=F, 
                pch=c(1,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(13, 2000), axis=F, angle=15, z.ticklabs = c(2000, 1500, 1000, 500, 13)) # z.ticklabs
  par(new=T)
}
0 голосов
/ 11 июля 2019

Я не думаю, что в scatterplot3d::scatterplot3d() есть опция, позволяющая сделать это напрямую, поэтому вам придется применить более ручной подход, изменив значения z самостоятельно и используя аргумент z.ticklabs, чтобы обеспечить соответствующую обратную метку .

Вот простой пример. Сначала создайте три точки и создайте график, используя значения по умолчанию:

x <- rep(0, 3)
y <- rep(0, 3)
z <- c(0, 1, 10)

scatterplot3d(x, y, z)

enter image description here

Затем поменяйте местами z-значения и укажите желаемую маркировку:

z_rev <- max(z) - z
scatterplot3d(x, y, z_rev, 
              zlab = "z", 
              z.ticklabs = seq(max(z_rev), min(z_rev), -2))

enter image description here

...