使用grid.arrange和ggplot调整图例大小的问题

时间:2017-09-29 21:29:59

标签: r ggplot2

我正在尝试使用ggplot2创建一个多面板图(使用grid.extraegg包)。其中两个图是箱形图,第三个图是geom_count。像:

f <- ggplot(mpg, aes(drv, cty)) + geom_boxplot()

f2 <- ggplot(mpg, aes(drv, hwy)) + geom_boxplot()

f3 <- ggplot(mpg, aes(drv, class)) + 
      geom_count() + scale_size_area(max_size = 15)

当我尝试使用以下方式安排它们时:

b <- grid.arrange(grobs = lapply(
  list(f, f2, f3),
  set_panel_size,
  width = unit(2, "in"),
  height = unit(2, "in")
), ncol=3)

第三个图(germ_count图)的图例最终与图本身一样大(并且比f3自身绘制时大得多)。当我使用以下文件保存文件时

ggsave(filename = dumb.tif, plot = b, width = 7.25, height = 4 )

这些图最终会以一种看起来不像他们在RStudio图窗口中那样的方式重叠。

3 个答案:

答案 0 :(得分:2)

首先,您的图例大小取决于geom_count的磅值,这些点大小是绝对的。因此,通过一个小的(2&#34;情节),你的传奇将会非常大。您可以通过调整max_size中的scale_size_area来解决这个问题,或者只是让您的绘图更大,以使相对绘图尺寸更小。

其次,set_panel_size设置面板(绘图区域)大小,但是当您包含轴,文本,图例等时,实际绘图会更大。因此,2&#34;当你试图将它们塞入7.25&#34;广泛的领域。还有f3,有2&#34;面板,将更广泛,因为它包括一个传奇。但是,当您使用ncol = 3时,grid.arrange调用默认使所有绘图的宽度相同。您需要使用widths使列的宽度不同。

全部放在一起:

library(ggplot2)
library(grid.extra)
library(egg)

f <- ggplot(mpg, aes(drv, cty)) + geom_boxplot()

f2 <- ggplot(mpg, aes(drv, hwy)) + geom_boxplot()

f3 <- ggplot(mpg, aes(drv, class)) + 
    geom_count() + scale_size_area(max_size = 15)

b <- grid.arrange(grobs = lapply(
    list(f, f2, f3),
    set_panel_size,
    width = unit(3, "in"),
    height = unit(3, "in")
), widths =c(2,2,3), ncol=3)

ggsave(filename = "dumb.png", plot = b, width = 12, height = 4)

enter image description here

答案 1 :(得分:2)

egg::ggarrange()目前存在宽度和高度问题(疏忽,我只测试了相对宽度/高度的情况,网格单元总是欺骗我这种或那种方式)。使用dev版本,你可以做到,

library(egg)
g <- ggarrange(f, f2, f3, nrow=1, 
               widths = rep(unit(2,"in"), 3), 
               heights = unit(2,"in"))

margin <- unit(1,"line")
ggsave('dumb.pdf', plot=g, 
       width = grid::convertWidth(sum(g$widths) + margin, 
                                  unitTo = "in", valueOnly = TRUE),
       height = grid::convertHeight(sum(g$heights) + margin,  
                                    unitTo = "in", valueOnly = TRUE))

enter image description here

传奇的大小是绝对的;这是ggplot2中的设计选择。您可以调整主题中的一些参数,以使间距和边距更小。

答案 2 :(得分:-1)

以这种方式尝试:

combined_plot <- arrangeGrob(p1, p2, p3, widths = c(2,2,3), heights = c(2,2,2), ncol = 3)

ggsave(filename = combined.png, plot = combined_plot, width = 7.25, height = 4 )

arrange.grob()不进行任何对象分配。 arrangeGrob()可以,因此您可以ggsave()输出对象。无需lapply()widths作为向量而不是整体宽度给出。将它们视为一组比例宽度。可以使用ggsave()设置整体绘图宽度/高度。