2013-08-29 14 views
6

Utworzyłem tę działkę z następującego kodu:Label bar działka z geom_text w ggplot

library(ggplot2); library(reshape2); library(plyr) 

likert <- data.frame(age = c(rep("young", 5), rep("middle", 5), rep("old", 5)), 
        score1 = c(rep("unlikely", 1), rep("likely", 1), rep("very likely", 13)), 
        score2 = c(rep("disagree", 6), rep("neutral", 4), rep("agree", 5)), 
        score3 = c(rep("no", 5), rep("maybe", 7), rep("yes", 3))) 

meltedLikert <- melt(dlply(likert, .(age), function(x) llply(x, table))) 

names(meltedLikert) <- c("score", "count", "variable", "age") 

ggplot(meltedLikert[meltedLikert$variable != "age",], aes(variable, count, fill=score)) + 
    geom_bar(position="dodge", stat="identity") + 
    geom_text(data=data.frame(meltedLikert), aes(variable, count, group=score, label=meltedLikert$score), size=4) + 
    facet_grid(age ~ .) 

enter image description here

Jak mogę oznaczyć tekst pozycji więc każda etykieta score siedzi nad odpowiadającym baru variable na szczycie każdego paska?

Odpowiedz

10

Zgodnie z odpowiedzią na linked question, dodając position = position_dodge(width=0.9) do geom_text linii przywołać wartości:

ggplot(meltedLikert[meltedLikert$variable != "age",], 
     aes(variable, count, fill=score)) + 
    geom_bar(position="dodge", stat="identity") + 
    geom_text(data=data.frame(meltedLikert), 
      aes(variable, count, group=score, label=meltedLikert$score), 
      position = position_dodge(width=0.9), 
      size=4) + 
    facet_grid(age ~ .) 

enter image description here

Jednak chciałem też zwrócić uwagę na kilka innych rzeczy. Nie powinieneś używać numeru meltedLikert$score w rozmowie; powinieneś odnosić się tylko do rzeczy w ramce danych, która jest przekazywana jako data. Ponadto, meltedLikert jest już data.frame, więc wywołanie na nim data.frame() nie jest konieczne (choć nie wyrządza żadnej szkody).

Rzeczywistym ulepszeniem jest sposób tworzenia tabulacji na początek. Rozważ to zamiast:

tabulatedLikert <- ldply(likert[-1], function(sc) { 
    as.data.frame(table(age = likert$age, score = sc)) 
}) 
ggplot(tabulatedLikert, aes(x=.id, y=Freq, fill=score)) + 
    geom_bar(position="dodge", stat="identity") + 
    geom_text(aes(label=score), position=position_dodge(width=0.9), size=4) + 
    facet_grid(age ~ .) 

enter image description here

Można ustalić kolejność barach mocując je w oryginalnych danych:

likert2 <- mutate(likert, 
        score1 = factor(score1, levels=c("unlikely", "likely", "very likely")), 
        score2 = factor(score2, levels=c("disagree", "neutral", "agree")), 
        score3 = factor(score3, levels=c("no", "maybe", "yes"))) 
tabulatedLikert2 <- ldply(likert2[-1], function(sc) { 
    as.data.frame(table(age = likert2$age, score = sc)) 
}) 
ggplot(tabulatedLikert2, aes(x=.id, y=Freq, fill=score)) + 
    geom_bar(position="dodge", stat="identity") + 
    geom_text(aes(label=score), position=position_dodge(width=0.9), size=4) + 
    facet_grid(age ~ .) 

enter image description here

Oczywiście, w tym momencie kolory nie dodają niczego, ponieważ wszystko jest oznaczone bezpośrednio na wykresie, więc po prostu pozbyłbym się ich całkowicie.

ggplot(tabulatedLikert2, aes(x=.id, y=Freq, group=score)) + 
    geom_bar(position="dodge", stat="identity", fill="gray70") + 
    geom_text(aes(label=score), position=position_dodge(width=0.9), size=4) + 
    facet_grid(age ~ .) 

enter image description here

+0

Dzięki za odpowiedź w głębi - Nauczyłem się dużo tam – luciano

+0

Kolejna możliwo: 'ggplot (tabulatedLikert2, AES (x = wynik, y = Freq)) + geom_bar (stat =” identity ", fill =" gray70 ") + geom_text (aes (label = score), size = 4) + facet_grid (wiek ~ .id, skale =" free_x ")' – bdemarest

Powiązane problemy