使用 ggplot2 为什么更改调色板会导致全灰色?

Ste*_*tte 1 r ggplot2

内置在我的应用程序中,我能够更改调色板,包括色觉缺陷。然而,我的一张图表在 R4 上工作得很好,但在 Okabe-Ito 调色板下全是灰色的,并在图例中列出了颜色的名称。我究竟做错了什么?

data<-as.data.frame(rbind(15.29,84.71))
         data<-cbind(x=c("Total Measurement Variance","Total Measurement Variance"),y=data,Group=c("Repeatability","Reproducibility"))
         colnames(data)<-c("x","y","Source")

color=palette.colors(n = 8,palette = "R4")

p<-ggplot(data=data,aes(x=x,y=y,fill=Source,label=y))+
     geom_bar(stat="identity")+
     geom_label(aes(group=Source),fill="white",label=paste0(data$y,"%"),position=position_stack(vjust=.5))+
     scale_y_continuous(labels=function (x) paste0(x,"%"))+
     scale_fill_manual(values=color[-1])+
     labs(title="Components of Variation",x="",y="% of Measurement Error Variance")
p

color=palette.colors(n = 8,palette = "Okabe-Ito")

p<-ggplot(data=data,aes(x=x,y=y,fill=Source,label=y))+
     geom_bar(stat="identity")+
     geom_label(aes(group=Source),fill="white",label=paste0(data$y,"%"),position=position_stack(vjust=.5))+
     scale_y_continuous(labels=function (x) paste0(x,"%"))+
     scale_fill_manual(values=color[-1])+
     labs(title="Components of Variation",x="",y="% of Measurement Error Variance")
p

Run Code Online (Sandbox Code Playgroud)

MrF*_*ick 6

问题来自于这样一个事实:由于某种原因,当您在此处使用比较输出palette.colors时,会返回一个命名向量palette = "Okabe-Ito"

palette.colors(n = 8,palette = "R4")
# [1] "#000000" "#DF536B" "#61D04F" "#2297E6" "#28E2E5" "#CD0BBC"
# [7] "#F5C710" "#9E9E9E"

palette.colors(n = 8,palette = "Okabe-Ito")
#         black        orange       skyblue   bluishgreen 
#     "#000000"     "#E69F00"     "#56B4E9"     "#009E73" 
#        yellow          blue    vermillion reddishpurple 
#     "#F0E442"     "#0072B2"     "#D55E00"     "#CC79A7" 
Run Code Online (Sandbox Code Playgroud)

当您使用 时scale_fill_manual(values=),如果传递一个命名向量,那么它将尝试将颜色向量中的名称与因子级别的名称进行匹配。由于您的Source值是“重复性”和“再现性”,而不是“橙色”和“天蓝色”等值,因此匹配不起作用,您只会变得灰色。如果您删除名称,那么它不会尝试进行匹配。

color <- unname(palette.colors(n = 8, palette = "Okabe-Ito"))
Run Code Online (Sandbox Code Playgroud)

应该管用