R patchwork设置相同绘图区域时图表宽度不一致问题
问题原因
宽度异常是额外添加的guide_area()导致的:你自定义的areas排版布局仅为11个ggplot图表分配了网格空间,没有给guide_area()预留对应占位。patchwork在渲染时会自动为这个额外的图例元素寻找布局空位,默认挤占第一行最右侧的网格宽度,直接把右上角图表的绘图区域压窄,和你手动定义的区域尺寸产生偏差。
你用plot(areas)查看预设布局时能看到,第一行三个图表本应均分整行宽度,第二到第五行的左右、中间预留的空白列在没有额外元素时会被自动压缩为0宽度,不会影响图表尺寸,但加入未指定位置的guide_area()后,空白列被撑开,相邻图表宽度就会被挤压。
解决方案
根据你是否需要保留全局图例区,选对应方案即可:
- 不需要单独全局图例:直接删除
guide_area()调用即可,所有图表会严格按照你定义的尺寸渲染library(tidyverse) library(patchwork) create_plot <- function(x=NA){ tibble(name = sample(letters[1:5], 50, replace=T), value = sample(letters[6:10], 50, replace=T) ) %>% count(name, value) %>% ggplot(aes(x=name, y=n, fill=value))+ geom_col(show.legend = F) } areas <- c( #top left bottom right area(1,1,1,4), area(1,5,1,8), area(1,9,1,12), area(2,2,2,5), area(2,8,2,11), area(3,2,3,5), area(3,8,3,11), area(4,2,4,5), area(4,8,4,11), area(5,2,5,5), area(5,8,5,11) ) map(1:11, create_plot) %>% wrap_plots() + plot_layout(design = areas) - 需要保留单独全局图例:修改排版布局,为
guide_area()预留专属占位,同时开启图例收集参数
比如把右侧整列空出来放图例,调整后的布局代码如下:
如果用网格字符串方式定义布局,对应写法如下:# 用area方式定义,给图例留第1行到第5行第12列的区域 areas <- c( area(1,1,1,4), area(1,5,1,8), area(1,9,1,11), area(2,2,2,5), area(2,8,2,10), area(3,2,3,5), area(3,8,3,10), area(4,2,4,5), area(4,8,4,10), area(5,2,5,5), area(5,8,5,10), area(1,12,5,12) # 最后一个区域留给guide_area ) map(1:11, ~create_plot(.x) + geom_col(show.legend = T)) %>% # 开启图例显示才能收集 wrap_plots() + guide_area() + plot_layout(design = areas, guides = "collect") # 收集所有图例到预留的guide区域
其中G对应的区域就是图例专属位置,不会再挤占其他图表的宽度。areas <- " AAAABBBBCCC#G #DDDD##EEEE#G #FFFF##GGGG#G #HHHH##IIII#G #JJJJ##KKKK#G "
内容的提问来源于stack exchange,提问作者Josep Pueyo
相关产品推荐
相关产品推荐

