如何在R中的分组条形图中按R中的升序排列子组

How to arrange subgroups in a grouped barplot in R in ascending number in R

我有一个数据集,我正在尝试创建一个分组条形图。组是时间点之前和之后,子组是 6 个不同的设备。之前只有 6 个子组中的 3 个,而之后有所有 6 个子组。我有两个主要问题:获取代码以按升序排列子组,以及将“之前”组与“之后”组相比放在图的左侧。

下面是我对数据集 FDA_co_tier:

的代码
library(tidyverse)
library(ggplot2)

F_dev_dec <- FDA_co_tier%>%
  select(device_type, year_approved) %>% 
  mutate(year_2015 = if_else(year_approved >= 2015, "after", "before")) %>% 
  mutate(year_2015 = factor(year_2015, levels=c("before", "after"))) %>% 
  group_by(device_type, year_2015) %>% 
  summarise(N=n()) %>% 
  mutate(N= factor(N, levels = N))

这给了我 table 的:

`summarise()` has grouped output by 'device_type'. You can override using the `.groups` argument.
# A tibble: 9 x 3
# Groups:   device_type [6]
  device_type         year_2015 N    
  <chr>               <fct>     <fct>
1 Accessories         after     6    
2 Aspiration_catheter before    4    
3 Aspiration_catheter after     32   
4 Guidewire           before    3    
5 Guidewire           after     23   
6 Microcatheter       after     7    
7 Sheath              after     19   
8 Stentretriever      before    17   
9 Stentretriever      after     22 

我将 year_2015 变量和 N 变量都作为因子,并尝试将 year_2015 水平设置为“之前”然后“之后”。

如上所述,我想按 n 的升序为“之前”和“之后”点绘制条形图中的不同设备。为此,我最初尝试了:

F_dev_dec %>% 
  ggplot(aes(x= year_2015, fill= device_type)) +
  geom_bar(position = position_dodge()) +
      labs(title = NULL,
           x= NULL,
           y= "Count (n)")

这给了我这张图:[1]:https://i.stack.imgur.com/NAM8i.png

不确定为什么这有正确的组(“之前”、“之后”,但所有设备子组都变为 1,就像它计算一些奇数百分比一样。I

接下来我尝试调整代码而不是总结和不按设备对数据 table 和 year_2015:

进行双重分组
F_dev_dec <- FDA_co_tier%>%
  select(device_type, year_approved) %>% 
  mutate(year_2015 = if_else(year_approved >= 2015, "after", "before")) %>% 
  mutate(year_2015 = factor(year_2015, levels=c("before", "after"))) %>% 
  group_by(device_type, year_2015)  

然后对上面的 ggplot 使用相同的代码,我得到了一些更接近的东西,但不是按子组的 n 升序排列:https://i.stack.imgur.com/wSm5L.png

经过进一步的尝试和错误尝试没有得到这个,我能够让情节看起来像我想要的唯一方法是使用以下代码:

F_dev_dec <- FDA_co_tier%>%
  select(device_type, year_approved) %>% 
  mutate(year_2015 = if_else(year_approved >= 2015, "before", "after")) %>% 
  mutate(year_2015 = factor(year_2015, levels=c("before", "after"))) %>% 
  group_by(device_type, year_2015) %>% 
  summarise(N=n())

`summarise()` has grouped output by 'device_type'. You can override using the `.groups` argument.
# A tibble: 9 x 3
# Groups:   device_type [6]
  device_type         year_2015     N
  <chr>               <fct>     <int>
1 Accessories         after         6
2 Aspiration_catheter before        4
3 Aspiration_catheter after        32
4 Guidewire           before        3
5 Guidewire           after        23
6 Microcatheter       after         7
7 Sheath              after        19
8 Stentretriever      before       17
9 Stentretriever      after        22

F_dev_dec %>% 
  ggplot(aes(x= year_2015, y= N, fill= reorder(device_type, N))) +
  geom_bar(data=F_dev_dec %>% filter(year_2015 == "before"), width=0.9, position = position_dodge(),  stat = "identity") +
  geom_bar(data=F_dev_dec %>% filter(year_2015 == "after"), width=0.5, position = position_dodge(),  stat = "identity") +
  scale_x_discrete(labels = c("Before", "After")) +
  theme_classic()+
  labs(title = NULL,
       x= NULL,
       y= "Count (n)")

这给出了我正在寻找的情节:https://i.stack.imgur.com/KHfzk.png

注意: 在上面的代码中,FDA_co_tier 生成变量 year_2015 的突变一直在搞乱最终的情节。当我尝试使用 mutate(year_2015 = if_else(year_approved >= 2015, "after", "before")) 正确地进行突变时,最终的情节如下所示:https://i.stack.imgur.com/G4vyU.png

数据 table 被反转(2015 年应为“之前”的值被标记为“之后”,2015 年“之后”的值被标记为“之前”)。更烦人的是,所有组仍然包含相同的值,但标签是错误的,所以我不得不在 scale_x_discrete(labels = c("Before", "After")) 行中写入以更正情节。

任何关于如何解决问题的建议,让子组以正确的升序排列,以及生成绘图的代码是怎么回事,我们将不胜感激!

您需要为 device_type 变量设置适当的级别。最简单的方法就是这样。

library(tidyverse)

F_dev_dec = read.table(
  header = TRUE,text="
device_type         year_2015 N    
 Accessories         after     6    
 Aspiration_catheter before    4    
 Aspiration_catheter after     32   
 Guidewire           before    3    
 Guidewire           after     23   
 Microcatheter       after     7    
 Sheath              after     19   
 Stentretriever      before    17   
 Stentretriever      after     22 
") %>% as_tibble()

F_dev_dec = F_dev_dec %>% 
  group_by(year_2015) %>% 
  arrange(N) %>% 
  mutate(
  year_2015 = year_2015 %>% factor(c("before", "after")),
  device_type = device_type %>% fct_inorder()
)

F_dev_dec %>% 
  ggplot(aes(x= year_2015, y= N, fill= reorder(device_type, N))) +
  geom_bar(data=F_dev_dec %>% filter(year_2015 == "before"), width=0.9, position = position_dodge(),  stat = "identity") +
  geom_bar(data=F_dev_dec %>% filter(year_2015 == "after"), width=0.5, position = position_dodge(),  stat = "identity") +
  scale_x_discrete(labels = c("Before", "After")) +
  theme_classic()+
  labs(title = NULL,
       x= NULL,
       y= "Count (n)")

注意以下命令顺序先arrange(N)device_type = device_type %>% fct_inorder ().

P.S。 您可能已经与我们分享了您的 FDA_co_tier 数据 table。没有它,我不得不使用 read.table.

阅读摘要

更新 1

呸!为了达到你期望的效果,我有点累了。但最终它奏效了。让我们看看这里有什么。首先,我将处理您完成的数据。我自己做了一样的。

library(tidyverse)

FDA_co_tier = tibble(
  device_type = c(rep("Accessories", 6),
                  rep("Aspiration_catheter", 36),
                  rep("Guidewire", 26),
                  rep("Microcatheter", 7),
                  rep("Sheath", 19),
                  rep("Stentretriever", 39)),
  year_2015 = c(rep("after", 6),
                rep("before", 4),
                rep("after", 32),
                rep("before", 3),
                rep("after", 49),
                rep("before", 17),
                rep("after", 22)))

输出

# A tibble: 133 x 2
   device_type         year_2015
   <chr>               <chr>    
 1 Accessories         after    
 2 Accessories         after    
 3 Accessories         after    
 4 Accessories         after    
 5 Accessories         after    
 6 Accessories         after    
 7 Aspiration_catheter before   
 8 Aspiration_catheter before   
 9 Aspiration_catheter before   
10 Aspiration_catheter before   
# ... with 123 more rows

现在让我们创建一个情节。请注意一行巧妙的代码 geom_bar (position = position_dodge (), alpha = 0)),它不显示任何内容,它只设置变量的预期顺序 year_2015.

FDA_co_tier %>% 
  mutate(
    year_2015 = year_2015 %>% factor(c("before", "after")))  %>% 
  ggplot(aes(year_2015, fill=device_type))+
  geom_bar(position = position_dodge(), alpha=0)+
  geom_bar(data = . %>% 
             filter(year_2015 == "before") %>% 
             mutate(device_type = device_type %>% fct_infreq() %>% fct_rev()), 
           position = position_dodge())+
  geom_bar(data = . %>% 
             filter(year_2015 == "after") %>% 
             mutate(device_type = device_type %>% fct_infreq() %>% fct_rev()),
           position = position_dodge())