2013-08-23 7 views
36

ggplotのカスタムレジェンドを2つの別々のデータフレームからのデータで取得しようとしています。再現可能な最小限の例については、以下を参照してください。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_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')) 

enter image description here

凡例を生成するためにscale_..._identityを強制的にguide = 'legend'を指定する必要があります。

名前にベクトルを渡すことができます。名前はgeom_...の呼び出しで色を呼び出したものでなければなりません。

+12

私は色が審美的な定義の外に設定されていたことに気づくのに、しばらく時間がかかりました。それは微妙な違いです。 – scs217

+5

+1。私は次のように言っています:geom_line(aes(...、color = 'a')...) '次にscale_color_manual(...、values = c( 'a' = 'black' 、...)) '。そうすれば、 'aes(color = 'string')'の文字列は単なる束縛であることは明らかです。実際の色は 'scale_color_manual()'で定義したものになります。 –

+1

ありがとう! 'geom_line(color = x)'と 'geom_line(aes(color = x)) 'の色の設定の微妙な違いは、簡単に見落とすことができると私は同意します。私はそれに重点を置く編集を提案しました。 – JanLauGe