大数跨境
0
0

图例分组别硬拼,legendry包秒出奇效!

图例分组别硬拼,legendry包秒出奇效! R语言数据分析指南
2025-08-05
0

欢迎关注R语言数据分析指南

本节来介绍一个新的技能图例分组,在数据可视化中某些情况下需要对图例进行分组,针对此种情况以往多是使用ggnewscale包来进行设置以实现该需求。而现在有了更好的方法使用legendry包可以更加轻松的实现该需求。下面通过案例来展示一下,更多详细的参数介绍请参考官方文档。有需要学习R语言绘图的朋友可关注文末介绍购买小编的R绘图文档。购买前请咨询,零基础不要买。

官方文档

https://teunbrand.github.io/legendry/

官方案例

library(tidyverse)
#install.packages("legendry")
library(legendry)

df <- msleep[c(9281153454642453), ]
# 构建图例分组查找表
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年更新案例图展示


【声明】内容源于网络
0
0
R语言数据分析指南
R语言重症爱好者,喜欢绘制各种精美的图表,喜欢的小伙伴可以关注我,跟我一起学习
内容 1180
粉丝 0
R语言数据分析指南 R语言重症爱好者,喜欢绘制各种精美的图表,喜欢的小伙伴可以关注我,跟我一起学习
总阅读64
粉丝0
内容1.2k