如何在ggplot或ggarrange中设置绘图大小?

时间:2020-04-14 02:06:09

标签: r ggplot2 ggpubr

我与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),)

可能的解决方案:

  1. 我希望每个地块的总地块网格面积为4英寸。由于第一幅图的上边距为0.3,下边距为0,因此将图高度设置为4.3。由于第二个图的上边距为0,下边距为0.1,因此将图高度设置为0.1。但是,在两个图中,绘图网格面积似乎并不相同。有关如何解决此问题的任何想法?

  2. 由于每个绘图的fig.height参数是不同的,因此我需要将代码拆分以将图形构建为不同的块。我有许多以类似方式制作的图形,因此,我想编写一个函数来在图形中构建和布置图形。但是,我无法跨不同的块编写函数。

我想为第二个问题提供两种可能的解决方案:

  1. 以某种方式在ggplot函数中设置网格图大小(或总图面积);或
  2. 以某种方式在ggarrange函数中设置每个网格图的大小;

任何人都知道我该怎么做?

也许第二个会更好。我试图将ggarrange中行的高度设置为相同,并带有heights参数(“ heights = c(1,1)”)。还尝试使它们与每个fig.height(“ heights = c(5.3 / 5.1,1)”)成正比,但第二个绘图行网格看起来仍然比第一个高。

FigureA1 - heights=c(5.3/5.1,1

0 个答案:

没有答案
相关问题