【问题标题】:Resize side-by-side multiple barplots in R在R中调整并排多个条形图的大小
【发布时间】:2016-04-25 22:48:52
【问题描述】:

我用这个answer 在一个 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
...
...

【问题讨论】:

  • 您尝试过类似par(mar=c(2,2,2,0)+0.1) 的方法吗?或者,latticeggplot2 都具有出色的刻面功能。
  • 我很想使用 lattice,但我没有那么强大的背景。 ggplot2 在我的机器上没有显示结果!!

标签: r plot sapply


【解决方案1】:

以下是使用ggplot2lattice 的方法。这些包使用“长格式”数据。对于您的数据集,这意味着将第 3 列到第 8 列的值堆叠成一列,第二列指示组的名称(即原始列的名称,例如 C10C14 等) .

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)

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

【讨论】:

  • 我收到错误包 Error in library(tidyr) : there is no package called ‘tidyr’ 。我尝试安装包,但我得到了这个 tidyr' 不可用(对于 R 版本 3.0.2)`
  • tidyr (0.4.1) 的当前版本需要 R 版本 3.1.0 或更高版本。您可以更新您的 R 版本,或尝试从源代码安装 older version of tidyr。或者,您可以使用:d2 &lt;- cbind(d[, 1:2], Variable=rep(colnames(d)[-(1:2)], each=nrow(d)), Value=unlist(d[, -(1:2)]))
  • 我更新了 R 并成功安装了软件包,我复制/粘贴了您的代码示例进行测试,它运行时没有错误,但控制台确实显示了情节?您的示例中是否缺少任何代码?仅供参考:我使用了 source("tests.R"),其中 tests.R 包含您的代码示例。
  • 如果你使用soruce,你需要将ggplotbarchart的调用包装在print()中,例如:print(ggplot(d2, aes(x=Topic, y=Value, fill=Variable)) + geom_bar(stat='identity', position='dodge') + facet_wrap(~Project))
  • 最后一件事,有没有办法在绘图表中包含图例(条形颜色信息)。因为我有 15 个条形图(3X5)并且绘图表的最后一个单元格将为空,我想通过在该单元格中添加图例(条形图颜色)来利用它,而不是在顶部绘制图例图表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多