我使用 Rmarkdown,我正在使用 ggarrange 创建许多由不同 ggplot2 图表组成的图形。问题是我无法为单个块内的数字设置不同的大小。我设法设置图形大小的唯一方法是在块选项中,例如:
{r 图 1,图高度 = 4,图宽度 = 7}
有没有办法在每个 ggplot() 或 ggarrange() 函数中设置绘图/网格大小?
详细信息、数据和代码:
我所有的主图都具有相同大小的网格区域,但最终图形的大小会根据它们包含的主图的数量而变化。此外,出于注释目的(例如使用 annotation_figures() 函数),第一行中的图表必须具有较大的顶部边距(用于标题),而最后一行中的图表必须具有较大的底部边距(用于标题)。额外的边距,为标题和说明(例如文本格罗布)腾出空间不应改变绘图网格大小,我希望图形中的所有绘图都相同。
我有一个名为“A1”的数据框示例:
library("pacman")
p_load(ggplot2, ggpubr, hrbrthemes, tidyverse)
year <- rep(seq(2010,2019, 1), each=3)
name <- rep(c("A", "B", "C"), times=10)
n1 <- c(0,0,1,0,2,1,1,1,1,2,0,2,0,2,1,3,2,0,1,4,2,2,9,4,8,11,8,7,9,8)
n2 <- c(7,3,1,14,1,1, 15,4,4,19,9,4,26,9,4,46,4,3,52,12,3,37,12,5,45,10,5,47,18,4)
name2 <- name
A1 <-data.frame(year,name,n1,n2,name2)
Run Code Online (Sandbox Code Playgroud)
使用这个数据框,我在一个块中构建了第一行图,规格为 {fig.height = 4.3, fig.width = 7}。此绘图行包含三个绘图(使用 facet_wrap 制作)和 0.3 英寸的顶部边距,以便为最终图中的标题注释腾出空间,并且没有底部边距。该绘图行也有自己的标题,其作用类似于最终图中的副标题或标签。
AA.1 <- A1 %>%
ggplot( aes(x=year, y=n1)) +
geom_line( data=A1 %>% dplyr::select(-name), aes(group=name2), color="grey", size=1.0, alpha=0.6) +
geom_line( aes(color=name), color="black", size=1.5 ) +
theme_ipsum() +
theme(
axis.text.x = element_text(size=12, angle=45),
axis.text.y = element_text(size=12),
legend.position="none",
plot.title = element_text(size=16),
panel.grid = element_blank(),
plot.margin = unit(c(0.3, 0.2, 0, 0.2), "in")) + #Top row charts have a 0.3 top margin
labs(title="A. TAK") +
scale_x_continuous(name ="",
limits=c(2010,2019),
breaks=c(seq(2010,2019,2)))+
scale_y_continuous(name ="",
limits=c(0,12),
breaks=c(seq(0,12,3)))+
facet_wrap(~name) +
theme(strip.text = element_text(size=13))
AA.1
Run Code Online (Sandbox Code Playgroud)
然后我在另一个块内创建底部行图,具有不同的图形高度规范:{fig.height = 4.1, fig.width = 7}。这一行也由三个图组成,它们在所有美学方面都应该与第一行相似,尽管我正在绘制一个不同的变量,具有不同的值(参考)。该行没有上边距和 0.1 英寸的下边距,以便为字幕腾出空间。
AA.2 <- A1 %>%
ggplot( aes(x=year, y=n2)) +
geom_line( data=A1 %>% dplyr::select(-name), aes(group=name2), color="grey", size=1.0, alpha=0.6) +
geom_line( aes(color=name), color="black", size=1.5 )+
theme_ipsum() +
theme(
axis.text.x = element_text(size=12, angle=45),
axis.text.y = element_text(size=12),
legend.position="none",
plot.title = element_text(size=16),
panel.grid = element_blank(),
plot.margin = unit(c(0, 0.2, 0.1, 0.2), "in")) + #Margins are different
ggtitle("B. REF") +
scale_x_continuous(name ="",
limits=c(2010,2019),
breaks=c(seq(2010,2019,2)))+
scale_y_continuous(name ="",
limits=c(0,60),
breaks=c(seq(0,60,10)))+
facet_wrap(~name) +
theme(strip.text = element_text(size=13))
AA.2
Run Code Online (Sandbox Code Playgroud)
最后,我使用 ggarange() 在一个图中排列两组图,并使用 annotate_figure() 编写最终的标题和说明。在这个块中,我将总 fig.height 设置为 8.4(前两个块的总和)。
figureA1 <- ggarrange(AA.1, AA.2,
ncol=1, nrow=2,
heights=c(1,1))
annotate_figure(
figureA1,
top = text_grob("Figura A.1 - TAK & REF",
color = "black", face = "bold", size = 18),
bottom = text_grob("Source: My.Data (2020)", face="italic", color = "black",
hjust = 1, x = 1, size = 12),)
Run Code Online (Sandbox Code Playgroud)
可能的解决方案:
我希望每个地块的总地块网格面积为 4 英寸。由于第一个图的顶部边距为 0.3,底部边距为 0,因此我将 fig.height 设置为 4.3。由于第二个图的上边距为 0,下边距为 0.1,因此我将 fig.height 设置为 0.1。但是,两个图中的绘图网格区域的大小似乎不同。有想法该怎么解决这个吗?
由于每个图的 fig.height 参数都不同,因此我需要将代码拆分以将图构建为不同的块。我有许多以类似方式制作的图形,因此,我想编写一个函数来在图形中构建和排列绘图。但是,我无法跨不同的块编写函数。
对于第二个问题,我想到了两种可能的解决方案:
任何人都知道我该怎么做?
也许第二个会更好。我试图将 ggarrange 中行的高度设置为相同,使用高度参数(“heights=c(1,1)”)。还试图使它们与每个 fig.height 成比例(“heights=c(5.3/5.1,1)”),但第二个绘图行网格看起来仍然比第一个高。