根据一个变量的值在堆叠的条形图中排列堆叠

时间:2020-02-21 16:53:04

标签: r ggplot2 graph

我试图编写一个在最后输出堆叠条形图的函数,该堆叠条形图的条形从一个特定变量的最大百分比到最小百分比排序。我还没有找到执行此操作的通用方法,而我的最终目标是以一种需要最少人工输入的方式来完成此过程。

我的数据看起来像这样

 Swimming_style     Comfort_level_label    Comfort_level_scale    n     Total_n       Percentage 
 Front Crawl        Excellent              3                     7       10          70                     
 Front Crawl        Good                   2                     3       10          30
 Backstroke         Excellent              3                     4       10          40
 Backstroke         Good                   2                     4       10          40
 Backstroke         Fair                   1                     1       10          10
 Backstroke         Poor                   0                     1       10          10
 Brest stroke       Excellent              3                     6       10          60
 Brest stroke       Fair                   1                     4       10          40
 Butterfly          Good                   2                     7       10          70
 Butterfly          Fair                   1                     1       10          10
 Butterfly          Poor                   0                     2       10          20

到目前为止,这是我的代码:

 data <- arrange(data, Comfort_level_label, (Percentage))
 data$Swimming_style <- factor(data$Swimming_style, levels = unique(data$Swimming_style))



 ggplot(data, aes( x = Swimming_style, y = n, fill = Comfort_level_label)) + 
      geom_bar(position = "fill",stat = "identity") + 
      scale_y_continuous(labels = scales::percent_format())+
     coord_flip()

哪个输出:

enter image description here

但是我需要做的图表是按优秀等级排序,从最上端的最优秀到最下端的无,或者最下端没有优等,我很难做到这一点。

1 个答案:

答案 0 :(得分:2)

这可能有点模棱两可,但是确定优先级时重要的一点是要确保您始终完全拥有每个因素中的一个。

library(dplyr)
SS <- dat %>%
  arrange(-Comfort_level_scale, -n) %>%
  group_by(Swimming_style) %>%
  slice(1) %>%
  ungroup() %>%
  arrange(Comfort_level_scale, n) %>%
  pull(Swimming_style)

library(ggplot2)
dat %>%
  mutate(Swimming_style = factor(Swimming_style, levels = SS)) %>%
  ggplot(aes( x = Swimming_style, y = n, fill = Comfort_level_label)) + 
  geom_bar(position = "fill",stat = "identity") + 
  scale_y_continuous(labels = scales::percent_format()) +
  coord_flip()  

ggplot2 ordered facets

顺便说一句:Brest stroke应该是Breast stroke吗?


library(dplyr)
dat <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
 Swimming_style     Comfort_level_label    Comfort_level_scale    n     Total_n       Percentage 
 Front_Crawl        Excellent              3                     7       10          70                     
 Front_Crawl        Good                   2                     3       10          30
 Backstroke         Excellent              3                     4       10          40
 Backstroke         Good                   2                     4       10          40
 Backstroke         Fair                   1                     1       10          10
 Backstroke         Poor                   0                     1       10          10
 Brest_stroke       Excellent              3                     6       10          60
 Brest_stroke       Fair                   1                     4       10          40
 Butterfly          Good                   2                     7       10          70
 Butterfly          Fair                   1                     1       10          10
 Butterfly          Poor                   0                     2       10          20") %>%
  mutate(Swimming_style = gsub("_", " ", Swimming_style))