2013-01-17 34 views
3

我正在重疊幾個密度圖以在ggplot2中創建圖形。假設我在一系列年份(在本例中爲2004-2012年)每個十二月都有數據點,並且我想繪製每個十二月份+年份的密度函數並覆蓋它們。我想突出一個特定月份的密度線,讓其中所有其他密度線保持穩定。我有一個可重複的例子如下:更改個人密度以匹配ggplot2中的圖例

#Create vector of data for December 
set.seed(12345) 
dec_emas = as.matrix(rnorm(496, 122, 250)) 

#create indicators for Dec04 ... Dec11, then attach to data frame w/ estimates 
declab = c('Dec04', 'Dec05', 'Dec06', 'Dec07', 'Dec08', 'Dec09', 'Dec10', 'Dec11') 
declabs = rep(declab, 62) 

rownames(dec_emas) = declabs 
colnames(dec_emas) = 'EMA' 

#add in factor ID for the 8 levels 
dec04 = as.numeric(rownames(dec_emas) == 'Dec04') 
dec05 = as.numeric(rownames(dec_emas) == 'Dec05') 
dec06 = as.numeric(rownames(dec_emas) == 'Dec06') 
dec07 = as.numeric(rownames(dec_emas) == 'Dec07') 
dec08 = as.numeric(rownames(dec_emas) == 'Dec08') 
dec09 = as.numeric(rownames(dec_emas) == 'Dec09') 
dec10 = as.numeric(rownames(dec_emas) == 'Dec10') 
dec11 = as.numeric(rownames(dec_emas) == 'Dec11') 

dec_ema = as.numeric(dec_emas) 
dec_ema_df = data.frame(dec_ema, dec04,dec05,dec06,dec07,dec08,dec09,dec10,dec11) 

dec_ema_df$new[dec_ema_df$dec04==1]<-4 
dec_ema_df$new[dec_ema_df$dec05==1]<-5 
dec_ema_df$new[dec_ema_df$dec06==1]<-6 
dec_ema_df$new[dec_ema_df$dec07==1]<-7 
dec_ema_df$new[dec_ema_df$dec08==1]<-8 
dec_ema_df$new[dec_ema_df$dec09==1]<-9 
dec_ema_df$new[dec_ema_df$dec10==1]<-10 
dec_ema_df$new[dec_ema_df$dec11==1]<-11 


#using GGPLOT2... 
library(ggplot2) 
library('RColorBrewer') 


#use different colours for each december 
cbbPalette <- brewer.pal(8, "Accent") 

#Plot overlaid densities and highlight December 08 with a dashed line. 
dec.dens1 = ggplot(dec_ema_df, aes(x=dec_ema, group = new)) + 
    geom_density(aes(colour=factor(new), linetype = factor(new==8)), size = 1, alpha = .60, kernel='epanechnikov') + 
    xlab(NULL) + ylab(NULL) + 
    scale_linetype_manual(values = c('solid', 'dashed'), guide = FALSE) + 
    scale_colour_manual(values = cbbPalette, 
         labels= c('Dec `04','Dec `05','Dec `06','Dec `07','Dec `08','Dec `09','Dec `10','Dec `11'), 
         name= '')    


print(dec.dens1) 

目前,我能夠產生這種。不幸的是,右側的圖例展示了08年12月的一條堅實的藍線,而不是一條虛線。我如何才能使圖例僅對應於08年12月的虛線密度線(例如,所有其他圖例鍵都是實線)?我曾嘗試使用legend.key,但這隻適用於大綱和背景,而不是圖例中的實際對象。 December densities

回答

6

如果您因素new映射到顏色和線型和兩個尺度指定相同的標籤,然後ggplot會很樂意自動結合顏色和線型的傳說:

dec.dens1 = ggplot(dec_ema_df, aes(x=dec_ema, group=new)) + 
      geom_density(aes(colour=factor(new), linetype=factor(new)), 
         size=1, alpha=.60, kernel='epanechnikov') + 
      xlab(NULL) + 
      ylab(NULL) + 
      scale_linetype_manual(values=c('solid', 'solid','solid','solid', 
              'dashed','solid','solid','solid'), 
          labels=c('Dec `04','Dec `05','Dec `06','Dec `07', 
            'Dec `08','Dec `09','Dec `10','Dec `11')) + 
      scale_colour_manual(values = cbbPalette, 
          labels=c('Dec `04','Dec `05','Dec `06','Dec `07', 
            'Dec `08','Dec `09','Dec `10','Dec `11')) 

enter image description here

+0

的感謝!我以前嘗試使用scale_linetype失敗。 –

1

這使得我認爲更漂亮的版本,儘管黃色很難閱讀。

dec.dens1 = ggplot(dec_ema_df, aes(x=dec_ema, group = new)) + 
    geom_density(aes(colour=factor(new), linetype = factor(new)), size = 1, alpha = .70,kernel='epanechnikov') + 
    xlab(NULL) + ylab(NULL) + 
    scale_linetype_manual(values=c('solid', 'solid','solid','solid','dashed','solid','solid','solid'), 
         labels=c('`05','`06','`07','`08','`09','`10','`11','`12')) + 
          scale_colour_manual(values = cbbPalette,labels=c('`05','`06','`07','`08','`09','`10','`11','`12'), name=NULL) + 
          scale_y_continuous(labels = percent) + 
          theme(axis.line = element_line(colour = "black"), 
           panel.grid.major = element_blank(), 
           panel.grid.minor = element_blank(), 
           panel.border = element_blank(), 
           panel.background = element_blank(), 
           legend.title=element_blank(), 
           legend.position = 'bottom', 
           legend.text = element_text(color= 'black', size = 12, face = 'bold'), 
           legend.key = element_rect(fill = 'white', size = 0.5, linetype='solid'), 
           legend.key.size = unit(1.5, 'lines')) 


print(dec.dens1) 

enter image description here