2017-09-24 16 views
1

목표 : "X1"- "X4"및 "Y1"의 각 조합에 대해 값 z를 표시하는 3D 막대 그래프를 만듭니다 "-"Y4 ". 레이블은 z 변수의 순위와 일치해야합니다.R 격자/LatticeExtra 바브 Plot을 Textplot과 결합 - 레이블이 제대로 표시되지 않음

문제 : 아래에서 볼 수 있듯이 이미지의 레이블은 z의 순위 값 (순위 1 = z의 최소값, 순위 16 = z의 최대 값)과 일치하지 않습니다. 예를 들어 조합 "X1-Y3"은 z 값이 가장 낮기 때문에 8 대신 인덱스 1을 가져야합니다. 따라서 어떻게 해결할 수 있습니까?

이미지 출력 (잘못된 라벨 포함) : 이미지 출력 결과가 잘못되었습니다 (라벨이 z 축 값의 등급에 해당하지 않음).

3D Barplot/Textplot from reproducible R code above

R-코드

: 나는 barplot 위에 textplot 오버레이 위의 이미지하십시오.

# load necessary libraries 
library(lattice) 
library(latticeExtra) 

# create dataframe 
df.test <- data.frame(matrix(NA, nrow=16, ncol=4)) 
names(df.test) <- c("x", "y", "z", "z.rank") 

# fill dataframe 
df.test$x <- as.factor(rep(c("X1", "X2", "X3", "X4"), times=4)) 
df.test$y <- as.factor(rep(paste0("Y", 1:4), each=4)) 
set.seed(2); df.test$z <- abs(rnorm(16, 0, 1)) 

# labels (rankings of z, from largest to smallest) 
df.test$z.rank <- as.numeric(rank(df.test$z)) 


# plot 1 (bars) 
p1.test <- cloud(z~x+y, data=df.test, panel.3d.cloud=panel.3dbars, 
      ylab="Y", xlab="X", zlab="Z", 
      xbase=0.2, ybase=0.2, scales=list(arrows=FALSE, col="black", distance=1), 
      par.settings = list(axis.line = list(col = "transparent")), 
      screen = list(z = 35, x = -35, y=0), 
      alpha.facet = 1.00, border = "transparent", 
      zoom=1.00 
); print(p1.test) 

# plot 2 (labels) 
p2.test <- cloud(z~x+y, data=df.test, panel.3d.cloud=panel.3dtext, 
      labels=as.character(df.test$z.rank), 
      ylab="", xlab="", zlab="", 
      par.settings = list(axis.line = list(col = "transparent")), 
      screen = list(z = 35, x = -35, y=0), 
      alpha.facet = 1.00, border = "transparent", 
      zoom=1.00, cex=0.5, pos=3, offset=1.75 
); print(p2.test) 

# plot both (overlay p2.test onto p1.test) 
print(p1.test, more=TRUE) 
print(p2.test, more=FALSE) 

답변

2
library(lattice) 
library(latticeExtra) 
df.test <- data.frame(matrix(NA, nrow=16, ncol=4)) 
names(df.test) <- c("x", "y", "z", "zrank") 
df.test$x <- as.factor(rep(c("X1", "X2", "X3", "X4"), times=4)) 
df.test$y <- as.factor(rep(paste0("Y", 1:4), each=4)) 
set.seed(2) 
df.test$z <- abs(rnorm(16, 0, 1)) 
df.test$zrank <- as.numeric(rank(df.test$z)) 

p1.test <- cloud(z ~ x * y, data=df.test, panel.3d.cloud=panel.3dbars, 
      ylab="Y", xlab="X", zlab="Z", 
      xbase=0.2, ybase=0.2, scales=list(arrows=FALSE, col="black", distance=1), 
      par.settings = list(axis.line = list(col = "transparent")), 
      screen = list(z = 35, x = -35, y=0), 
      alpha.facet = 1.00, border = "transparent", 
      zoom=1.00) 

# A modified version of panel.3dtext 
mypanel.3dtext <- function (x, y, z, labels = seq_along(x), rot.mat = diag(4), 
    distance, ...) { 
    if (all(is.na(x) | is.na(y) | is.na(z))) return() 
    m <- ltransform3dto3d(rbind(x, y, z), rot.mat, distance) 
    panel.text(x = m[1, ], y = m[2, ], labels = labels, ...)} 

p2.test <- cloud(z ~ x * y, data=df.test, panel.3d.cloud=mypanel.3dtext, 
      labels=df.test$zrank, 
      ylab="", xlab="", zlab="", col="red", 
      par.settings = list(axis.line = list(col = "transparent")), 
      screen = list(z = 35, x = -35, y=0), 
      alpha.facet = 1.00, border = "transparent", 
      zoom=1.00, cex=0.5, pos=3, offset=1.75) 

print(p1.test, more=TRUE) 
print(p2.test, more=FALSE) 

enter image description here