R: Пользовательская легенда для многослойного ggplot
Я пытаюсь получить пользовательскую легенду для 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 ответ
Решение
Вместо настройки colour
а также fill
, сопоставьте их, используя эстетику геометрии aes
а затем использовать scale_xxx_manual
или же scale_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_...
и тогда вы можете маркировать красиво.