代码之家  ›  专栏  ›  技术社区  ›  s__

r,ggplot带position=“fill”和标签的堆积条形图

  •  1
  • s__  · 技术社区  · 6 年前


    我在和 ggplot2 ,使用 position = "fill" 选择权 geom_bar() .
    这里是我的代码:

    test <- data.frame (x = c('a','a','a','b','b','b','b')
            ,k = c('k','j','j','j','j','k','k')
            ,y = c(1,3,4,2,5,9,7))
    
    plot <- ggplot(test, aes(x =x, y = y, fill = k)) 
    plot <- plot + geom_bar(position = "fill",stat = "identity") 
    plot <- plot +  scale_fill_manual(values = c("#99ccff", "#ff6666"))
    plot <- plot  + geom_hline(yintercept = 0.50)+ggtitle("test")
    plot
    

    结果如下:

    enter image description here

    但是,我需要在各种栏上,也在“子栏”上添加标签。为此,我使用geom_text():

    plot  + geom_text(aes(label=y, size=4))
    

    但结果并不好。我没有运气 hjust vjust 参数,也可以使用类似于:

    plot  + geom_text(aes(label=y/sum(y), size=4))
    

    但我没有达到所需的结果(我没有添加所有的测试,以避免用无用的图像重载问题,如果需要,请提问!).
    有什么好的居中标签吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   acylam    6 年前

    label 指定 什么 展示,以及 y 指定 where 展示。因为你在Y轴上使用比例 position = "fill" ,需要计算标签位置( geom_text(aes(y = ...)) )按比例 对于每一个 x 使用累积和。此外,要仅显示给定颜色的总比例,需要为每个x,k组合提取第n行。在这里,我正在建立一个独立的 test_labels 用于的数据集 geom_text 要显示自定义标签:

    test <- data.frame (x = c('a','a','a','b','b','b','b'),
                        k = c('k','j','j','j','j','k','k'),
                        y = c(1,3,4,2,5,9,7))
    
    test_labels = test %>%
      arrange(x, desc(k)) %>%
      group_by(x) %>%
      mutate(ylabel_pos = cumsum(y)/sum(y),
             ylabel = y/sum(y)) %>%
      group_by(k, add = TRUE) %>%
      mutate(ylabel = sum(ylabel)) %>%
      slice(n())
    
     ggplot(test, aes(x =x, y = y, fill = k)) +
      geom_bar(position = "fill", stat = "identity") +
      scale_fill_manual(values = c("#99ccff", "#ff6666")) +
      geom_hline(yintercept = 0.50) + 
      geom_text(data = test_labels, 
                aes(y = ylabel_pos, label=paste(round(ylabel*100,1),"%")), 
                vjust=1.6, color="white", size=3.5) +
      ggtitle("test")
    

    结果:

    > test_labels
    # A tibble: 4 x 5
    # Groups:   x, k [4]
           x      k     y ylabel_pos    ylabel
      <fctr> <fctr> <dbl>      <dbl>     <dbl>
    1      a      j     4  1.0000000 0.8750000
    2      a      k     1  0.1250000 0.1250000
    3      b      j     5  1.0000000 0.3043478
    4      b      k     7  0.6956522 0.6956522
    

    enter image description here