2015-06-20 51 views
1

我想创建一个ggplot密度的图例,将一个组与所有组进行比较。使用此示例 - R: Custom Legend for Multiple Layer ggplot - 我可以使用下面的代码成功完成此操作。如何通过在ggplot中映射来自不同数据帧的aes_string来生成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):找不到对象'black'。

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')) 

回答

0

您可以使用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')) 
+0

谢谢 - 代码生成一个阴谋,但没有传说。 – user4556428

+0

非常好 - 这正是我需要的。 – user4556428