堆叠和分组条形图

时间:2021-02-13 16:23:03

标签: r plot bar-chart

我想制作一个堆叠和分组的条形图。我想在基础 R 中管理。作为我的输出,我想为每个 id 显示“R”和“W”。我希望每个堆栈都被命名为 R/W 并且在它下面应该说明它属于哪个 id。有没有人有关于如何管理这个的建议?谢谢!

 id <- rep(1:10,each=2)

trt <- rep(c("R","W"), 2)
set.seed(1)
A <- sample(100,10)
set.seed(2)
B <- sample(100,10)

df <- data.frame(id,trt,A,B)
df

dfR <- df[df$trt=="R",]
rownames(dfR) <- dfR$id

par(mar=c(3,2,2,5))
par(mfrow=c(2,1))
  
co <- c("red", "blue")
dfR_ <- t(as.matrix(dfR[,-c(1,2)]))
barplot(dfR_, main="R",
        xlab="nmol/L", col=co)


r<- rev((rownames(dfR_)))
legend("topright", inset=c(-0.1,0.15), legend=r, pch=15, col=rev(co))


dfR <- df[df$trt=="W",]
rownames(dfR) <- dfR$id

co <- c("red", "blue")
dfR_ <- t(as.matrix(dfR[,-c(1,2)]))
barplot(dfR_, main="W",
        xlab="nmol/L", col=co)

par(mar=c(3,2,2,5))

r<- rev((rownames(dfR_)))
legend("topright", inset=c(-0.1,0.15), legend=r, pch=15, col=rev(co))

enter image description here

1 个答案:

答案 0 :(得分:4)

转置您的数据矩阵并使用 space= 选项定义漂亮的空间,让它们循环使用。 barplot 不可见地输出我们用来提供 R 和 W 标签的柱形位置 b。对于 ID,我们可以很容易地使用两者之间的方法。

m <- t(as.matrix(df[-(1:2)]))
clr <- c("red", "blue")
prange <- c(0, max(colSums(m)))

b <- barplot(m, space=c(1.25, .25), col=clr, main="My Plot", ylim=prange*1.05)
mtext( rep(c("R", "W"), 10), 1, -.15, at=b, cex=.7, font=2)
mtext(1:10, 1, 1, at=rowMeans(matrix(b, ncol=2, b=T)))
legend("topleft", leg=c("A", "B"), col=1, pt.bg=clr, pch=22, horiz=T, bty="n")
box()

enter image description here


数据:

df <- structure(list(id = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 
6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L), trt = c("R", "W", 
"R", "W", "R", "W", "R", "W", "R", "W", "R", "W", "R", "W", "R", 
"W", "R", "W", "R", "W"), A = c(68L, 39L, 1L, 34L, 87L, 43L, 
14L, 82L, 59L, 51L, 68L, 39L, 1L, 34L, 87L, 43L, 14L, 82L, 59L, 
51L), B = c(85L, 79L, 70L, 6L, 32L, 8L, 17L, 93L, 81L, 76L, 85L, 
79L, 70L, 6L, 32L, 8L, 17L, 93L, 81L, 76L)), class = "data.frame", row.names = c(NA, 
-20L))