[英]Problems with legend resizing with grid.arrange and ggplot
我正在嘗試用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
圖)的germ_count
最終與圖本身一樣大(並且比f3自身繪制時大得多)。 當我使用以下方法保存文件時:
ggsave(filename = dumb.tif, plot = b, width = 7.25, height = 4 )
這些圖最終會以一種看起來不像他們在RStudio圖窗口中那樣的方式重疊。
首先,您的圖例大小由geom_count
值決定,這些點大小是絕對的。 因此,使用較小的(2“圖),您的圖例將會非常大。您可以通過調整scale_size_area
max_size
來解決此scale_size_area
,或者只是使圖更大,以使相對繪圖尺寸更小。
其次, set_panel_size
設置面板 (繪圖區域)大小,但是當您包含軸,文本,圖例等時,實際繪圖會更大。因此,當您嘗試將它們塞入7.25“寬區域時,2”面板會導致重疊的圖形。 另外f3
,帶有2“面板,因為它包含一個圖例,所以會更寬。但是當你使用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)
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中的設計選擇。 您可以調整主題中的一些參數以使間距和一些邊距更小。
試試這樣:
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()
設置總圖寬度/高度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.