2016-09-27 4 views
2

Ich habe Daten, die Ich mag würde plotten mit ggplot ‚s geom_point:Farbcodierung und Legende Etiketten in ggplot

set.seed(1) 
    df <- data.frame(x=rnorm(100),y=rnorm(100),val=c(rnorm(90),rep(NA,10))) 

I Farben hinzufügen, nach Intervallen von df$val:

intervals.df <- data.frame(interval=c("(-3,-2]","(-2,-0.999]","(-0.999,0]","(0,1.96]","(1.96,3.91]","(3.91,5.87]","not expressed"), 
          start=c(-3,-2,-0.999,0,1.96,3.91,NA),end=c(-2,-0.999,0,1.96,3.91,5.87,NA), 
          col=c("#2f3b61","#436CE8","#E0E0FF","#7d4343","#C74747","#EBCCD6","#D3D3D3"),stringsAsFactors=F) 
    df <- cbind(df,do.call(rbind,lapply(df$val,function(x){ 
    if(is.na(x)){ 
     return(data.frame(col=intervals.df$col[nrow(intervals.df)],interval=intervals.df$interval[nrow(intervals.df)])) 
    } else{ 
     idx <- which(intervals.df$start <= x & intervals.df$end >= x) 
     return(data.frame(col=intervals.df$col[idx],interval=intervals.df$interval[idx])) 
    } 
    }))) 

Hier Ich setze df$col als factor und setze die Etiketten auf die Intervalle, so dass ich sie in der Legende plotten kann:

df$col <- factor(df$col,levels=intervals.df$col,labels=intervals.df$interval) 

Dies wird auch alle Intervalle einschließlich der, die die df$val möglicherweise nicht abdecken, aber ich will das.

Und hier ist, wie ich versuche, es zu zeichnen:

library(ggplot2) 
ggplot(df,aes(x=x,y=y,colour=col))+geom_point(cex=2,shape=1,stroke=1)+labs(x="X",y="Y")+theme_bw()+theme(legend.key=element_blank(),panel.border=element_blank(),strip.background=element_blank())+scale_shape(solid=T)+scale_fill_manual(drop=FALSE,values=levels(df$col),name="DE") 

Was mich nahe kommt, aber die Farben sind nicht richtig: enter image description here

Also dachte ich, das Plotbefehl, dass (das Hinzufügen scale_color_manual) korrigieren :

ggplot(df,aes(x=x,y=y,colour=col))+geom_point(cex=2,shape=1,stroke=1)+labs(x="X",y="Y")+theme_bw()+theme(legend.key=element_blank(),panel.border=element_blank(),strip.background=element_blank())+scale_shape(solid=T)+scale_fill_manual(drop=FALSE,values=levels(df$col),name="DE")+scale_color_manual(drop=FALSE,values=levels(df$col),name="DE") 

Aber das den Fehler wirft:

Error in grDevices::col2rgb(colour, TRUE) : invalid color name '(0,1.96]' 

Also, wie bekomme ich die Farben richtig (und die Legende name auch richtig)?

Antwort

3

Eine Option ist die Zuordnung der Farben zu interval nach dem Einstellen der Ebenen über intervals.df, so dass die Reihenfolge der Ebenen und die Anzahl der Ebenen korrekt ist. Verwenden Sie die Farben von intervals.df, um einen benannten Vektor der Farben an scale_color_manual weiterzuleiten.

# Set levels of interval via intervals.df 
df$interval = factor(df$interval, levels=intervals.df$interval) 

# Named vector of the colors based on intervals.df 
colors = intervals.df$col 
names(colors) = intervals.df$interval 

ggplot(df, aes(x=x, y=y, colour=interval))+ 
    geom_point(cex=2, shape=1, stroke=1) + 
    labs(x="X", y="Y")+ 
    theme_bw()+ 
    theme(legend.key=element_blank(), 
     panel.border=element_blank(), strip.background=element_blank())+ 
    scale_color_manual(values = colors, name = "DE", drop = FALSE) 
+0

Wie bekommt man diese die Legende zu haben, die alle intervals.df $ col und intervals.df $ Intervall und nicht nur die in df enthalten diejenigen? – dan

+0

@dan Siehe Bearbeiten; du brauchst 'drop = FALSE' in' scale_color_manual'. – aosmith