Frage

I'm working on overlaying several density plots to create a figure in ggplot2. Say I have data points for each December over a series of years (in this case 2004-2012) and I want to plot a density function for each December month + year and overlay them. I would like to highlight one density line for a specific month by making it dashed where all the others are solid. I have a reproducible example below:

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

Currently, I'm able to produce this. Unfortunately the legend on the right shows a solid blue line for Dec '08 instead of a dashed line. How can I make the legend correspond to the dashed density line for only Dec '08 (e.g. all other legend keys are solid lines)? I have tried using legend.key but this only works for the outline and background not the actual object in the legend. December densities

War es hilfreich?

Lösung

If you map your factor new to both colour and linetype, and specify the same labels for both scales, then ggplot will happily combine the colour and linetype legends automatically:

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

Andere Tipps

this makes a much prettier version I think, though the yellow is hard to read.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top