2017-02-08 6 views
2

Ich habe eine Sediment-Kern-Datensatz, den ich gerne grafisch mit geom_bar() in ggplot2 porträtieren und mit einer Variablen füllen würde. Die Füllvariable wechselt mit jeder anderen Füllstufe, aber mit der neuen Version (2.2.1) von ggplot2 kann ich dieses Füllmuster nicht beibehalten. Dies wird diskutiert here, aber ich finde keine praktikable Lösung.Pflegen Reihenfolge von geom_bar() füllen mit ggplot2

library(ggplot2) 
site<-c(rep('a',14),rep('z',8)) 
sedcore<-1 
fill<-c("y","n","y","n","y","n","y","n","y","n","y","n","y","n","y","n","y","n","y","n","y","n") 
df <- data.frame(cbind(site,sedcore,fill)) 

ggplot(df, aes(x=site, y=sedcore, fill=fill)) + geom_bar(position="stack",stat="identity",colour="black",size=0.35) 

Order not maintained

Die neueste Version von ggplot nicht die Reihenfolge der

Datenrahmen halten Wenn ich ggplot2 Version 2.1 die Reihenfolge des Datenrahmen geladen wird beibehalten:

library(devtools) 
install_version("ggplot2", version = "2.1.0", repos = "http://cran.us.r-project.org") 
library(ggplot2) 

ggplot(df, aes(x=site, y=sedcore, fill=fill)) + geom_bar(position="stack",stat="identity",colour="black",size=0.35) 

Derselbe genaue Code behält nun die Reihenfolge bei: Order maintained

Bitte geben Sie an, wie Sie die Reihenfolge aus dem Datenrahmen erhalten. Ich habe versucht, meinen Datenrahmen und andere Positions- und Stapelbegriffe neu zu ordnen, aber ich kann das nicht herausfinden.

Vielen Dank im Voraus für jede Hilfe.

+0

Eine hacky Lösung wäre ein weiterer Faktor Ebene für jede Schicht in Ihrem BarPlot zu erstellen, und dann scale_fill_manual verwenden, um die Farben zu definieren, für jede Faktorstufe. Ich denke jedoch, dass die erste Ausgabe im Allgemeinen vorzuziehen ist, da Daten in ggplot nach Faktor sortiert sind. – thc

Antwort

1

Die hacky Lösung als

df$fill <- paste0(sprintf('%06d',1:nrow(df)), df$fill) 
ggplot(df, aes(x=site, y=sedcore, fill=fill)) + geom_bar(position="stack",stat="identity",colour="black",size=0.35) + 
    scale_fill_manual(values=ifelse(grepl('y',df$fill), 'steelblue', 'red')) + 
    guides(fill=FALSE) 
von @thc

vorgeschlagen

enter image description here

Verwandte Themen