【问题标题】:Combine plots with grid.arrange and adjust plot size and axis label将绘图与 grid.arrange 结合并调整绘图大小和轴标签
【发布时间】:2015-07-16 12:40:09
【问题描述】:

我想将两个ggplotsgrid.arrange 结合起来,只有一个一般图例。我设法用一个小技巧将这两个图例结合起来,但由于我从第一个情节中删除了图例,所以这个在grid.arrange 之后当然更广泛。如何使两个绘图区域的大小相同?而且我还希望在两个图下方居中放置一个共同的 x 轴标签。 grid.arrange 有可能吗?我知道,之前已经回答过类似的问题,但我还是 R 的新手,解决方案太复杂,或者我无法将它们与我的数据相匹配。

这是我的两个数据集:

testxy
  SN strain     est     low      up
1  A     xy 11.6751 11.1480 12.2021
2  B     xy 11.4211 11.1108 11.7314
3  C     xy  2.6603  2.4291  2.8915
4  D     xy  4.5503  4.2972  4.8034

testyz
  SN strain     est     low      up
5  A     yz 22.1761 21.5136 22.8387
6  C     yz 21.4829 21.0251 21.9408
7  B     yz 19.3294 18.8950 19.7639
8  D     yz 19.9990 19.3934 20.6047

这是我到目前为止的代码。它接近我想要的,但只是接近:

p1<-ggplot(data=testxy, aes(colour=strain, x=SN, y=est))+
theme(panel.background = element_rect(fill = 'white', colour = 'black'))+
theme(legend.position="none")+
theme(axis.title.x = element_text(size = rel(1.5), vjust=-0.1), 
axis.title.y = element_text(size = rel(1.5), vjust=1), axis.text.y = element_text(size = rel(1.4)), axis.text.x = element_text(hjust = 1, size = rel(1.5)),plot.title = element_text(size = rel(2.5), lineheight=1, face="bold"))+
      theme(plot.margin=unit(c(5,5,5,5),"mm"))+
      labs(x="treatment", y="integral", title="xy")+
      scale_colour_manual(name="strain", values=c(xy="blue"))+
      theme(strip.text.x = element_text(size=12, face="bold"), strip.background = element_rect(colour="black", fill="white"))+
      geom_point(aes(color="xy"), size=5, alpha=0.1, shape=16)+
      geom_errorbar(aes(ymin=low, ymax=up, width=0.2), colour="deepskyblue", size=0.8)+
      scale_y_continuous(breaks=seq(5,20,5), limits=c(2,23.5))

p2<-ggplot(data=testyz, aes(colour=strain, x=SN, y=est))+
  theme(panel.background = element_rect(fill = 'white', colour = 'black'))+
  theme(legend.position="right")+
  theme(axis.title.x = element_text(size = rel(1.5), vjust=-0.1), axis.ticks.y = element_blank(), axis.text.y = element_blank(), axis.text.x = element_text(hjust = 1, size = rel(1.5)), plot.title = element_text(size = rel(2.5), lineheight=1, face="bold"))+
  theme(plot.margin=unit(c(5,5,5,5),"mm"))+
  labs(x="treatment", y=NULL, title="yz")+
  scale_colour_manual(name="strain", values=c(yz="green", xy="blue"))+
  theme(strip.text.x = element_text(size=12, face="bold"), strip.background = element_rect(colour="black", fill="white"))+
  geom_point(aes(color="yz"), size=5, alpha=0.1, shape=16)+
  geom_point(aes(color="xy"), size=0)+
  geom_errorbar(aes(ymin=low, ymax=up, width=0.2), colour="green", size=0.8)+
  scale_y_continuous(breaks=seq(5,20,5), limits=c(2,23.5))+
  scale_x_discrete(limits=c("A", "C", "B", "D"))

grid.arrange(p1,p2, ncol=2)

我之前尝试过刻面。它看起来确实不错,但不幸的是,我需要更改 x 轴上 levels 的顺序。所以,我认为分面对我不起作用。

我希望你能帮助我。

干杯 安妮

【问题讨论】:

  • 如果您将 dput 与您的数据一起使用,我可以更轻松地在我自己的 R 中进行实验(如果您在打印数据的同时还这样做;我们既可以轻松阅读也可以轻松进行实验)。我不确定为什么使用刻面不起作用;这似乎是正确的解决方案。
  • 安妮,欢迎来到 SO,第一篇文章很好!
  • Rolnd,谢谢你的链接。我以前看过这个答案。但是代码将我的图堆叠在一起,我不知道如何将其更改为水平。我真的不明白这段代码在做什么。有没有更简单的方法?这似乎是一个基本的问题。
  • 能否请您澄清一下“[facetting] 看起来非常好,但不幸的是,我需要更改 x 轴上级别的顺序。所以,我认为 facetting 不起作用为了我”。 “有没有更简单的方法?”。是的,那将是刻面。它将为您提供“一个一般图例”、“绘制相同大小的区域”、“一个位于两个图下方的公共 x 轴标签”。

标签: r ggplot2 axis legend


【解决方案1】:

你应该使用分面:

testxy <- read.table(text = "  SN strain     est     low      up
1  A     xy 11.6751 11.1480 12.2021
2  B     xy 11.4211 11.1108 11.7314
3  C     xy  2.6603  2.4291  2.8915
4  D     xy  4.5503  4.2972  4.8034", header = TRUE)

testyz <- read.table(text = "   SN strain     est     low      up
5  A     yz 22.1761 21.5136 22.8387
6  C     yz 21.4829 21.0251 21.9408
7  B     yz 19.3294 18.8950 19.7639
8  D     yz 19.9990 19.3934 20.6047", header = TRUE)

test <- rbind(cbind(testxy, fac = "xy"),
              cbind(testyz, fac = "yz"))


test$SN1 <- interaction(test$SN, test$fac)
test$SN1 <- ordered(test$SN1, levels = test$SN1)


ggplot(data=test, aes(colour=strain, x=SN1, y=est)) +
  geom_point() + 
  facet_wrap(~ fac, scales = "free_x") +
  scale_x_discrete(labels = setNames(as.character(test$SN), as.character(test$SN1))) 

然而,这不是一个好的情节,因为读者通常不会注意到 x 轴是不同的。

【讨论】:

  • 谢谢罗兰!它现在起作用了。这个解决方案很棒:-)
【解决方案2】:

如果刻面的唯一问题是级别的顺序,则可以通过在调用 ggplot2 之前重新排序因子变量来解决。

转换为因子时可以指定因子的水平顺序。

df = rbind(testxy, testyz)
df$strain <- factor(as.character(df$strain), levels=c('yz','xy'))
ggplot(df, aes(colour=strain, x=SN, y=est))+facet_grid(.~strain)

【讨论】:

  • 感谢您的回答。不幸的是,这不是解决方案。 x 轴上的处理顺序需要不同。对于“testxy”,这需要是 A、B、C、D,对于“testyz”,它是 A、C、B、D。我已经在数据框中更改了顺序,但 ggplot 在两个图中按字母顺序将其排序为 A、B、C、D。
  • 如果您的 SN 确实是 A、B、C 和 D,我必须强烈建议不要在相邻的 x 轴上交换两个索引,因为这会误导观众!如果 xy 中的 B 与 yz 中的 B 不同,则称它们为两个不同的事物(例如 Bx 和 By)。然后将因子的水平重新排序为 A、Bx、C、By、D,并尝试使用facet_grid(.~strain, scales='free_x') 强制 ggplot 重新训练每个方面的 x 尺度。
猜你喜欢
  • 2014-07-22
  • 1970-01-01
  • 2016-08-09
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多