ggplot-按*每个系列*(而不是所有数据)的百分比缩放?

时间:2019-01-07 22:15:52

标签: r ggplot2

我正在制作一个条形图,以显示一个样本的百分比,该样本可识别为多年以来一系列政党清单。没关系。麻烦的是获取垂直轴上的百分比计算,以将每年的总计数用作百分比计算的分母(它将所有年份的总计数用作该分母)。

换句话说,我正在生成的条形图总计为100%,但是考虑到这代表了三年的数据,我希望它们相加总计300%。每年的样本量各不相同,因此将垂直轴值乘以样本中的年数将无效。

ggplot(df.graph, aes(x=Answer, y=..count../sum(..count..), fill=Year)) +
  geom_bar(position="dodge")+ 
  scale_y_continuous(labels = function(x) paste0(x*100, "%"))+
  theme(axis.text.x=element_text(angle=45,hjust=1))+
  xlab(NULL)+
  ylab(NULL)

Bar chart (I'm too new to Stack Overflow to post images, apparently)

1 个答案:

答案 0 :(得分:0)

请尝试使用geom_bar(stat = "count"),而不要使用默认的geom_bar(stat = "identity")。您可以使用dplyr轻松地计算百分比。例如,考虑ggplot2::mpg数据,

  

此数据集包含EPA在http://fueleconomy.gov上提供的燃油经济性数据的子集。它仅包含在1999年至2008年之间每年都有新版本的车型-用作汽车普及的代名词。

     

-https://ggplot2.tidyverse.org/reference/mpg.html

ggplot2::mpg %>% select(manufacturer, year)
#> # A tibble: 234 x 2
#>    manufacturer  year
#>    <chr>        <int>
#>  1 audi          1999
#>  2 audi          1999
#>  3 audi          2008
#>  4 audi          2008
#>  5 audi          1999
#>  6 audi          1999
#>  7 audi          2008
#>  8 audi          1999
#>  9 audi          1999
#> 10 audi          2008
#> # ... with 224 more rows
  • manufacturer:型号名称
  • year:制造年份

library(tidyverse)

1。百分比与年份

您可以计算每个manufactureryear的百分比。换句话说,每个manufacturer百分比的总和可能为1。

此外,您可以使用scales::percent代替labels = function(x) paste0(x*100, "%")

mpg %>% 
  group_by(manufacturer) %>% 
  mutate(N = n()) %>% # number of each manufacturer
  group_by(manufacturer, year) %>% # pair of manu, year
  summarise(perc = n() / unique(N)) %>% # n() = number of each pair => n()/N = proportion
  ggplot() +
  aes(x = manufacturer, y = perc, fill = factor(year)) +
  geom_bar(position = "dodge", stat = "identity") + # use y as y axis
  scale_y_continuous(labels = scales::percent) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        axis.title = element_blank()) +
  labs(fill = "Year")

enter image description here

添加每个刻度(红色和蓝色),您可以分别获得100%。


2。占百分比

另一方面,您可以计算manufacturer在每个year中的比例,以使每年的总和变为1

mpg %>% 
  group_by(year) %>% 
  mutate(N = n()) %>% 
  group_by(manufacturer, year) %>% 
  summarise(perc = n() / unique(N)) %>% 
  ggplot() +
  aes(x = manufacturer, y = perc, fill = factor(year)) +
  geom_bar(position = "dodge", stat = "identity") +
  scale_y_continuous(labels = scales::percent) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        axis.title = element_blank()) +
  labs(fill = "Year")

enter image description here

添加每种颜色,您可以获得每种颜色的100%。