Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在堆叠条形图上按列显示百分比_R_Plot_Ggplot2 - Fatal编程技术网

R 在堆叠条形图上按列显示百分比

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数据集:

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数据集只是一个示例。但很好的一点是,您的矩阵表示可能是显示此特定数据集的类制造商摘要的更好方式。