r - 使用 ggplot 和 gtable 对齐多个图
问题描述
我已经创建了两个图ggplot2
,我想同时使用gtable
. 我有两个问题。首先是我希望面板大小在两个图中匹配。我已经使用gtable
. 第二个问题是我希望第一个图的宽度是第二个图的三倍。bind()
在使用ggtable
.
下面提供了可重现的代码。
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 宽三倍。我还想在两者之上添加一个标题,我已经在提供的代码中完成了。
解决方案
使用egg
包和ggarrange
功能,您可以使用一行代码完成所有操作:
egg::ggarrange(plot1, plot2, ncol = 2, top = "foo", widths = c(3, 1))
推荐阅读
- flutter - Flutter Web 不滚动
- amazon-web-services - AWS Lambda:有没有一种方法可以让我在执行时观看函数打印的实时日志
- python-3.x - 为什么合并后附加列不起作用?
- java - 更新电子邮件在 Auth Firebase 中不起作用
- postgresql - 使用数字参数的动态查询中的表名替换
- neo4j - 在 Neo4j 中导入 csv 文件?
- c# - 在 .NET CORE 3.1 中打开 Excel 文件,编辑并另存为流
- python - 在python中使用迭代器范围进行迭代
- javascript - 从 html 谷歌应用脚本的表格范围中排除列
- git - 如何仅将 PR 中的差异合并到不同的分支?