R 在堆叠条形图上按列显示百分比
我试图绘制一个堆叠条形图,显示一列中每组的相对百分比 以下是我的问题的示例,使用默认mpg数据集:R 在堆叠条形图上按列显示百分比,r,plot,ggplot2,R,Plot,Ggplot2,我试图绘制一个堆叠条形图,显示一列中每组的相对百分比 以下是我的问题的示例,使用默认mpg数据集: mpg %>% ggplot(aes(x=manufacturer, group=class)) + geom_bar(aes(fill=class), stat="count") + geom_text(aes(label=scales::percent(..prop..)), stat="count", position=position_stack(vjus
mpg %>%
ggplot(aes(x=manufacturer, group=class)) +
geom_bar(aes(fill=class), stat="count") +
geom_text(aes(label=scales::percent(..prop..)),
stat="count",
position=position_stack(vjust=0.5))
这是输出:
我的问题是,这个输出显示的是每个类别占总数的百分比,而不是每个制造商内部的相对百分比
例如,我希望第一列(奥迪)显示83.3%(15/18)的棕色(紧凑型)和16.6%(3/18)的绿色(中型)
我在这里发现了一个类似的问题:
但我想知道在ggplot2中是否有一种更简单的方法来实现这一点,特别是因为我的实际数据集在最终将数据传输到ggplot2之前使用了一堆dplyr管道来对数据进行处理。如果绘图需要在彩色条形图的顶部使用数字和百分比作为文本,以帮助我们看到差异,也许最好以简单的表格形式呈现结果:
round(prop.table(table(mpg$class, mpg$manufacturer), margin = 2), 3) * 100
# audi chevrolet dodge ford honda hyundai jeep land rover lincoln mercury nissan pontiac subaru toyota volkswagen
# 2seater 0.0 26.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
# compact 83.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.4 0.0 28.6 35.3 51.9
# midsize 16.7 26.3 0.0 0.0 0.0 50.0 0.0 0.0 0.0 0.0 53.8 100.0 0.0 20.6 25.9
# minivan 0.0 0.0 29.7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
# pickup 0.0 0.0 51.4 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.6 0.0
# subcompact 0.0 0.0 0.0 36.0 100.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 28.6 0.0 22.2
# suv 0.0 47.4 18.9 36.0 0.0 0.0 100.0 100.0 100.0 100.0 30.8 0.0 42.9 23.5 0.0
如果我将你的问题与你给出的链接进行比较,区别在于链接“计算”了他们自己。我就是这么做的。我不确定这是否适合你的真实数据
library(ggplot2)
library(dplyr)
mpg %>%
mutate(manufacturer = as.factor(manufacturer),
class = as.factor(class)) %>%
group_by(manufacturer, class) %>%
summarise(count_class = n()) %>%
group_by(manufacturer) %>%
mutate(count_man = sum(count_class)) %>%
mutate(percent = count_class / count_man * 100) %>%
ggplot() +
geom_bar(aes(x = manufacturer,
y = count_man,
group = class,
fill = class),
stat = "identity") +
geom_text(aes(x = manufacturer,
y = count_man,
label = sprintf("%0.1f%%", percent)),
position = position_stack(vjust = 0.5))
根据评论进行编辑:
我犯了一个错误,为y
library(ggplot2)
library(dplyr)
mpg %>%
mutate(manufacturer = as.factor(manufacturer),
class = as.factor(class)) %>%
group_by(manufacturer, class) %>%
summarise(count_class = n()) %>%
group_by(manufacturer) %>%
mutate(count_man = sum(count_class)) %>%
mutate(percent = count_class / count_man * 100) %>%
ungroup() %>%
ggplot(aes(x = manufacturer,
y = count_class,
group = class)) +
geom_bar(aes(fill = class),
stat = "identity") +
geom_text(aes(label = sprintf("%0.1f%%", percent)),
position = position_stack(vjust = 0.5))
使用您的方法,百分比是正确的,但块大小是错误的。但我认为这是正确的前进方向;让我和dplyr玩一玩,看看我能不能把它弄对。我真蠢!我也将有一个看和编辑的答案!哇,现在太完美了!我也想过这样做,但没有意识到可以使用ungroup将汇总的数据恢复到原始形式。这是我丢失的一环;谢谢!:)如果你不使用它,它也会起作用,但在过去,如果你使用很多组,我会遇到一些问题,因此我的习惯是经常以
解组来结束,以避免这些问题。谢谢你的回答。这很有帮助,但并不完全是我想要的,因为mpg数据集只是一个示例。但很好的一点是,您的矩阵表示可能是显示此特定数据集的类制造商摘要的更好方式。