2016-08-30 6 views
5

Chcę zmienić kolejność wykresu słupkowego tylko dla ostatniego zestawu, aby go podświetlić. Użyłem scale_fill_manual(), ale to nie pomogło.Zmień kolor wypełnienia jednego z dodanych słupków w ggplot

Oto mój kod:

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")) 

Oto wynik:

enter image description here

Chcę wykres wyglądać: enter image description here

Czy jest jakiś sposób mogę to zrobić ? Byłbym wdzięczny za każdą pomoc. Spojrzałem na change color of only one bar in ggplot, ale wydaje się, że nie dotyczy to zgrupowanych danych.

+0

Chcesz się dowiedzieć, że legenda nie ma czerwonego? To byłaby podstępna część tego ... – Gregor

+0

@regregor Myślę, że będzie lepiej, jeśli legenda nie będzie miała koloru czerwonego. Jednak jestem początkujący w R i 'ggplot2'. Byłbym wdzięczny, gdybyś mógł mnie poprowadzić, jak możemy to zrobić bez i z legendą. Dziękuję bardzo za Twoją pomoc. Bardzo to doceniam. – watchtower

+0

Zobacz edycje na końcu mojej odpowiedzi, aby nie wyświetlać czerwonej legendy. – Gregor

Odpowiedz

7

Moja ogólna mantra jest taka, że ​​ggplot jest bardzo dobry w wykreślaniu danych, które mu dajesz. Jeśli chcesz, aby działał inaczej, najłatwiej jest zmodyfikować dane.

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

dodałem ukrytych dodatkową przestrzeń w "Type2 " dla wiersza, który chcesz zaznaczyć. Będzie to odrębny poziom czynników i otrzyma swój własny kolor (a nawet zostanie wymyślony w ładnym porządku przy użyciu alfabetycznego ustawienia domyślnego). Ale będzie wyglądać tak samo w etykiecie legendy.

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

Myślałem, że pomijając czerwony z legendy byłoby trudne, ale this answer pokazał mi, że wszystko, co jest potrzebne, aby dodać breaks = c("Type1", "Type2") jako argument do scale_fill_manual.

6

Co z podświetleniem paska z obramowaniem. Na przykład:

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: W odpowiedzi na Twój komentarz: Myślę działka linia sprawia, że ​​łatwiej zobaczyć trendy i relacje między każdym type. Na przykład:

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

Bardzo fajny pomysł! – Gregor

+0

Dzięki..Gregor! – eipi10

+0

Kolor wewnątrz połączenia jest znacznie lepszy niż moje rozwiązanie dwustopniowe poniżej. –

1

Łatwo to zrobić z legendą, choć może chcesz być ostrożny o wyrzucanie użytkowników off z nagłą zmianą koloru. Po prostu dodaj dodatkową kategorię do zmiennej x, aby wskazać miejsce, w którym chcesz podświetlić.

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

Innym potencjalnym rozwiązaniem dla podkreślając szczególny pasek jest narysować pole wokół niego, tak jak poniżej:

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

nadzieję, że pomoże.