2012-11-12 13 views
10

Jestem nowicjuszem R, więc proszę wybacz moją niewiedzę. Zrobiłem pseudo-stacked barplot, w którym narysowałem 4 zestawy pasków jeden na drugim za pomocą geom_bar. Istnieją 4 kategorie stanu zdrowia (żywe, martwe, zarażone, & zamarznięte) dla trzech gatunków dębów (QUAG, QUKE, QUCH).Dodaj legendę do "geom_bar" używając pakietu ggplot2

Mój kod wygląda następująco:


x <- as.data.frame(list(variable=c("QUAG", "QUKE", "QUCH"), alive = c(627,208,109), infected = c(102,27,0), dead = c(133,112,12), sod.dead=c(49,8,0))) 

x.plot = ggplot(x, aes(variable, alive)) + geom_bar(fill="gray85") + 
    geom_bar(aes(variable,dead), fill="gray65") + 
    geom_bar(aes(variable, infected), fill="gray38") + 
    geom_bar(aes(variable, sod.dead), fill="black")+ 
    opts(panel.background = theme_rect(fill='gray100')) 
x.plot 

Teraz chcę uczynić legendę, która pokazuje, który odcień szarości dotyczy stanu drzewa, czyli „gray65” to „martwe drzewa "itd. Próbowałem przez ostatnią godzinę i nie mogę go uruchomić.

+3

+1 do zwięzłego powtarzalny przykładzie. – mnel

Odpowiedz

2

Musisz zmienić swoje dane.

library(reshape) 
library(ggplot2) 

x <- as.data.frame(list(variable=c("QUAG", "QUKE", "QUCH"), alive = c(627,208,109), infected = c(102,27,0), dead = c(133,112,12), sod.dead=c(49,8,0))) 

x <- melt(x) 
colnames(x) <- c("Type","Status","value") 

ggplot(x, aes(Type, value, fill=Status)) + geom_bar(position="stack") 
+0

Dzięki Brandon! –

8

Widzę, że @Brandon Bertelsen opublikował świetną odpowiedź. Chciałbym dodać kod, który rozwiązuje dodatkowe informacje wymienione w oryginalny post:

  1. Po zmienią swoje dane i mapy stanu zdrowia do fill, ggplot stworzy legendę automatycznie.
  2. Proponuję użyć scale_fill_manual(), aby uzyskać dokładne odcienie szarości wymienione w oryginalnym poście.
  3. theme_bw() to przydatna funkcja, która pozwala szybko uzyskać czarno-biały wygląd na działce.
  4. Kolejność drukowania poziomów czynników/kolorów można kontrolować, określając żądane zamówienie za pomocą argumentu levels o wartości factor().
  5. Uszkodzony barplot (zamiast skumulowanego) może mieć pewne zalety dla tego zestawu danych.

library(reshape2) 
library(ggplot2) 

x <- as.data.frame(list(variable=c("QUAG", "QUKE", "QUCH"), 
         alive=c(627, 208, 109), infected=c(102, 27, 0), 
         dead=c(133, 112, 12), sod.dead=c(49, 8, 0))) 

# Put data into 'long form' with melt from the reshape2 package. 
dat = melt(x, id.var="variable", variable.name="status") 

head(dat) 
# variable status value 
# 1  QUAG alive 627 
# 2  QUKE alive 208 
# 3  QUCH alive 109 
# 4  QUAG infected 102 
# 5  QUKE infected 27 
# 6  QUCH infected  0 

# By manually specifying the levels in the factor, you can control 
# the stacking order of the associated fill colors. 
dat$status = factor(as.character(dat$status), 
        levels=c("sod.dead", "dead", "infected", "alive")) 

# Create a named character vector that relates factor levels to colors. 
grays = c(alive="gray85", dead="gray65", infected="gray38", sod.dead="black") 

plot_1 = ggplot(dat, aes(x=variable, y=value, fill=status)) + 
     theme_bw() + 
     geom_bar(position="stack") + 
     scale_fill_manual(values=grays) 

ggsave(plot=plot_1, filename="plot_1.png", height=5, width=5) 

enter image description here

# You may also want to try a dodged barplot. 
plot_2 = ggplot(dat, aes(x=variable, y=value, fill=status)) + 
     theme_bw() + 
     geom_bar(position="dodge") + 
     scale_fill_manual(values=grays) 

ggsave(plot=plot_2, filename="plot_2.png", height=4, width=5) 

enter image description here

+2

+1 za wykonanie dodatkowej pracy. –

+0

Oba podejścia zadziałały. Dziękuję bardzo! Właśnie zamówiłem książkę "ggplot2", więc mam nadzieję, że dostanę tak dobrze, jak oboje. –

Powiązane problemy