Positioning values of stacked barchart in the cent

2019-03-05 13:43发布

This question already has an answer here:

I've created a stacked barchart and faceted using two variables. I'm unable to position the values in the barchart in the middle, it either appears at the extremes or overlaps. The expected image is the following:

link to the image

I've pasted the script below. Any help would be appreciated.

library(dplyr)

library(reshape2)

library(ggplot2)


year<-c("2000","2000","2010","2010","2000","2000","2010","2010")

area<-c("Rural","Rural","Rural","Rural","Urban","Urban","Urban","Urban")

sex<-c("Male","Female","Male","Female","Male","Female","Male","Female")

city<-c(58,61,74,65,51,55,81,54)`

village<-c(29,30,20,18,42,40,14,29)

town<-c(13,9,6,17,7,5,5,17)

data<-cbind.data.frame(year,area,sex,city,village,town)

dre<-melt(data,id.vars = c("year","area","sex"))

dre <- arrange(dre,year,area,sex,variable) %>% 
    mutate(pos = cumsum(value) - (0.5 * value))


a <- ggplot(dre,aes(factor(sex),value,fill=variable)) + 
    geom_bar(stat='identity',position="stack")

b <- a + 
    facet_wrap(factor(year)~area)

c <- b + 
geom_text(aes(label=paste0(value,"%"),y=pos),
        position="stack",size=2,hjust=0.85,color="black")

d <- c + 
    coord_flip() + 
    theme_bw() + 
    scale_fill_brewer()

print(d)

1条回答
虎瘦雄心在
2楼-- · 2019-03-05 14:04

You no longer need to calculate the position variable. Starting in ggplot2_2.2.0, text can be stacked and centered via position_stack.

The relevant line of geom_text code is below. Notice I don't need to use the "pos" variable at all for text placement.

geom_text(aes(label=paste0(value,"%")),
              position = position_stack(vjust = .5), size = 2, color = "black")

The code for the plot and the resulting graph:

ggplot(dre, aes(factor(sex), value, fill = variable)) + 
    geom_col() +
    facet_wrap(factor(year)~area) +
    geom_text(aes(label = paste0(value,"%")),
              position = position_stack(vjust = .5), size = 2, color = "black") +
    coord_flip() +
    theme_bw() +
    scale_fill_brewer() 

enter image description here

查看更多
登录 后发表回答