2017-01-05 2 views
3

Ich habe eine gefüllte Balkendiagramm wie dieseWie zeige ich 'total' in facettiertem ggplot für gefüllte Balken mit% label?

library(dplyr) 
library(ggplot2) 

df <- data.frame(facet=c(rep(1,6),rep(2,6)),type=rep(c('a','b','c'),2), subtype=c('x','y'), value=c(10,20,30,10,50,70)) 

df %>% group_by(type, facet) %>% 
mutate(pct=value/sum(value)) %>% 
mutate(pos=cumsum(pct) - (0.5 * pct)) %>% 
ggplot(aes(type, pct, fill=subtype)) + geom_bar(stat='identity') + 
geom_text(aes(label=paste0(round(100*pct, 0), '%'),y=pos)) + facet_grid(.~facet, margins=TRUE) 

Wenn ohne Gesamt zeigt in Facettierung es funktioniert. Aber aufgrund der Methode, die verwendet wird, um% data label anzuzeigen (ich frage mich, ob es einen besseren Weg gibt), wird die gesamte Facette durcheinander gebracht. irgendein Rat? Vielen Dank.

+0

Haben Sie die Marge erwarten von [0,1] im Bereich sein? – Alex

+0

yup, wie in allen zu 100% gefüllt – santoku

Antwort

5

Ich ordnete die Etiketten richtig an und legte die Margin-Plot vorher fest. Ich denke, das ist die Ausgabe, die Sie erwartet haben. Ich konnte nicht herausfinden, ob es einen Weg gibt, dies mit zu erreichen.

df <- data.frame(facet=c(rep(1,6),rep(2,6)),type=rep(c('a','b','c'),2), 
       subtype=c('x','y'), value=runif(12, 0, 100)) 

df1 <- df %>% 
     arrange(desc(subtype)) %>% 
     mutate(facet = factor(facet, levels = c("1", "2", "(all)"))) %>% 
     group_by(type, facet) %>% 
     mutate(pct=value/sum(value), 
       pos=cumsum(pct) - (0.5 * pct)) 

df2 <- df1 %>% 
     group_by(type, subtype) %>% 
     summarise(facet = factor("(all)", levels = c("1", "2", "(all)")), 
       pct = sum(pct)/2, 
       pos = sum(pos/2)) 

    bind_rows(df1, df2) %>% 
    ggplot(aes(type, pct, fill=subtype)) + 
    geom_bar(stat='identity', position = "stack") + 
    geom_text(aes(label=paste0(round(100*pct, 0), '%'),y=pos)) + 
    facet_grid(.~facet) 

enter image description here

+0

danke. Ich dachte an etwas Ähnliches wie grid.arrange. scheint das Label auf gefüllten Balken knifflig zu sein. – santoku

Verwandte Themen