首页 文章

将总观测数(n)放在ggplot中堆积百分比条形图的顶部

提问于
浏览
1

我在ggplot中有一个堆积百分比条形图,我想将总观察数放在堆叠条形图的顶部(同时保持堆叠条形图的百分比) . 然而,我一直遇到问题 .

下面是我生成百分比条形图的代码:

# sample dataset
    set.seed(123)
    cat1<-sample(letters[1:3], 500, replace=T, prob=c(0.1, 0.2, 0.65))
    cat2<-sample(letters[4:8], 500, replace=T, prob=c(0.3, 0.4, 0.75, 0.5, 0.1))
    df <- data.frame(cat1, cat2)

# the barplot
    ggplot(df, aes(x=cat1))+
    geom_bar(aes(fill = cat2),
                    position = 'fill',color = "black")+
    scale_y_continuous(labels = scales::percent)+
    labs ( y = "Percentage")+
      # this final line is me trying to add the label
      geom_text(aes(label=cat1))

# this is the observation number I want display
    table(df$cat1)

    # but I get this error:
Error: geom_text requires the following missing aesthetics: y

所以我有两个问题:

  • 如何将每个cat1 "N="标签的总观察数放在每个堆叠条的顶部)?

  • 我的代码中的条形图的y究竟是什么(aes(x = ...))?我有x,但没有y,但情节似乎有效..

谢谢!

2 回答

  • 2

    如果您使用 dplyr 来计算百分比并格式化标签,那么您采用的方法略有不同(但仍然有点不同) .

    我也改变了你的传奇以匹配图表上的顺序:)

    library(dplyr)
    
    df2 <- df %>%
      group_by(cat1, cat2) %>%
      summarise(n=n())%>%
      mutate(percent = (n / sum(n)), cumsum = cumsum(percent), label=ifelse(cat2=="h", paste0("N=", sum(n)),""))
    
      ggplot(df2,aes(x=cat1, y=percent, fill=cat2)) +
        scale_y_continuous(labels = scales::percent) +
        labs ( y = "Percentage") +
        geom_bar(position = 'fill',color = "black", stat="identity") +
        geom_text(aes(y=cumsum, label=label), vjust=-1) +
        guides(fill=guide_legend(reverse=T))
    

    enter image description here

  • 1

    你可以试试

    temp <- data.frame(x=c("a", "b", "c"), y=c(1.02, 1.02, 1.02), z=c(51, 101, 348))
    
       ggplot(df, aes(x=cat1))+
        geom_bar(aes(fill = cat2),
                        position = 'fill',color = "black")+
        scale_y_continuous(labels = scales::percent)+
        labs ( y = "Percentage")+
          # this final line is me trying to add the label
          geom_text(data=temp, aes(x=x, y=y, label=as.factor(z)))
    

    enter image description here

相关问题