R 左对齐两条图形边(ggplot)

R 左对齐两条图形边(ggplot),r,ggplot2,gridextra,gtable,R,Ggplot2,Gridextra,Gtable,我使用的是ggplot,有两个图形,我想显示在彼此的顶部。我使用了网格。从gridExtra中排列以堆叠它们。问题是我希望图形的左边缘与右边缘对齐,而不考虑轴标签。(出现问题的原因是一个图的标签短,而另一个图的标签长) 问题: 我该怎么做?我没有嫁给grid.arrange,但ggplot2是必须的 我所尝试的: 我尝试使用宽度和高度以及ncol和nrow制作一个2 x 2的网格,将视觉效果放在相对的角落,然后使用宽度,但我无法在相对的角落获得视觉效果 require(ggplot2);requ

我使用的是ggplot,有两个图形,我想显示在彼此的顶部。我使用了
网格。从gridExtra中排列
以堆叠它们。问题是我希望图形的左边缘与右边缘对齐,而不考虑轴标签。(出现问题的原因是一个图的标签短,而另一个图的标签长)

问题:
我该怎么做?我没有嫁给grid.arrange,但ggplot2是必须的

我所尝试的:
我尝试使用宽度和高度以及ncol和nrow制作一个2 x 2的网格,将视觉效果放在相对的角落,然后使用宽度,但我无法在相对的角落获得视觉效果

require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() 
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() 
grid.arrange(A, B, ncol=1)
require(ggplot2);需要(额外)

A充其量这是一种黑客行为:

library(wq)
layOut(list(A, 1, 2:16),  list(B, 2:3, 1:16))
但是感觉真的不对。

试试这个

 gA <- ggplotGrob(A)
 gB <- ggplotGrob(B)
 maxWidth = grid::unit.pmax(gA$widths[2:5], gB$widths[2:5])
 gA$widths[2:5] <- as.list(maxWidth)
 gB$widths[2:5] <- as.list(maxWidth)
 grid.arrange(gA, gB, ncol=1)

以下是另一种可能的解决方案,使用重塑2包装中的
melt
facet\u wrap

library(ggplot2)
library(reshape2)

dat = CO2[, c(1, 2)]
dat$id = seq(nrow(dat))
mdat = melt(dat, id.vars="id")

head(mdat)
#   id variable value
# 1  1    Plant   Qn1
# 2  2    Plant   Qn1
# 3  3    Plant   Qn1
# 4  4    Plant   Qn1
# 5  5    Plant   Qn1
# 6  6    Plant   Qn1

plot_1 = ggplot(mdat, aes(x=value)) + 
         geom_bar() + 
         coord_flip() +
         facet_wrap(~ variable, nrow=2, scales="free", drop=TRUE)

ggsave(plot=plot_1, filename="plot_1.png", height=4, width=6)

我想将其推广到任意数量的绘图中。以下是使用巴蒂斯特方法的逐步解决方案:

plots <- list(A, B, C, D)
grobs <- list()
widths <- list()
On是一个非常简单的解决方案(最后一项) 适用于此问题:

require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() 
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() 
grid.draw(rbind(ggplotGrob(A), ggplotGrob(B), size="first"))
require(ggplot2);需要(额外)
A使用软件包:


Aegg
软件包将ggplot对象包装到标准化的
3x3
gtable中,允许在任意ggplot之间对齐绘图面板,包括分面绘图

library(egg) # devtools::install_github('baptiste/egg')
library(ggplot2)

p1 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
  geom_point() 

p2 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
  geom_point() + facet_wrap( ~ cyl, ncol=2, scales = "free") +
  guides(colour="none") +
  theme()

ggarrange(p1, p2)
library(egg)#devtools::install_github('baptiste/egg'))
图书馆(GG2)

p1我知道这是一篇老文章,已经有人回答了,但是我可以建议将@baptiste的方法与
purr
结合起来,让它看起来更好看:

library(purrr)
list(A, B) %>% 
  map(ggplotGrob) %>% 
  do.call(gridExtra::gtable_rbind, .) %>% 
  grid::grid.draw()
默认情况下,包会处理此问题:

库(ggplot2)
图书馆(拼凑)

A这里有两个可能的选项:和。@Joran我正在寻找要对齐的左轴。我不认为这些会起作用。但我想我错了。这个解决方案假设每列中的行数相等。在我的MRWE中,这是正确的,但在现实中不是。我不确定我是否理解:你的意思是CO2$植物和CO2$类型恰好是相同的长度,但你的实际数据不是这样的吗?这是两个不同的数据集,共享一个变量,所以行数不一样。非常漂亮,非常简单。谢谢你的解决方案。完美的解决方案!我一直在寻找类似这样的东西来对齐多个独立的时间序列图,因为每个图中都有大量的定制,所以我无法使用刻面。如果我们有两列,您能提供匹配高度的方法吗?gA$heights[2:3]似乎不起作用。我必须选择2:3以外的其他元素吗?非常感谢。谢谢你的解决方案,巴蒂斯特。但是,当其中一个绘图是
表格GROB
时,我无法实现这一点。
gtable::cbind
给了我一个令人失望的错误:
nrow(x)==nrow(y)不是真的
。有什么建议吗?这个解决方案对我很有效,我正在努力理解它。
[2:5]
代表什么?使用
size=“first”
意味着,如果第二个绘图大于第一个绘图,即使绘图具有不同宽度的图例,对齐效果也不会很好-非常好!对我来说,这可以正确地水平排列底部带有图例的简单热图(
geom_tile
)和带有
geom_tile
的多方面热图(
facet_grid
),但未能对齐第三个图的高度,这是一个树状图(
geom_segment
)。但是,cowplot或
gridExtra::grid.arrange
甚至不能执行前者,因此这是迄今为止效果最好的
for (i in 1:length(grobs)){
     grobs[[i]]$widths[2:5] <- as.list(maxwidth)
}
do.call("grid.arrange", c(grobs, ncol = 1))
require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() 
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() 
grid.draw(rbind(ggplotGrob(A), ggplotGrob(B), size="first"))
require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() 
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() 
C <- ggplot(CO2, aes(x=conc)) + geom_bar() +coord_flip()
D <- ggplot(CO2, aes(x=uptake)) + geom_bar() +coord_flip() 
grid.draw(cbind(
            rbind(ggplotGrob(A), ggplotGrob(B), size="first"),
            rbind(ggplotGrob(C), ggplotGrob(D), size="first"),
            size='first'))
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() 
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() 

library(cowplot)
plot_grid(A, B, ncol=1, align="v")
library(egg) # devtools::install_github('baptiste/egg')
library(ggplot2)

p1 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
  geom_point() 

p2 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
  geom_point() + facet_wrap( ~ cyl, ncol=2, scales = "free") +
  guides(colour="none") +
  theme()

ggarrange(p1, p2)
library(purrr)
list(A, B) %>% 
  map(ggplotGrob) %>% 
  do.call(gridExtra::gtable_rbind, .) %>% 
  grid::grid.draw()