2012-10-16 3 views
14

Hi wollte die folgende Tabelle anpassen, so dass die Werte unter Null in rot und die oben genannten in dunkelblau gefüllt sind. Wie kann ich das mit ggplot2 machen?Spezifische Füllfarben in ggplot2 durch Vorzeichen setzen

mydata = structure(list(Mealtime = "Breakfast", Food = "Rashers", `2002` = 9.12, 
          `2003` = 9.5, `2004` = 2.04, `2005` = -20.72, `2006` = 18.37, 
          `2007` = 91.19, `2008` = 94.83, `2009` = 191.96, `2010` = -125.3, 
          `2011` = -18.56, `2012` = 63.85), .Names = c("Mealtime", "Food", "2002", "2003", "2004", "2005", "2006", "2007", "2008","2009", "2010", "2011", "2012"), row.names = 1L, class = "data.frame") 
x=ggplot(mydata) + 
    aes(x=colnames(mydata)[3:13],y=as.numeric(mydata[1,3:13]),fill=sign(as.numeric(mydata[1,3:13]))) + 
    geom_bar(stat='identity') + guides(fill=F) 
print(x) 

Antwort

18

Die Art und Weise Sie Ihre Daten zu strukturieren ist nicht, wie es in ggplot2 sein sollte:

require(reshape) 
mydata2 = melt(mydata) 

Grund BarPlot:

ggplot(mydata2, aes(x = variable, y = value)) + geom_bar() 

enter image description here

Der Trick ist nun hinzufügen eine zusätzliche Variable, die angibt, ob der Wert negativ oder p ist ostive:

mydata2[["sign"]] = ifelse(mydata2[["value"]] >= 0, "positive", "negative") 

..und verwenden, die in dem Aufruf von ggplot2 (kombiniert mit scale_fill_* für die Farben):

ggplot(mydata2, aes(x = variable, y = value, fill = sign)) + geom_bar() + 
    scale_fill_manual(values = c("positive" = "darkblue", "negative" = "red")) 

enter image description here

+1

brillant. Vielen Dank. scale_fill_manual war was ich gesucht habe. Ich nehme Ihren Punkt über das Schmelzen und Neuformulieren der Daten. Ich war faul mit dem dput(). Dies funktioniert immer noch mit meinem clunkier Code '+ scale_fill_manual (Werte = c (" 1 "=" dunkelblau "," - 1 "=" rot "))' aber macht viel weniger zugänglich Analyse. –

+0

Normalerweise verwenden Sie Vektoren nicht als Ästhetik. Ästhetik ist eine Abbildung Ihrer Variablen (Spalten in einem Datenrahmen) auf Achsen in der Zeichnung. –

Verwandte Themen