在 R 中并排调整多个条形图的大小

Resize side-by-side multiple barplots in R

我用这个 在一个 PDF 页面中绘制了 15 个条形图(并排)。问题是数字质量变得非常小。

dat <- read.table("data.txt",header=TRUE)

pdf('plot.pdf')
m <- rbind(c(1,2,3), c(4,5,6),c(7,8,9),c(10,11,12),c(13,14,15))
layout(m)
barcols <- c("red","blue","green","orange","black","yellow")

sp <- split(dat, dat$Project)

sapply(seq_along(sp),
       function(x) {
         dd <- sp[[x]]
         m <- t(`rownames<-`(as.matrix(dd[, -(1:2)]), dd[, 1]))
         bp <- barplot(m,ylim=c(0, 0.4),beside=TRUE,col=barcols)
         title(main=names(sp[x]))
        # abline(h=0)
       }
)
plot(NA,xlim=c(0,1),ylim=c(0,1),ann=FALSE,axes=FALSE)
legend(0,0.6,c("C10","C10","C03","C11","C16","C08"),fill=barcols,cex=1.5)
dev.off()

以上代码运行结果如下:

是否可以调整图形的大小,以使 x 轴数据可读?

数据格式如下:

Topic  Project  C10     C14     C03     C11     C16     C08
T1     P1       0.24    0.00    0.00    0.04    0.04    0.00
T2     P1       0.00    0.30    0.00    0.00    0.00    0.00
T3     P1       0.04    0.04    0.00    0.24    0.00    0.00
T4     P1       0.00    0.00    0.00    0.04    0.33    0.04
T5     P1       0.00    0.09    0.21    0.00    0.00    0.00
T6     P1       0.00    0.09    0.00    0.00    0.00    0.34
T1     P2       0.20    0.00    0.00    0.04    0.00    0.04
T2     P2       0.00    0.22    0.04    0.00    0.00    0.00
T3     P2       0.04    0.00    0.00    0.24    0.00    0.00
T4     P2       0.00    0.00    0.04    0.00    0.33    0.00
T5     P2       0.04    0.00    0.21    0.00    0.00    0.00
T6     P2       0.00    0.04    0.00    0.00    0.00    0.34
T1     P3       0.20    0.00    0.00    0.04    0.00    0.04
T2     P3       0.00    0.22    0.04    0.00    0.00    0.00
T3     P3       0.04    0.00    0.00    0.24    0.00    0.00
T4     P3       0.00    0.00    0.04    0.00    0.33    0.00
T5     P3       0.04    0.00    0.21    0.00    0.00    0.00
T6     P3       0.00    0.04    0.00    0.00    0.00    0.34
...
...

以下是使用 ggplot2lattice 的方法。这些包使用 "long format" 数据。对于您的数据集,这意味着将第 3 列到第 8 列的值堆叠到单个列中,第二列指示组的名称(即原始列的名称,例如 C10C14 , ETC。)。

tidyr方便整形为长格式:

d <- read.table(text='Topic  Project  C10     C14     C03     C11     C16     C08
T1     P1       0.24    0.00    0.00    0.04    0.04    0.00
T2     P1       0.00    0.30    0.00    0.00    0.00    0.00
T3     P1       0.04    0.04    0.00    0.24    0.00    0.00
T4     P1       0.00    0.00    0.00    0.04    0.33    0.04
T5     P1       0.00    0.09    0.21    0.00    0.00    0.00
T6     P1       0.00    0.09    0.00    0.00    0.00    0.34
T1     P2       0.20    0.00    0.00    0.04    0.00    0.04
T2     P2       0.00    0.22    0.04    0.00    0.00    0.00
T3     P2       0.04    0.00    0.00    0.24    0.00    0.00
T4     P2       0.00    0.00    0.04    0.00    0.33    0.00
T5     P2       0.04    0.00    0.21    0.00    0.00    0.00
T6     P2       0.00    0.04    0.00    0.00    0.00    0.34
T1     P3       0.20    0.00    0.00    0.04    0.00    0.04
T2     P3       0.00    0.22    0.04    0.00    0.00    0.00
T3     P3       0.04    0.00    0.00    0.24    0.00    0.00
T4     P3       0.00    0.00    0.04    0.00    0.33    0.00
T5     P3       0.04    0.00    0.21    0.00    0.00    0.00
T6     P3       0.00    0.04    0.00    0.00    0.00    0.34', header=TRUE)

library(tidyr)
d2 <- gather(d, Variable, Value, -Topic, -Project)

head(d2)

##   Topic Project Variable Value
## 1    T1      P1      C10  0.24
## 2    T2      P1      C10  0.00
## 3    T3      P1      C10  0.04
## 4    T4      P1      C10  0.00
## 5    T5      P1      C10  0.00
## 6    T6      P1      C10  0.00    

然后,ggplot2:

library(ggplot2)
ggplot(d2, aes(x=Topic, y=Value, fill=Variable)) +
  geom_bar(stat='identity', position='dodge') +
  facet_wrap(~Project)

lattice:

library(lattice)
barchart(Value~Topic|Project, d2, groups=Variable, origin=0)

以上两者都是高度可定制的。请参阅 ggplot2 docs?lattice::barchart.