R: légende personnalisée pour ggplot à plusieurs couches

J’essaie d’obtenir une légende personnalisée pour un ggplot avec des données provenant de deux trames de données distinctes. Voir ci-dessous pour un exemple reproductible minimum.

Ce que j’essaie d’accomplir, c’est d’avoir une légende décrivant le remplissage du ruban, la ligne noire et la ligne rouge.

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

entrer la description de l'image ici

Au lieu de définir la colour et le fill , cartographiez-les en utilisant l’esthétique géomésortingque puis utilisez scale_xxx_manual ou scale_xxx_identity .

Par exemple

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

entrer la description de l'image ici

Notez que vous devez spécifier guide = 'legend' pour forcer l’ scale_..._identity de scale_..._identity à produire une légende.

scale_...manual vous pouvez passer un vecteur nommé pour les valeurs – les noms doivent être ce que vous avez appelé les couleurs dans les appels à geom_... et vous pouvez ensuite étiqueter bien.