2013-08-29 2 views
6

Я создал этот участок с помощью следующего кода:этикетки бар участок с geom_text в 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

Как я могу маркировать текст позиции, так что каждый ярлык score сидит над соответствующей панелью для variable наверху каждого бара?

ответ

10

В соответствии с ответом на linked question, добавляя position = position_dodge(width=0.9) к geom_text вызова линий до значений:

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

Однако, я также хотел бы отметить несколько других вещей. Вы не должны использовать meltedLikert$score в вызове aes(); вы должны ссылаться только на вещи в кадре данных, которые передаются как data. Кроме того, meltedLikert уже есть data.frame, поэтому называть data.frame() не нужно (хотя и не навреди).

Реальное улучшение заключается в том, как вы создаете свои табуляции для начала. Рассмотрим вместо этого:

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

Вы можете установить порядок расположения стержней, фиксируя их в исходных данных:

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

Конечно, в этой точке , цвета фактически ничего не добавляют, поскольку все помечено непосредственно на графике, поэтому я просто полностью избавлюсь от них.

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

Спасибо за ответ в глубине - я узнал много там – luciano

+0

Другой Possiblity: 'ggplot (tabulatedLikert2, АЕС (х = оценка, у = Freq)) + geom_bar (стат =» идентичность ", fill =" gray70 ") + geom_text (aes (label = score), size = 4) + facet_grid (age ~ .id, scale =" free_x ")' – bdemarest

Смежные вопросы