R:多层ggplot的自定义图例

scs*_*217 55 r ggplot2

我正在尝试为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')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

mne*_*nel 89

而不是设置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'))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

scale_...manual你可以为值传递一个命名向量 - 名称应该是你在调用中称为颜色的名称geom_...,然后你可以很好地标记.

  • 我花了一段时间才意识到我在美学定义之外设置了颜色.这是一个微妙的差异. (20认同)
  • +1.顺便说一句,为了进一步澄清,我会说:`geom_line(aes(...,color ='a')...)`然后`scale_color_manual(...,values = c('a'='black') ,...))`.很明显,`aes(color ='string')`中的字符串只是一个绑定,实际颜色将是你在`scale_color_manual()`中定义的任何颜色. (12认同)
  • 谢谢你!我同意@ scs217,可以很容易地忽略在`geom_line(colour = x)`中设置颜色与`geom_line(aes(colour = x))`中设置颜色之间的细微差别。我建议进行编辑以更加强调这一点。 (3认同)