如何在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())
我有一个数据集,我正在尝试创建一个分组条形图。组是时间点之前和之后,子组是 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())