我与Rmarkdown一起工作,并且正在使用ggarrange创建许多由不同的ggplot2图表组成的图形。问题是我无法为单个块内的图形设置不同的大小。我设法设置图形大小的唯一方法是在块选项中,例如:
{r图1,图高度= 4,图宽度= 7}
是否可以在每个ggplot()或ggarrange()函数中设置图/网格大小?
详细信息,数据和代码:
我所有的主图都具有相同的网格区域大小,但是最终图形的大小会根据它们所包含的主图的数量而变化。此外,出于注释目的(例如,使用notification_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)
使用此数据框,我在规格为{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
然后,我在另一个块中创建底行图,并使用不同的图形高度规范:{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
最后,我使用ggarange()安排了两组绘图,并使用annotate_figure()编写了最终标题和标题。在此块中,我将图的总高度设置为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),)
可能的解决方案:
我希望每个地块的总地块网格面积为4英寸。由于第一幅图的上边距为0.3,下边距为0,因此将图高度设置为4.3。由于第二个图的上边距为0,下边距为0.1,因此将图高度设置为0.1。但是,在两个图中,绘图网格面积似乎并不相同。有关如何解决此问题的任何想法?
由于每个绘图的fig.height参数是不同的,因此我需要将代码拆分以将图形构建为不同的块。我有许多以类似方式制作的图形,因此,我想编写一个函数来在图形中构建和布置图形。但是,我无法跨不同的块编写函数。
我想为第二个问题提供两种可能的解决方案:
任何人都知道我该怎么做?
也许第二个会更好。我试图将ggarrange中行的高度设置为相同,并带有heights参数(“ heights = c(1,1)”)。还尝试使它们与每个fig.height(“ heights = c(5.3 / 5.1,1)”)成正比,但第二个绘图行网格看起来仍然比第一个高。