2016-05-25 3 views
1

Я хотел бы добавить% -figures на заполненный barplot. Вот сюжет с ярлыками в неправильных местах:ggplot2: Добавить метку на штриховом шкафу, если position = "fill"

enter image description here

Вот это dataframe:

x0 <- expand.grid(grp = c("G1","G2") 
       , treat = c("T1","T2") 
       , out = c("out1","out2","out3","out4") 
) 
set.seed(1234) 
x0$n <- round(runif(16,0,1)*100,0) 
head(x0) 
    grp treat out n 
1 G1 T1 out1 11 
2 G2 T1 out1 62 
3 G1 T2 out1 61 
4 G2 T2 out1 62 
5 G1 T1 out2 86 
6 G2 T1 out2 64 

Теперь я добавляю сумму в GRP/лечения к dataframe (с использованием SQL, извините!):

x0 <- sqldf(paste("SELECT a.*, (SELECT SUM(n)" 
        ,"   FROM x0 b" 
        ,"   WHERE a.grp = b.grp" 
        ,"     AND a.treat = b.treat" 
        ,"   ) tot" 
        ," FROM x0 a" 
        ," ORDER BY a.grp,a.treat,a.out" 
       ) 
      ) 
x0$p <- with(x0, n/tot) 
x0$p2 <- with(x0, paste(formatC(p*100, digits=2 
       , format="fg"),"%",sep="")) 
head(x0) 
    grp treat out n tot   p p2 
1 G1 T1 out1 11 192 0.05729167 5.7% 
2 G1 T1 out2 86 192 0.44791667 45% 
3 G1 T1 out3 67 192 0.34895833 35% 
4 G1 T1 out4 28 192 0.14583333 15% 
5 G1 T2 out1 61 160 0.38125000 38% 
6 G1 T2 out2 1 160 0.00625000 0.62% 

А вот как я получаю сюжет:

ggplot(x0, aes(grp, weight=n)) + 
     geom_bar(aes(fill = out), position = "fill") + 
     facet_grid(.~treat) + 
     scale_y_continuous(labels=percent) + 
     geom_text(aes(label=p2, y=p)) 

Я могу добавить новую переменную в dataframe с кумулятивным процентом, но мне интересно, есть ли более простой способ добавления меток.

+1

[Этот вопрос/ответ] (http://stackoverflow.com/questions/6644997/showing-data-values-on-stacked-bar-chart-in-ggplot2) показывает решения, которые я видел чаще всего. Использование 'position =" stack "' в 'geom_text' или создание новой переменной для позиции по оси y. – aosmith

+0

@aosmith Спасибо. Добавление 'position =" stack "' дает то же самое. Я просмотрел другие SO-записи об этой проблеме (например, ваша ссылка). Основное отличие состоит в том, что я использую опцию 'position =" fill "' в 'geom_bar()'. – giordano

+0

Вы добавили 'position =" stack "' to 'geom_text' (а не' geom_bar')? Этот вариант отлично подходит для меня, если я добавлю его в свой код. Вы можете обнаружить, что вам нужно что-то делать с очень небольшими процентами. Возможно, что-то вроде 'label = ifelse (p <.05, NA, p2)'. – aosmith

ответ

2

Чтобы не создавать значения позиции самостоятельно, вы можете использовать position = "stack" в geom_text, как в this question. Как вы отметили в комментариях, набор данных должен быть упорядочен переменной fill, чтобы получить стеки в правильном порядке, чтобы они соответствовали стекам баров.

ggplot(x0, aes(grp, weight = n)) + 
    geom_bar(aes(fill = out), position = "fill") + 
    facet_grid(.~treat) + 
    scale_y_continuous(labels=percent) + 
    geom_text(aes(label = p2, y=p), position = "stack") 

enter image description here

Вы можете в конечном итоге нужно удалить ярлыки ниже определенного размера, чтобы удалить перекрытие видно в приведенном выше участке. Что-то вроде geom_text(aes(label = ifelse(p < .05, NA, p2), y = p), position = "stack") удалит ярлыки для очень маленьких значений.