如何将ggplot图例的颜色标签移至右侧对应图片下方?
问题与解决方案
问题描述
现有代码生成左侧散点图、右侧竖排图片的排版效果,希望将散点图中的分组颜色标签(如Frink1/Frink2/Frink3)移至右侧对应图片的下方,且方案需支持更多分组的场景。
修改后的实现代码
#### Load Libraries #### library(tidyverse) library(ggpubr) library(magick) library(ggtext) # 用于生成带颜色的文本标签 #### 定义分组配置(支持任意数量分组) #### group_config <- tibble( group_name = c("Frink1", "Frink2", "Frink3"), group_color = c("lightblue", "steelblue", "navyblue"), # 对应原数据的分组值,这里匹配iris的三个物种 data_group = unique(iris$Species) ) #### Create Main Plot(移除图例) #### main <- iris %>% ggplot(aes(x=Petal.Width, y=Petal.Length, color=Species))+ geom_point()+ geom_smooth(method = "lm")+ theme(legend.position = "none")+ # 移除原有图例,避免重复 labs(x="Frink Width", y="Frink Height")+ scale_color_manual( breaks = group_config$data_group, values = group_config$group_color ) main #### Import Image #### imp <- image_read("https://jeroen.github.io/images/frink.png") #### 批量生成图片+对应颜色标签的组合图 #### create_img_with_label <- function(name, color) { # 生成图片层 img_plot <- image_ggplot(imp) # 生成带颜色的标签文本层 label_plot <- ggplot() + geom_textbox( aes(label = paste0("<span style='color:", color, "'>", name, "</span>")), size = 5, box.color = NA, fill = NA ) + theme_void() # 合并图片和标签 ggarrange(img_plot, label_plot, ncol = 1, heights = c(4, 1)) } # 循环生成所有分组的图片-标签组合 img_label_plots <- pmap(group_config, create_img_with_label) #### 排列右侧所有图片-标签组合 #### ps <- ggarrange(plotlist = img_label_plots, ncol = 1) #### 合并主图和右侧组合 #### final_plot <- ggarrange(main, ps, widths = c(2, 1)) final_plot
关键实现说明
- 移除主图图例:通过
theme(legend.position = "none")去掉原散点图的图例,避免和右侧标签重复 - 批量生成组合图:用
pmap配合自定义函数create_img_with_label,自动为每个分组生成“图片+对应颜色标签”的组合,新增分组只需在group_config中添加条目即可 - 带颜色的标签:借助
ggtext包的geom_textbox,生成对应分组颜色的文本标签,保证和散点图颜色一致 - 灵活排版:通过
ggarrange的widths参数调整主图和右侧区域的宽度比例,适配不同场景
内容的提问来源于stack exchange,提问作者Shawn Hemelstrand
相关产品推荐
相关产品推荐

