r - 如何在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"))
在行中写下以更正情节。
任何关于如何通过正确的升序获得子组的问题以及生成绘图的代码的任何建议将不胜感激!
解决方案
您需要为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())
推荐阅读
- sql - For Loop Eval Expression 无法将布尔值转换为字符串
- python - Jupyter 安装返回“python setup.py egg_info”失败,错误代码为 1
- sql-server - 在 MSSQL 的 CASE 语句中使用 INSERT
- azure - 运行数据仓库兼容脚本时出现操作数冲突错误
- android - 图片上传后Firebase获取网址
- exception - IObjectList.EnsureRelatedObjects 中的 OutOfMemoryException
- asp.net-core - 您可以访问 ASP.NET Core 2.1 MVC 客户端验证的其他属性的元数据吗?
- mysql - 返回两种类型的 Slick TableQuerys 之一的 Scala 函数
- php - php-amqplib 连接错误
- gatling - 仅在检查成功时才调用函数?