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:
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)?
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
@dan Siehe Bearbeiten; du brauchst 'drop = FALSE' in' scale_color_manual'. – aosmith