多层ggplot自定义图例

79

我正在尝试为一个使用来自两个不同数据框的数据的ggplot创建自定义图例。请参见下面的最小可复制示例。

我想要实现的是拥有描述色带填充、黑线和红线的图例。

require(ggplot2)
x=seq(1,10,length=100)
data=data.frame(x,dnorm(x,mean=6.5,sd=1))
names(data)=c('x','new.data')
x.ribbon=seq(1,10,length=20)
ribbon=data.frame(x.ribbon,
                  dnorm(x.ribbon,mean=5,sd=1)+.01,
                  dnorm(x.ribbon,mean=5,sd=1)-.01,
                  dnorm(x.ribbon,mean=5,sd=1))
names(ribbon)=c('x.ribbon','max','min','avg')
ggplot()+geom_ribbon(data=ribbon,aes(ymin=min,ymax=max,x=x.ribbon),fill='lightgreen')+
  geom_line(data=ribbon,aes(x=x.ribbon,y=avg),color='black')+
  geom_line(data=data,aes(x=x,y=new.data),color='red')+
  xlab('x')+ylab('density')

在此输入图片描述

1个回答

124

不要设置 colourfill,而是使用几何美学中的 aes 进行映射,然后使用 scale_xxx_manualscale_xxx_identity

例如:

ggplot()+geom_ribbon(data=ribbon,aes(ymin=min,ymax=max,x=x.ribbon,fill='lightgreen'))+
    geom_line(data=ribbon,aes(x=x.ribbon,y=avg,color='black'))+
    geom_line(data=data,aes(x=x,y=new.data,color='red'))+
    xlab('x')+ylab('density') + 
    scale_fill_identity(name = 'the fill', guide = 'legend',labels = c('m1')) +
    scale_colour_manual(name = 'the colour', 
         values =c('black'='black','red'='red'), labels = c('c2','c1'))

在此输入图片描述

请注意,您必须指定 guide = 'legend' 以强制 scale_..._identity 生成图例。

scale_...manual 可以传递带有命名向量的值--名称应与您在对 geom_... 的调用中称之为颜色的名称相同,然后您可以很好地标记。


27
我花了一段时间才意识到我所拥有的颜色已经超越了美学定义之外。这是一个微妙的不同之处。 - scs217
19
顺便说一句,为了进一步澄清,我会这样说:“geom_line(aes(..., color = 'a')...)”,然后“scale_color_manual(..., values = c('a' = 'black', ...))”。这样就清楚了,在aes(color = 'string')中的字符串只是一个绑定,实际颜色将是您在scale_color_manual()中定义的任何颜色。 - Pierre D
3
谢谢您!我同意 @scs217 的观点,即在 geom_line(colour = x) 和在 geom_line(aes(colour = x)) 中设置颜色的微妙差别很容易被忽视。我建议进行编辑以更加强调这一点。 - JanLauGe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接