2016-08-30 4 views
5

Ich möchte die Reihenfolge des Balkendiagramms nur für den letzten Satz ändern, nur um es zu markieren. Ich benutzte scale_fill_manual(), aber es half nicht viel.Ändern Sie die Füllfarbe eines der ausgewichenen Balken in ggplot

Hier ist mein Code:

x<-c(rep(c("Type1", "Type2"),4)) 
    y<-c(4,5,6,7,3,4,5,2) 
    time<-c(2010,2010,2011,2011,2012,2012,2013,2013) 
    z<-data.frame(type = x, val=y, Time = time) 

    ggplot(data = z, aes(x=Time,y=val)) + 
     geom_bar(stat = "identity", position = "dodge", aes(fill=type))+ 
     scale_fill_manual(values = c(rep(c("white", "gray51"),3),"white","red")) 

Hier ist der Ausgang:

enter image description here

ich die Grafik aussehen soll: enter image description here

Gibt es eine Möglichkeit, dies zu tun ? Ich würde jede Hilfe schätzen. Ich schaute auf change color of only one bar in ggplot, aber es scheint nicht um gruppierte Daten zu sein.

+0

Sind Sie besonders über die Legende, die kein Rot hat? Das wäre ein kniffliger Teil davon ... – Gregor

+0

@gregor Ich denke es wird besser, wenn die Legende kein Rot hat. Allerdings bin ich ein Anfänger in R und 'ggplot2'. Ich würde mich freuen, wenn Sie mir zeigen könnten, wie wir es ohne und mit Legende schaffen können. Vielen Dank für deine Hilfe. Ich schätze es sehr. – watchtower

+0

Siehe Bearbeitungen am Ende meiner Antwort, um das Rot aus der Legende herauszuhalten. – Gregor

Antwort

7

Mein allgemeines Mantra ist, dass ggplot ist sehr gut beim Plotten der Daten geben Sie es. Wenn Sie möchten, dass etwas anders gezeichnet wird, ist es am einfachsten, Ihre Daten zu ändern.

z$type2 = as.character(z$type) 
z$type2[z$type == "Type2" & z$Time == 2013] = "Type2 " 

Ich habe einen hinterhältigen zusätzlichen Platz in "Type2 " für die Zeile, die Sie hervorheben möchten. Es wird eine bestimmte Faktorstufe sein und eine eigene Farbe bekommen (und sogar in eine nette Reihenfolge unter Verwendung des alphabetischen Standards umgewandelt werden). Aber es wird im Legendenlabel gleich aussehen.

ggplot(data = z, aes(x=Time,y=val)) + 
    geom_bar(stat = "identity", position = "dodge", aes(fill=type2))+ 
    scale_fill_manual(values = c("white", "gray50", "red")) 

enter image description here

Ich dachte, dass die roten aus der Legende Weglassen wäre schwierig, aber this answer zeigte mir, dass alles, was benötigt wird, ist breaks = c("Type1", "Type2") als Argument an scale_fill_manual hinzuzufügen.

6

Was ist mit der Hervorhebung der Bar mit einem Rand. Zum Beispiel:

z$hi = with(z, ifelse(type=="Type2" & Time==2013, "Y","N")) 

ggplot(data = z, aes(x=Time,y=val)) + 
    geom_bar(stat = "identity", position = "dodge", 
      aes(fill=type, colour=hi), size=1) + 
    scale_fill_manual(values=c("gray51","white")) + 
    scale_colour_manual(values=c(NA,"red")) + 
    guides(colour=FALSE) 

enter image description here

UPDATE: Als Antwort auf Ihren Kommentar: Ich denke, ein Liniendiagramm erleichtert es, die Trends und die Beziehungen zwischen den einzelnen type zu sehen. Zum Beispiel:

ggplot(data = z, aes(x=Time,y=val,colour=type)) + 
    geom_line() + 
    geom_point() + 
    geom_point(data=z[z$hi=="Y",], aes(x=Time, y=val), size=4, pch=1, 
      colour=hcl(195,100,40), stroke=1) + 
    scale_y_continuous(limits=c(0,max(z$val))) + 
    theme_bw() 

enter image description here

+0

Sehr schöne Idee! – Gregor

+0

Danke..Gregor! – eipi10

+0

Farbe innerhalb des Anrufs ist wesentlich besser als meine zwei Schritte Lösung unten. –

1

einfach es mit der Legende zu tun, wenn Sie Benutzer aus mit der abrupten Änderung der Farbe zu werfen, vorsichtig sein mögen. Fügen Sie Ihrer x-Variablen einfach eine zusätzliche Kategorie hinzu, um anzugeben, wo Sie die Hervorhebung vornehmen möchten.

x<- xHigh <- c(rep(c("Type1", "Type2"),4)) 
xHigh[length(xHigh)] <- "Type2_highlight" 

myHighlight <- rep("No",length(x)) 
myHighlight[length(myHighlight)] <- "Yes" 
y<-c(4,5,6,7,3,4,5,2) 
time<-c(2010,2010,2011,2011,2012,2012,2013,2013) 
z<-data.frame(type = x, xHigh = xHigh, val=y, Time = time, myHighlight = myHighlight) 

ggplot(data = z, aes(x=Time,y=val)) + 
    geom_bar(stat = "identity", position = "dodge", aes(fill=xHigh))+ 
    scale_fill_manual(values = c(Type1 = "white", Type2 = "gray51", Type2_highlight = "red")) 

enter image description here

Eine andere mögliche Option für eine bestimmte Bar hervorzuheben ist ein Feld um es zu zeichnen, etwa so:

ggplot(data = z, aes(x=Time,y=val)) + 
    geom_bar(stat = "identity", position = "dodge", aes(fill=type))+ 
    scale_fill_manual(values = c(Type1 = "white", Type2 = "gray51")) + 
    geom_bar(aes(linetype = xHigh) 
      , fill = NA 
      , stat = "identity", position = "dodge" 
      , col = "red" 
      , show.legend = FALSE) + 
    scale_linetype_manual(values = c(Type1 = 0 
            , Type2 = 0 
            , Type2_highlight = 1)) 

enter image description here

Hoffnung, das hilft.

Verwandte Themen