ggplot2中如何按Genome字段分组排列图例项
问题说明
使用如下代码绘制堆叠百分比柱状图:
ggplot(ViralReads, aes(x=Host, y=Reads, fill=Taxon)) + geom_col(colour = "black", position = "fill") + scale_y_continuous(labels = label_percent())+ theme_minimal()
数据集中每个Taxon(分类单元)都关联有对应的Genome(基因组类型)分类,需要将图例中的条目按照Genome类别进行分组展示,直接调整ggplot2原生图例参数无法实现该效果。
可复现问题的示例数据如下:
structure(list(Host = c("Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Culex", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Aedes", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Ochlerotatus", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia", "Coquillettidia"), Genome = c("(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "dsRNA", "dsRNA", "dsRNA", "ssDNA", "(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "dsRNA", "dsRNA", "dsRNA", "ssDNA", "(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "dsRNA", "dsRNA", "dsRNA", "ssDNA", "(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(-)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "(+)ssRNA", "dsRNA", "dsRNA", "dsRNA", "ssDNA"), Reads = c(102317, 163616, 6188, 130, 0, 0, 195632, 38928, 51823, 4033, 71500, 0, 0, 102317, 3953, 363, 52677, 62, 4033, 5183, 1542, 0, 4313, 1071, 36260, 0, 10089, 0, 0, 84154, 0, 814, 0, 82223, 281910, 60584, 1071, 8802, 0, 2203, 0, 0, 0, 622680, 0, 2229, 0, 0, 0, 550, 0, 0, 1445303, 0, 0, 0, 960293, 16515, 470781, 0, 0, 701, 0, 0, 0, 0, 0, 0, 0, 352, 0, 0, 0, 0, 1186, 138498, 200, 0, 197, 2640, 0, 0, 352, 0, 0, 0, 0, 197, 0, 3752, 0, 10899), Taxon = c("Orthomyxoviridae", "Rhabdoviridae", "Peribunyaviridae", "Chuviridae", "Phasmaviridae", "Phenuiviridae", "Iflaviridae", "Luteoviridae", "Tombusviridae", "Nodaviridae", "Unclassified Picornavirales", "Negevirus", "Tymoviridae", "Virgaviridae", "Dicistroviridae", "Totiviridae", "Flaviviridae", "Narnaviridae", "Nodaviridae", "Partitiviridae", "Birnaviridae", "Reoviridae", "Parvoviridae", "Orthomyxoviridae", "Rhabdoviridae", "Peribunyaviridae", "Chuviridae", "Phasmaviridae", "Phenuiviridae", "Iflaviridae", "Luteoviridae", "Tombusviridae", "Nodaviridae", "Unclassified Picornavirales", "Negevirus", "Tymoviridae", "Virgaviridae", "Dicistroviridae", "Totiviridae", "Flaviviridae", "Narnaviridae", "Nodaviridae", "Partitiviridae", "Birnaviridae", "Reoviridae", "Parvoviridae", "Orthomyxoviridae", "Rhabdoviridae", "Peribunyaviridae", "Chuviridae", "Phasmaviridae", "Phenuiviridae", "Iflaviridae", "Luteoviridae", "Tombusviridae", "Nodaviridae", "Unclassified Picornavirales", "Negevirus", "Tymoviridae", "Virgaviridae", "Dicistroviridae", "Totiviridae", "Flaviviridae", "Narnaviridae", "Nodaviridae", "Partitiviridae", "Birnaviridae", "Reoviridae", "Parvoviridae", "Orthomyxoviridae", "Rhabdoviridae", "Peribunyaviridae", "Chuviridae", "Phasmaviridae", "Phenuiviridae", "Iflaviridae", "Luteoviridae", "Tombusviridae", "Nodaviridae", "Unclassified Picornavirales", "Negevirus", "Tymoviridae", "Virgaviridae", "Dicistroviridae", "Totiviridae", "Flaviviridae", "Narnaviridae", "Nodaviridae", "Partitiviridae", "Birnaviridae", "Reoviridae", "Parvoviridae" )), row.names = c(NA, -92L), class = c("tbl_df", "tbl", "data.frame" ))
当前绘制得到的示例图如下:
实现方案
原生ggplot2不直接支持分组嵌套图例,使用ggh4x扩展包提供的嵌套图例功能可以快速实现需求,步骤如下:
- 加载所需依赖包
library(tidyverse) library(ggh4x) library(scales)
- 预处理数据,将
Taxon转为因子,因子水平按照所属Genome分组排序,保证同一基因组类型的分类单元在图例中连续排列
# 提取Taxon和Genome的唯一映射关系,按Genome分组排序 taxon_map <- ViralReads %>% distinct(Genome, Taxon) %>% arrange(Genome, Taxon) # 转换Taxon为有序因子 ViralReads <- ViralReads %>% mutate(Taxon = factor(Taxon, levels = taxon_map$Taxon))
- 绘图时调用嵌套图例向导,指定
Genome为上层分组即可
ggplot(ViralReads, aes(x=Host, y=Reads, fill=Taxon)) + geom_col(colour = "black", position = "fill") + scale_y_continuous(labels = label_percent())+ # 核心配置:生成分组嵌套图例 scale_fill_discrete( guide = guide_nested( group = taxon_map$Genome, group.title = "基因组类型", group.position = "front" ) ) + theme_minimal() + # 调整图例排版间距 theme( legend.spacing.y = unit(3, "mm"), legend.key.height = unit(3, "mm") )
运行代码后得到的图例将自动按照(-)ssRNA、(+)ssRNA、dsRNA、ssDNA四类基因组类型分组,每个分组下展示对应的病毒分类单元,不需要手动拆分图例或自定义色板。
内容的提问来源于stack exchange,提问作者Cole Baril
相关产品推荐
相关产品推荐

