gpt4 book ai didi

R:ggplot 堆积条形图,y 轴上有计数,但百分比作为标签

转载 作者:行者123 更新时间:2023-12-02 17:52:51 24 4
gpt4 key购买 nike

我正在寻找一种用百分比标记堆叠条形图的方法,同时 y 轴显示原始计数(使用 ggplot)。这是没有标签的图的 MWE:

library(ggplot2)
df <- as.data.frame(matrix(nrow = 7, ncol= 3,
data = c("ID1", "ID2", "ID3", "ID4", "ID5", "ID6", "ID7",
"north", "north", "north", "north", "south", "south", "south",
"A", "B", "B", "C", "A", "A", "C"),
byrow = FALSE))

colnames(df) <- c("ID", "region", "species")

p <- ggplot(df, aes(x = region, fill = species))
p + geom_bar()

我有一个更大的表,R 可以很好地计算每个地区的不同物种。现在,我想显示原始计数值(最好在 y 轴上)和百分比(作为标签),以比较区域之间的物种比例。

我使用geom_text()尝试了很多东西,但我认为与其他问题(e.g. this one)的主要区别在于

  • 我没有单独的 y 值列(它们只是每个区域不同物种的计数)和
  • 我需要每个区域的标签总和达到 100%(因为它们被认为代表不同的群体),而不是整个图的所有标签。

非常感谢任何帮助!!

最佳答案

正如 @Gregor 提到的,单独汇总数据,然后将数据汇总提供给 ggplot。在下面的代码中,我们使用 dplyr 动态创建摘要:

library(dplyr)

ggplot(df %>% count(region, species) %>% # Group by region and species, then count number in each group
mutate(pct=n/sum(n), # Calculate percent within each region
ypos = cumsum(n) - 0.5*n), # Calculate label positions
aes(region, n, fill=species)) +
geom_bar(stat="identity") +
geom_text(aes(label=paste0(sprintf("%1.1f", pct*100),"%"), y=ypos))

enter image description here

更新:使用 dplyr 0.5 及更高版本,您不再需要提供 y 值来使每个条中的文本居中。相反,您可以使用 position_stack(vjust=0.5):

ggplot(df %>% count(region, species) %>%    # Group by region and species, then count number in each group
mutate(pct=n/sum(n)), # Calculate percent within each region
aes(region, n, fill=species)) +
geom_bar(stat="identity") +
geom_text(aes(label=paste0(sprintf("%1.1f", pct*100),"%")),
position=position_stack(vjust=0.5))

关于R:ggplot 堆积条形图,y 轴上有计数,但百分比作为标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37817809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com