首页 文章

在R的ggplot2中,如何将百分比标签添加到堆叠的条形图中,百分比值来自不同的列?

提问于
浏览
3

我在R中成功制作了一个堆积的条形图,其中几个不同类别的百分比加起来为100% . 我在这里做了一个示例数据帧 .

example.Category<- c("Cat1","Cat2","Cat3","Cat4","Cat5","Cat6")
percent.good <- c(.25,.29,.45,.5,.8,.82)
example.data <- data.frame(example.Category,percent.good)
example.data$percent.bad <- (1-example.data$percent.good)

数据框看起来像这样 .

example.Category percent.good percent.bad
1             Cat1         0.25        0.75
2             Cat2         0.29        0.71
3             Cat3         0.45        0.55
4             Cat4         0.50        0.50
5             Cat5         0.80        0.20
6             Cat6         0.82        0.18

然后我用reshape包中的熔化来得到这个......

example.melt <- melt(example.data, id.vars="example.Category")

   example.Category     variable value
1              Cat1 percent.good  0.25
2              Cat2 percent.good  0.29
3              Cat3 percent.good  0.45
4              Cat4 percent.good  0.50
5              Cat5 percent.good  0.80
6              Cat6 percent.good  0.82
7              Cat1  percent.bad  0.75
8              Cat2  percent.bad  0.71
9              Cat3  percent.bad  0.55
10             Cat4  percent.bad  0.50
11             Cat5  percent.bad  0.20
12             Cat6  percent.bad  0.18

然后我使用ggplot制作显示这些百分比的堆积条形图 .

ggplot(example.melt, aes(x=example.Category, y=value, fill = variable)) +
  geom_bar(position = "fill", stat = "identity",color='black',width=0.9) +
  scale_y_continuous(labels = scales::percent) +
  geom_text(aes(label = paste0((example.data$percent.good && example.data$percent.bad)*100), '%'),position = position_dodge(width = .9),size = 3)

这产生了这个图,这是我想要的,除了它标记的方式 .
Graph

我想要做的是每个堆叠条上的每种颜色都有百分比标签,我不知道如何做到这一点,并且我确信我做得不对 . 我设法做的就是以某种方式创建另一个有100个左右的类别 . 如何在条形图的每个部分显示百分比标签?

我希望这不是多余的/先问过 . 谢谢 .

2 回答

  • 3

    你可以这样做......

    #set positions for labels
    example.melt$labelpos <- ifelse(example.melt$variable=="percent.bad",
                             example.melt$value/2, 1 - example.melt$value/2)
    ggplot(example.melt, aes(x=example.Category, y=value, fill = variable)) +
      geom_bar(position = "fill", stat = "identity",color='black',width=0.9) +
      scale_y_continuous(labels = scales::percent) +
    #use positions to plot labels
      geom_text(aes(label = paste0(100*value,"%"),y=labelpos),size = 3)
    

    enter image description here

  • 2

    这会给你asnwer:

    ggplot(example.melt, aes(x=example.Category, y=value, fill = variable)) +
      geom_bar(position = "fill", stat = "identity",color='black',width=0.9) +
      scale_y_continuous(labels = scales::percent) +
      geom_text(aes(label = paste0(value*100,"%")), 
                position = position_stack(vjust = 0.5), size = 2)
    

    情节看起来像这样:

    enter image description here

相关问题