как показать «общее» в граненом графике ggplot для заполненной полосы с меткой%?

У меня такая заполненная гистограмма

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)

Если без отображения суммы в фасетке, то работает. Но из-за метода, используемого для отображения метки% данных (интересно, есть ли лучший способ), общий аспект испорчен. любой совет? Благодарю.


person santoku    schedule 05.01.2017    source источник
comment
Ожидаете ли вы, что маржа будет в диапазоне от [0,1]?   -  person Alex    schedule 05.01.2017
comment
ага, как и все залито на 100%   -  person santoku    schedule 05.01.2017


Ответы (1)


Я правильно расположил метки и заранее определил границу поля. Я думаю, это результат, которого вы ожидали. Я не мог понять, есть ли способ добиться этого с помощью facet_grid(., margin = TRUE).

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)

введите описание изображения здесь

person Alex    schedule 05.01.2017
comment
Благодарю. Я думал о чем-то похожем, например о grid.arrange. кажется, что метка на заполненной панели отображается сложно. - person santoku; 05.01.2017