为 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])))
}
我想做的是循环遍历具有不同样本的数据集,并使用 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])))
}