为 ggplot2 中的变量定义图例颜色

Define legend colors for a variable in ggplot2

我想做的是循环遍历具有不同样本的数据集,并使用 ggplot2 绘制覆盖密度图。 1 个参考样本与其他样本之一一起绘制在每个图中。 绘图本身不是问题,但颜色是:

数据集:

df <- data.frame(SampleName = c("a","a","a","b","b","b","c","c","c"),
       Data = c(1,1,2,4,6,7,3,4,9))

使用 scale_fill_manual 我可以为特定样本分配颜色:

#1

ggplot() + 
  geom_density(data=subset(df, SampleName == "a"), 
               aes(x = Data, group=SampleName, fill=SampleName), alpha= 0.6) +
  geom_density(data=subset(df, SampleName == "b"), 
               aes(x = Data, group=SampleName, fill=SampleName), alpha= 0.6) +
  scale_fill_manual(values = c("b" = "red", "a" = "green"))

使用包含所有样本名称的向量,我可以制作一个循环,以 "b" 作为固定样本绘制所有叠加图:

#2

Samples <- c("a","b","c")

for(i in 1:length(Samples)){
print(ggplot() + 
            geom_density(data=subset(df, SampleName == Samples[i]), 
                         aes(x = Data, group=SampleName, fill=SampleName), alpha= 0.6) +
            geom_density(data=subset(df, SampleName == "b"), 
                         aes(x = Data, group=SampleName, fill=SampleName), alpha= 0.6) +
            scale_fill_manual(values = c("red", "green"))
  )
}

#2 中的问题是当 b 固定时样本会改变颜色 -> 在第一个图中 b 是绿色而 a 是红色,在图 3 中 b 是红色而 c 是绿色。 当我尝试将 #1 中的颜色分配给特定样本(参见 #3)时,会显示此错误消息:

“错误:意外的‘=’在: " aes(x = Data, group=SampleName, fill=SampleName), alpha= 0.6)) + scale_fill_manual(值 = c("b" = "red", 样本[i] =

我尝试了不同的方法来使 'Samples[i] = "green"' 中的变量更多 'text-like' 与 as.character、paste()... 但这似乎不起作用。 有什么解决办法吗?

#3

for(i in 1:length(Samples)){
  print(ggplot() + 
      geom_density(data=subset(df, SampleName == Samples[i]), 
                   aes(x = Data, group=SampleName, fill=SampleName), alpha= 0.6) +
      geom_density(data=subset(df, SampleName == "b"), 
                   aes(x = Data, group=SampleName, fill=SampleName), alpha= 0.6)) +
      scale_fill_manual(values = c("b" = "red", Samples[i] = "green"))
}

您可以使用 setNames 轻松创建命名向量,您可以在其中使用需要计算的表达式。示例:

setNames(c('red', 'green'), c('b', Samples[i]))

这使得:

for(i in 1:length(Samples)){
  print(ggplot() + 
      geom_density(data=subset(df, SampleName == Samples[i]), 
                   aes(x = Data, group=SampleName, fill=SampleName), alpha= 0.6) +
      geom_density(data=subset(df, SampleName == "b"), 
                   aes(x = Data, group=SampleName, fill=SampleName), alpha= 0.6)) +
      scale_fill_manual(values = setNames(c('red', 'green'), c('b', Samples[i])))
}