2013-08-23 95 views
36

我想獲得ggplot的數據來自兩個單獨的數據框的自定義圖例。請參閱下面的重現性示例。R:多層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') 

enter image description here

回答

57

而不是設置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')) 

enter image description here

請注意,您必須指定guide = 'legend'迫使scale_..._identity產生一個傳奇。

scale_...manual您可以爲值傳遞一個命名向量 - 名稱應該是您稱爲geom_...的調用中的顏色,然後您可以很好地標記。

+12

我花了一段時間才意識到我的顏色超出了美學的定義。這是一個微妙的差異。 – scs217

+5

+1。順便說一句,爲了進一步澄清,我會說:'geom_line(aes(...,color ='a')...)'然後'scale_color_manual(...,values = c('a'='black' ,...))'。這樣,顯然'aes(color ='string')'中的字符串只是一個綁定,實際的顏色將是您在'scale_color_manual()'中定義的任何內容。 –

+1

感謝您的支持!我同意@ scs217,可以很容易地忽略'geom_line(color = x)'和'geom_line(aes(color = x))'中設置顏色之間的細微差別。我建議進行一項編輯來強調這一點。 – JanLauGe