我正在尝试使用ggplot2
创建一个多面板图(使用grid.extra
和egg
包)。其中两个图是箱形图,第三个图是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图窗口中那样的方式重叠。
答案 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)
答案 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))
传奇的大小是绝对的;这是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()
设置整体绘图宽度/高度。