需求背景
对 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) 的长度相匹配,否则会导致颜色设置不正确。
图形结果:
标签:scale,manual,values,命名,向量,fill From: https://www.cnblogs.com/miyuanbiotech/p/18526201