首页 > 解决方案 > R,ggplot堆积条形图位置=“填充”和标签

问题描述


我正在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

结果如下:

在此处输入图像描述

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

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

但结果并不好。我尝试了没有运气的hjustandvjust参数,并且还使用了类似的东西:

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

但是我没有达到所需的结果(我没有添加所有测试,以免用无用的图像使问题超载,如果需要,请询问!)。
关于有一些不错的居中标签的任何想法?

标签: rggplot2bar-chart

解决方案


label指定显示的内容,并y指定where要显示的内容。由于您使用 y 轴的比例position = "fill",因此您需要根据每个使用累积和geom_text(aes(y = ...))的比例来计算标签位置 ( ) 。此外,要仅显示给定颜色的总比例,您需要为每个 x、k 组合提取第 N 行。在这里,我正在构建一个单独的数据集,用于显示自定义标签: xtest_labelsgeom_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

在此处输入图像描述


推荐阅读