2016-11-23 2 views
0

Ich möchte, dass meine Balken rot sind, wenn der Wert unter Null liegt. Dies ist nicht die Daten selbst arbeite ich mit, aber ich hoffe, dass dies ein reproduce-able Beispiel schaffen:Farbgebung von geom_bars basierend auf Werten im Datensatz

library(ggplot2) 
library(car) 

mtcars$carnames <- rownames(mtcars) 
rownames(mtcars) <- 1:nrow(mtcars) 

subsetCars <- as.data.frame(head(mtcars, n = 20)) 
subsetCars[1,4] <- -50 

myplot.p <- ggplot(subsetCars, aes(x = subsetCars$carnames, y = subsetCars$hp)) 
myplot.p + geom_bar(stat = 'identity', 
        fill = ifelse(subsetCars$hp > 0, "lightblue", "firebrick")) + 
    coord_flip() 

link to cars barplot

Eine Bar ist rot gefärbt, aber nicht der mit dem negativen Wert. Ich habe ein ähnliches Problem mit dem aktuellen Viz, an dem ich auch arbeite. Beratung?

+0

Es funktioniert gut für mich. Sie müssen jedoch nicht die '$' Teilmenge in 'aes' verwenden, wenn Sie einen' data' Parameter angeben; Gib einfach den nackten Variablennamen ein. – alistaire

+0

Vielen Dank für die Bearbeitung! Ich kann noch keine Bilder posten, also musste ich einen Link bereitstellen. –

Antwort

2

Beachten Sie, dass Ihr fill Argument in geom_bar einen Vektor von ifelse, von denen das erste Element ist „feuerfesten Steinen“ und alle anderen Elemente sind „light“ erstellt nimmt. Also wird der erste (unterste) Balken mit rot gefüllt. Der erste Balken entspricht jedoch nicht der Zeile mit dem negativen Wert, da die Beobachtungen von carnames in alphabetischer Reihenfolge nachbestellt wurden.

Ein idiomatischer Weg, um Ihr gewünschtes Diagramm Plotten ist

myplot.p <- ggplot(subsetCars, aes(x = carnames, y = hp, fill = hp < 0)) 
myplot.p + geom_bar(stat = 'identity') + 
    scale_fill_manual("Negative hp", values = c("lightblue", "firebrick")) + 
    coord_flip() 

wo das $ subsetting nicht erforderlich ist, wie @alistaire wies darauf hin, und die fill Ästhetik kann in ggplot() angegeben werden.

enter image description here

+0

Ich denke ich verstehe. Scale_fill sucht also tatsächlich nach der Fill-Deklaration in AES und ändert dann die Füllung basierend auf diesem Argument und dem Argument innerhalb der Werte? –

+0

Das ist die richtige Idee, ja. –

0

Das Problem, das Sie haben, ist, dass, wenn Sie die Füllung angeben, ggplot nicht ist, dass Ästhetik in der gleichen Reihenfolge zuweisen, dass es für den Namen. Um sicherzustellen, dass die Reihenfolge erhalten bleibt, müssen Sie die Variable größer als Null in die andere Ästhetik einfügen.

Der unglückliche Nebeneffekt davon ist, dass Sie die Farben manuell einstellen und die Füllskala-Legende entfernen müssen.

ggplot(subsetCars, aes(x = subsetCars$carnames, y = subsetCars$hp, 
fill = hp > 0)) + 
geom_bar(stat = 'identity') + 
coord_flip() + 
scale_fill_manual(values = c("TRUE" = "lightblue", 
"FALSE" = "firebrick")) + 
theme(legend.position = "none") 

Ich hoffe, dass hilft!

+0

Beide Antworten funktionieren! Vielen Dank. Leider ist mein Ruf zu niedrig, um eine Antwort zu geben. –

Verwandte Themen