首页 > 解决方案 > 如何在R中的分组条形图中以R中的升序排列子组

问题描述

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

以下是我为 dataset 拥有的代码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))

这给了我一张表格:

`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,就像它计算一些奇数百分比一样。我

接下来我尝试调整代码,而不是汇总,也不按设备和 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

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

任何关于如何通过正确的升序获得子组的问题以及生成绘图的代码的任何建议将不胜感激!

标签: rplottidyversebar-chartgrouping

解决方案


您需要为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 ()

PS您可能FDA_co_tier与我们共享了您的数据表。没有它,我必须使用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())

在此处输入图像描述


推荐阅读