R语言ggplot2搭配ggnewscale绘图时如何将自定义图例拆分为多列
问题根因
ggnewscale会为每一轮新增的shape、linetype映射创建独立的scale,你原先的guides(scale_shape_manual=guide_legend(ncol=2))写法无效,一是scale_shape_manual不是scale的标准调用名,二是该写法只能匹配单个默认scale,无法覆盖ggnewscale生成的所有独立scale。
解决方案
方法一:全局批量调整(推荐,无需修改原有绘图逻辑)
直接在生成的my_plot后追加以下代码即可实现所有图例分2列排布:
my_plot + # 控制所有独立图例整体分为2列排列 theme(legend.box.ncol = 2) + # 批量设置所有shape/linetype图例的内部展示列数为1,可按需调整 guides(shape = guide_legend(ncol = 1), linetype = guide_legend(ncol = 1))
方法二:修改scale定义逻辑
在你自定义的layer_geom_scale函数中,为每个scale提前指定guide参数,后续仅需调整全局布局即可:
layer_geom_scale <- function(Cell.type) { list(geom_point(mean_mutated[[Cell.type]], mapping = aes(shape = Reagent)), geom_line(mean_mutated[[Cell.type]], mapping = aes(group = Reagent, linetype = Reagent)), scale_linetype_manual(name = Cell.type, values = c("solid", "dashed", "dotted"), drop=FALSE, guide = guide_legend(ncol = 1)), scale_shape_manual(name = Cell.type, values = c(15, 16, 4), labels = c("0", "1", "2"), drop=FALSE, guide = guide_legend(ncol = 1)) ) }
绘图完成后添加全局布局设置:
my_plot + theme(legend.box.ncol = 2)
参数说明
guide_legend(ncol = 1):控制每个Cell.type对应小图例的内部展示列数,如果你需要每个小图例内的3个Reagent水平排列,可将该值改为3。theme(legend.box.ncol = 2):控制所有独立小图例的整体排布列数,调整为2即可实现你需要的两列并排效果。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

