[英]R, ggplot stacked bar-chart with position = “fill” and labels
我正在使用ggplot2
,使用geom_bar()
的position = "fill"
选项将堆叠的barplot设置为具有相对值的100%。
这是我的代码:
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))
但是结果不好。 我没有运气地尝试过hjust
和vjust
参数,还使用了类似的方法:
plot + geom_text(aes(label=y/sum(y), size=4))
但是我没有达到所需的结果(我没有添加所有测试,以使无用的图像不会使问题超载,如果需要,请询问!)。
知道要有一些不错的居中标签吗?
label
指定显示什么 , y
指定where
展示。 由于您正在使用position = "fill"
y轴比例,因此需要使用累积总和以每个 x
的比例来计算标签位置( geom_text(aes(y = ...))
)。 另外,要仅显示给定颜色的总比例,您将需要为每个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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.