欢迎关注R语言数据分析指南
❝本节来介绍一个新的技能图例分组,在数据可视化中某些情况下需要对图例进行分组,针对此种情况以往多是使用ggnewscale包来进行设置以实现该需求。而现在有了更好的方法使用legendry包可以更加轻松的实现该需求。下面通过案例来展示一下,更多详细的参数介绍请参考官方文档。有需要学习R语言绘图的朋友可关注文末介绍购买小编的R绘图文档。购买前请咨询,零基础不要买。
官方文档
https://teunbrand.github.io/legendry/
官方案例
library(tidyverse)
#install.packages("legendry")
library(legendry)
df <- msleep[c(9, 28, 11, 5, 34, 54, 64, 24, 53), ]
# 构建图例分组查找表
lut <- key_group_lut(msleep$name,
msleep$order)
ggplot(df,aes(bodywt, awake, colour = paste(order, name))) +
geom_point(aes(colour = name)) +
# 定义分组图例
guides(colour = guide_legend_group(key = lut))
原始代码
上方代码展示了如何使用 ggplot2 + key_group_lut() + guide_legend_group() 来实现图例分组显示。那么该种方法有什么妙用那,下面通过2025/7/19日发布的案例来进行说明。
可以看到要绘制出右侧的图例分组热图,需要拆分数据多次使用new_scale_fill()来实现非常的繁琐,那么如果换用legendry包来实现又会有怎样的优点。
p <- ggtree(midpoint.root(tr), layout = "rectangular")
df <- meta_df %>% rownames_to_column(var="id") %>%
pivot_longer(-id) %>% drop_na()
df$name <- factor(df$name,levels=df$name %>% unique())
heat <- df %>% ggplot(.,aes(name,id)) +
geom_tile(data=df %>% filter(name=="niche") %>%
dplyr::rename("1.niche"="value"),
aes(fill=`1.niche`)) +
scale_fill_manual(values=c("Human"= "#5CA4E6",
"Livestock"= "#E84A4A","Companion Animal" = "#5B331B",
"Environment"="#34732D","Food"="#A259D0"),
guide=guide_legend(order = 1))+
new_scale_fill() +
geom_tile(data=df %>% filter(name=="country") %>%
dplyr::rename("2.country"="value"),
aes(fill=`2.country`))+
scale_fill_manual(values=c(
"Australia"= "#F4C7DE","Austria"= "#9AC4F6",
"Belgium"= "#B1D1A2","Canada" = "#C1C1C1",
"China"= "#F9D275","France"="#2B3C70",
"Germany"= "#FAE664","Hungary"= "#A9A9A9",
"Indonesia" = "#C1DAB4","Iran"= "#4D704D",
"Ireland" = "#75B9D2","Italy"= "#A1D8C8",
"Netherlands"= "#F79533","Poland"= "#F86BA1",
"Portugal"= "#D6C6CA","Spain"= "#F7A98A",
"Switzerland"= "#C3E27F",
"United Kingdom"= "#B6C5DA", "United States" = "#730021"),
guide=guide_legend(order = 2))+
new_scale_fill()+
geom_tile(data=df %>% filter(name=="npmA_presence") %>%
dplyr::rename("3.npmA variant"="value"),
aes(fill=`3.npmA variant`))+
scale_fill_manual(values=c("npmA1"="#F97A1E",
"npmA2" = "#2A2E82"),
na.translate = FALSE,
guide=guide_legend(order = 3))+
new_scale_fill()+
geom_tile(data=df %>% filter(name=="Composite_Tn") %>%
dplyr::rename("4.Tn7734"="value") %>%
mutate(`4.Tn7734`=case_when(`4.Tn7734`=="yes" ~ "Tn7734",
TRUE ~ `4.Tn7734`)),
aes(fill=`4.Tn7734`))+
scale_fill_manual(values=c("Tn7734"= "#F5BE35",
"one_copy_IS30"="#EBD889"),
na.translate = FALSE,
guide=guide_legend(order = 4)) +
new_scale_fill()+
geom_tile(data=df %>% filter(name=="ICE_MGE_type") %>%
dplyr::rename("5.ICE variant"="value") %>%
mutate(`5.ICE variant`=case_when(`5.ICE variant` =="ICE2" ~ "Other ICE",
`5.ICE variant` =="ICE_v5" ~ "Other ICE",
TRUE ~ `5.ICE variant`)),
aes(fill=`5.ICE variant`))+
scale_fill_manual(values=c(
"ICE_v1" = "#B0DBF1",
"ICE_v2" = "#A0E0E0",
"ICE_v3" = "#E6B7DA",
"ICE_v4" = "#F97979",
"Other ICE" = "#1A1A1A"),na.translate = FALSE)+
scale_x_discrete(expand = c(0,0)) +
geom_vline(xintercept = c(1.5,2.5,3.5,4.5),linewidth=0.3) +
theme_test()+
theme(axis.text.y=element_blank(),
axis.ticks.y=element_blank(),
axis.title = element_blank(),
axis.text.x=element_text(angle=90,color="black",vjust=0.5,hjust=1),
legend.key.height = unit(0.4,"cm"),
legend.key.width = unit(0.4,"cm"))
library(aplot)
heat %>% insert_left(p,width = c(1,0.4))
legendry优化版本
通过使用legendry包定义分组图例后,可以看到绘制同样的图代码量是显著性的减少了,瞬间感觉清爽多了。
library(magrittr)
#install.packages("legendry")
library(legendry)
library(aplot)
p <- ggtree(midpoint.root(tr), layout = "rectangular")
df <- meta_df %>% rownames_to_column(var="id") %>%
pivot_longer(-id) %>% drop_na() %>%
set_colnames(c("id","group","name"))
dff <- df %>% distinct(group,name) %>%
mutate(group = factor(group, levels = unique(df$group)))
lut <- key_group_lut(dff$name,dff$group)
df$group <- factor(df$group,levels = unique(df$group))
heat <- df %>% ggplot(.,aes(group,id,fill=paste(group,name))) +
geom_tile(aes(fill=name)) +
guides(fill = guide_legend_group(key = lut,title=NULL))+
scale_x_discrete(expand = c(0,0)) +
geom_vline(xintercept = c(1.5,2.5,3.5,4.5),linewidth=0.3) +
scale_fill_manual(
values = c("Australia"= "#F4C7DE","Austria"= "#9AC4F6",
"Belgium"= "#B1D1A2","Canada" = "#C1C1C1",
"China"= "#F9D275","France"="#2B3C70",
"Germany"= "#FAE664","Hungary"= "#A9A9A9",
"Indonesia" = "#C1DAB4","Iran"= "#4D704D",
"Ireland" = "#75B9D2","Italy"= "#A1D8C8",
"Netherlands"= "#F79533","Poland"= "#F86BA1","Portugal"= "#D6C6CA",
"Spain"= "#F7A98A","Switzerland"= "#C3E27F",
"United Kingdom"= "#B6C5DA", "United States" = "#730021","Human"= "#5CA4E6",
"Livestock"= "#E84A4A","Companion Animal" = "#5B331B",
"Environment"="#34732D","Food"="#A259D0","npmA1"="#F97A1E","npmA2" = "#2A2E82",
"ICE_v1" = "#B0DBF1","ICE_v2" = "#A0E0E0","ICE_v3" = "#E6B7DA",
"ICE_v4" = "#F97979","Other ICE" = "#1A1A1A","yes"= "#F5BE35",
"one_copy_IS30"="#EBD889")) +
theme_test()+
theme(axis.text.y=element_blank(),
axis.ticks.y=element_blank(),
axis.title = element_blank(),
axis.text.x=element_text(angle=90,color="black",vjust=0.5,hjust=1),
legend.key.spacing.y = unit(0,"cm"),
legend.key.height = unit(0.4,"cm"),
legend.key.width = unit(0.4,"cm"))
heat %>% insert_left(p,width = c(1,0.4))
关注下方公众号下回更新不迷路
❝本节介绍到此结束,有需要学习R数据可视化的朋友欢迎到淘宝店铺:R语言数据分析指南,购买小编的R语言可视化文档,2025年购买将获取2025年更新的绘图内容,同时将赠送2024年的绘图文档内容。
更新的绘图内容包含数据+代码+注释文档+文档清单,小编只分享案例文档,不额外回答问题,无答疑服务,更新截止2025年12月31日结束,后续不在进行任何更新,零基础基础一般不推荐买。
案例特点
❝所选案例图绝大部份属于个性化分析图表,数据案例多来自已经发表的高分论文,并会汇总整理分享一些论文中公开的分析代码。
2025年起提供更加专业的html文档,更加的直观易学。文档累计上千人次购买拥有良好的社群交流体验,R代码结构清晰易懂.


目录大纲展示
淘宝店铺
2025年更新案例图展示

