首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ggplot和gtable对齐多个绘图

使用ggplot和gtable对齐多个绘图
EN

Stack Overflow用户
提问于 2019-03-01 02:27:17
回答 1查看 498关注 0票数 3

我已经用ggplot2创建了两个绘图,我想用gtable同时显示这两个绘图。我有两个问题。首先,我希望两个图的面板大小匹配。我已经使用gtable实现了这一点。第二个问题是,我希望第一个图的宽度是第二个图的三倍。在使用ggtable中的bind()函数匹配面板大小时,我似乎不知道如何做到这一点。

下面提供了可重现的代码。

代码语言:javascript
复制
library(ggplot2)
library(gtable)

set.seed(2345)

mean1 <- runif(8, 700, 1000)
low1 <- mean1 - 100
high1 <- mean1 + 100
names1 <- paste0("really long name", 1:length(mean1))
df1 <- data.frame(mean = mean1,
  low = low1,
  high = high1,
  names = names1)

mean2 <- runif(2, 700, 1000)
low2 <- mean2 - 100
high2 <- mean2 + 100
names2 <- paste0("name", 1:length(mean2))
df2 <- data.frame(mean = mean2,
  low = low2,
  high = high2,
  names = names2)

plot1 <- ggplot(df1, aes(x = names, y = mean)) + 
  geom_errorbar(aes(ymin = low, ymax = high), width = 0) +
  geom_point() +
  scale_y_continuous(limits = c(.95*min(df1$low), 1.05*max(df1$high))) +
  xlab("") + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

plot2 <- ggplot(df2, aes(x = names, y = mean)) + 
  geom_errorbar(aes(ymin = low, ymax = high), width = 0) +
  geom_point() +
  scale_y_continuous(limits = c(.95*min(df1$low), 1.05*max(df1$high))) +
  xlab("") + 
  theme(axis.text.x = element_text(angle = 0, hjust = .5))

grob1 <- ggplotGrob(plot1) #Convert to gtable 
grob2 <- ggplotGrob(plot2) #Convert to gtable

grob <- cbind(grob1, grob2, size = "first") #Bind rt data

title <- textGrob("Title", gp = gpar(fontsize = 12)) #Add title
grob <- gtable_add_rows(
  grob, #gtable object
  heights = grobHeight(title) + padding, #height for new row
  pos = 0 #0 adds on top
)
grob <- gtable_add_grob(
  grob, #gtable object
  title, #grob to be added
  t = 1, l = 1, r = ncol(sG) #top, left, and right (18) extent of grob
)

grid.newpage()
grid.draw(grob)

如您所见,面板大小匹配,但图1(左)和图2(右)的宽度相同。我想合并这两个,这样图1的宽度是图2的三倍。我还想在这两个图的上面添加一个标题,我已经在提供的代码中这样做了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-01 02:42:12

使用egg package ggarrange函数,只需一行代码即可完成所有操作:

代码语言:javascript
复制
egg::ggarrange(plot1, plot2, ncol = 2, top = "foo", widths = c(3, 1))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54932036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档