2014-01-22 5 views
5

Ich versuche, mein Histogramm ggplot2 in feste Intervalle zu stratifizieren und sie basierend auf einer spezifischen Farbpalette zu stratifizieren: 'x<4':black; '4<x<6':blue; '6<x<8':yellow; und so weiter ...Wie man ggplot-Histogramm-x-Achsen-Intervalle einer festen Farbpalette zuordnen kann?

Ich versuchte 2 Möglichkeiten, die beide nicht funktionierten.

Mit Bezug auf meinen Code unten schlägt die Alternative 1 fehl, wenn NoOfElement auf eine kleine Zahl fällt, sagen wir 500, und es gibt kein Element im ersten Intervall 'x<4'. ggplot2 weist dann 'Schwarz' dem ersten Intervall zu (das wäre '4<x<6' wenn Größe = 500). Aber das ist nicht was ich will (siehe Bild).

enter image description here

In Alternative 2, habe ich eine weitere Variable in meinem Datenrahmen und die Farben für jedes Element zugeordnet. Ich habe dies basierend auf einer Modifikation der Lösung in gegeben: Set specific fill colors in ggplot2 by sign. Leider hat das resultierende Histogramm Farben, die zufällig von ggplot2 zugewiesen wurden.

Ich bin ziemlich fest und würde wirklich etwas Hilfe zu schätzen wissen. Danke im Voraus!

Beispielcode:

library(ggplot2) 

NoOfElement <- 5000; MyBreaks <- c(-Inf, seq(4, 16, by=2), Inf) 
MyColours <- c("black", "blue", "yellow", "green", "gray", "brown", "purple", "red") 

set.seed(2) 
c <- data.frame(a=rnorm(NoOfElement, 10, 2), b=rep(NA, NoOfElement)) 
c$b <- cut(c$a, MyBreaks) 

try <- 1 # Allows toggling of alternatives below 
if (try==1) 
{ 
    p <- ggplot(c, aes(x=c$a, fill=c$b)) + geom_histogram(binwidth=0.2) + 
    scale_fill_manual(breaks = levels(c$b), values = MyColours, 
         name = "X Intervals") + 
    scale_x_continuous(limits=c(2, 20)) 
}else 
{ 
    c$BarCol <- factor(c$b, levels = levels(c$b), labels = MyColours) 

    p <- ggplot(c, aes(x=c$a, fill=c$b)) + geom_histogram(binwidth=0.2) + 
    scale_fill_manual(values = c$BarCol, name = "X Intervals") + 
    scale_x_continuous(limits=c(2, 20)) 
} 
plot (p) 

Antwort

4

Es gibt ein drop Argument in scale_ Familie für leere Ebene:

NoOfElement <- 500; MyBreaks <- c(-Inf, seq(4, 16, by=2), Inf) 
MyColours <- c("black", "blue", "yellow", "green", "gray", "brown", "purple", "red") 

set.seed(2) 
c <- data.frame(a=rnorm(NoOfElement, 10, 2), b=rep(NA, NoOfElement)) 
c$b <- cut(c$a, MyBreaks) 

p <- ggplot(c, aes(x=c$a, fill=c$b)) + geom_histogram(binwidth=0.2) + 
    scale_fill_manual(breaks = levels(c$b), values = MyColours, 
         name = "X Intervals", drop=FALSE) 

enter image description here

Verwandte Frage here.

+0

das beantwortet meine Frage perfekt. Vielen Dank für Ihre schnelle Antwort! – NoviceProg

+0

Gern geschehen! – tonytonov

Verwandte Themen