如何定义ggplot2 的scale_fill_manual() 中参数 values 的命名向量?

需求背景

对 R 语言中,ggplot2 的 scale_fill_manual() 函数的 values 参数理解不到位,它这里需要的是一个命名向量,无法在c() 函数内部直接创建一个向量。

举例说明,以不同分类数据的条形图来作为图例。

比如我有14个不同物种,绘制其不同颜色的条形图,注意颜色不能随便定义,需要指定每个物种对应的图例颜色,以便与其他图形颜色统一。

col2 <- c(brewer.pal(12,"Paired"),"#CCEBC5","#FFED6F")
col2
unique(type2$Species)
leg <- data.frame(Species=unique(type2$Species),Count=rep(1,length(unique(type2$Species))))
leg$Species <- factor(leg$Species,levels = unique(type2$Species))


> head(leg)
                 Species Count
1            SpeciesA     1
2            SpeciesB     1
3            SpeciesC     1
4            SpeciesD     1
5            SpeciesE     1
6            SiritiaF     1

一开始的做法,又长又臭:

pp <- ggplot(leg,aes(Species,Count,fill=Species))+
  geom_bar(stat = "identity",width = 0.5)+
  coord_flip()+
  scale_fill_manual(values = c(unique(type2$Species)[1]=col2[1],
                             unique(type2$Species)[2]=col2[2],
                             unique(type2$Species)[3]=col2[3],
                             unique(type2$Species)[4]=col2[4],
                             unique(type2$Species)[5]=col2[5],
                             unique(type2$Species)[6]=col2[6],
                             unique(type2$Species)[7]=col2[7],
                             unique(type2$Species)[8]=col2[8],
                             unique(type2$Species)[9]=col2[9],
                             unique(type2$Species)[10]=col2[10],
                             unique(type2$Species)[11]=col2[11],
                             unique(type2$Species)[12]=col2[12],
                             unique(type2$Species)[13]=col2[13],
                             unique(type2$Species)[14]=col2[14]))+
  labs(x="",y="")+
  theme_bw()+
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        legend.position = "none",
        axis.text.y = element_text( face = "italic"),
        axis.ticks = element_blank(),axis.text.x = element_blank());pp
        

报错:

图片

原因分析

在 R 语言中,ggplot2 的 scale_fill_manual() 函数的 values 参数需要一个命名向量作为输入,其中向量的名称(即键)是因子级别,向量的值(即值)是对应的颜色。

在上面的代码中,试图在 c() 函数内部创建一个向量,并使用 unique(type2$Species)[1] = col2[1] 这样的语法来命名向量元素。但是,这种语法在 c() 函数内部是无效的,因为 c() 函数不会创建命名向量,它只是将元素组合成一个向量。

正确的方法是创建一个命名向量,然后将其传递给 scale_fill_manual() 的 values 参数。

纠错

以下是一个修正后的代码示例,简洁易懂。

# 假设 col2 是颜色向量,type2$Species 是因子级别
# 创建一个命名向量,其中名称是因子级别,值是颜色
fill_colors <- setNames(col2, unique(type2$Species))
# 使用这个命名向量在 scale_fill_manual 中设置颜色
pp <- ggplot(leg,aes(Species,Count,fill=Species))+
  geom_bar(stat = "identity",width = 0.5)+
  coord_flip()+
  scale_fill_manual(values = fill_colors) +
  labs(x="",y="")+
  theme_bw()+
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        legend.position = "none",
        axis.text.y = element_text( face = "italic"), 
        axis.ticks = element_blank(),axis.text.x = element_blank());pp
        
# 确保 col2 向量的长度与 unique(type2$Species) 的长度相匹配,否则会导致颜色设置不正确。

图形结果:

图片

图片

posted @ 2024-11-04 20:42  生物信息与育种  阅读(16)  评论(0编辑  收藏  举报