如何通过映射ggplot中不同数据框的aes_string来在ggplot中生成图例?

时间:2015-06-20 15:24:45

标签: r function ggplot2

我正在尝试为ggplot密度创建一个图例,将一个组与所有组进行比较。使用此示例 - R: Custom Legend for Multiple Layer ggplot - 我可以使用以下代码成功完成此操作。

met1 <- data.frame(
    Score = sample(1:10),
    Group = sample(c("Group1", "Group2", "Group3"), 30, replace = TRUE))

ggplot()+geom_density(data=met1, aes(x=Score,fill='black'))+geom_density(data=met1[met1$Group=="Group1",],aes(x=Score,fill='red'))+ scale_fill_identity(name='Groups', guide='legend',labels=c('Group1', 'All Groups')) 

但是,我需要使用aes_string来使用函数调用ggplot来创建许多图。当我尝试使用下面的代码时,它会产生错误 - eval中的错误(expr,envir,enclos):object&#39; black&#39;未找到。

x_var <- "Score"

ggplot()+geom_density(data=met1, aes_string(x=x_var,fill='black'))+  
    geom_density(data=met1[met1$Group=="Group1",],aes(x=x_var,fill='red'))+
    scale_fill_identity(name='Groups', guide='legend',labels=c('Group1', 'All Groups'))

1 个答案:

答案 0 :(得分:1)

您可以使用shQuote引用字符串,scale_fill_manual将字符串映射到适当的颜色

x_var <- "Score"

ggplot(met1, aes_string(x_var)) + 
  geom_density(data=met1, aes_string(x=x_var, fill=shQuote("b"))) +
  geom_density(data=met1[met1$Group=="Group1",], aes_string(x=x_var, fill=shQuote("r")), alpha=0.50) +
  scale_fill_manual(name='Groups', guide='legend', 
                     values=c("b"="black", "r"="red"), 
                     labels=c('All Groups', 'Group1'))