结合堆叠和分组图表ggplot2
Combine Stacked and Grouped chart ggplot2
我有这个 table:
Number Type Correction Adjust Origin
1061 60-15 Corrected yes Small RNA-seq
204 60-15 Corrected no Small RNA-seq
0 60-15 Native yes Small RNA-seq
540 60-15 Native no Small RNA-seq
0 60-30 Corrected yes Small RNA-seq
315 60-30 Corrected no Small RNA-seq
0 60-30 Native yes Small RNA-seq
58 60-30 Native no Small RNA-seq
0 70-15 Corrected yes Small RNA-seq
200 70-15 Corrected no Small RNA-seq
0 70-15 Native yes Small RNA-seq
61 70-15 Native no Small RNA-seq
0 70-30 Corrected yes Small RNA-seq
259 70-30 Corrected no Small RNA-seq
0 70-30 Native yes Small RNA-seq
42 70-30 Native no Small RNA-seq
0 80-15 Corrected yes Small RNA-seq
166 80-15 Corrected no Small RNA-seq
0 80-15 Native yes Small RNA-seq
76 80-15 Native no Small RNA-seq
0 80-30 Corrected yes Small RNA-seq
182 80-30 Corrected no Small RNA-seq
0 80-30 Native yes Small RNA-seq
13 80-30 Native no Small RNA-seq
并且我在 ggplot2 中生成了以下图表,这几乎是我想要的:
ggplot(Table, aes(fill=Correction, x=Type, y=Number)) +
geom_bar(position="dodge", stat="identity") +
scale_fill_brewer(palette = "Set1") + labs(x="", y="") +
theme(legend.title=element_blank()) + facet_wrap(~Origin)
生成如下图:
问题是我希望将 60-15 的第一个条形分成两部分(1061 和 204),就好像它是一个堆叠条形图一样。其余的条没有这种特殊性,将保持原样。我试图通过添加数字值为零的行来解决这个问题,但我找不到解决这个问题的正确代码。
有人可以帮忙吗?
谢谢
你可以试着算一下之前的总和。然后使用 geom_rect
自行添加缺少的条形部分
library(tidyverse)
df %>%
group_by(Type, Correction) %>%
summarise(count=sum(Number))
# A tibble: 12 x 3
# Groups: Type [6]
Type Correction count
<fct> <fct> <int>
1 60-15 Corrected 1265
2 60-15 Native 540
3 60-30 Corrected 315
4 60-30 Native 58
5 70-15 Corrected 200
6 70-15 Native 61
7 70-30 Corrected 259
8 70-30 Native 42
9 80-15 Corrected 166
10 80-15 Native 76
11 80-30 Corrected 182
12 80-30 Native 13
df %>%
group_by(Type, Correction) %>%
summarise(count=sum(Number)) %>%
mutate(Correction=factor(Correction, levels = c(levels(Correction), "new_level"))) %>%
ggplot(aes(Type, count, fill=Correction)) +
geom_col(position = "dodge") +
geom_rect(aes(xmin=.55, xmax=1, ymin=1061, ymax=1061+204), fill="#619CFF") +
scale_fill_discrete(drop=FALSE)
我有这个 table:
Number Type Correction Adjust Origin
1061 60-15 Corrected yes Small RNA-seq
204 60-15 Corrected no Small RNA-seq
0 60-15 Native yes Small RNA-seq
540 60-15 Native no Small RNA-seq
0 60-30 Corrected yes Small RNA-seq
315 60-30 Corrected no Small RNA-seq
0 60-30 Native yes Small RNA-seq
58 60-30 Native no Small RNA-seq
0 70-15 Corrected yes Small RNA-seq
200 70-15 Corrected no Small RNA-seq
0 70-15 Native yes Small RNA-seq
61 70-15 Native no Small RNA-seq
0 70-30 Corrected yes Small RNA-seq
259 70-30 Corrected no Small RNA-seq
0 70-30 Native yes Small RNA-seq
42 70-30 Native no Small RNA-seq
0 80-15 Corrected yes Small RNA-seq
166 80-15 Corrected no Small RNA-seq
0 80-15 Native yes Small RNA-seq
76 80-15 Native no Small RNA-seq
0 80-30 Corrected yes Small RNA-seq
182 80-30 Corrected no Small RNA-seq
0 80-30 Native yes Small RNA-seq
13 80-30 Native no Small RNA-seq
并且我在 ggplot2 中生成了以下图表,这几乎是我想要的:
ggplot(Table, aes(fill=Correction, x=Type, y=Number)) +
geom_bar(position="dodge", stat="identity") +
scale_fill_brewer(palette = "Set1") + labs(x="", y="") +
theme(legend.title=element_blank()) + facet_wrap(~Origin)
生成如下图:
问题是我希望将 60-15 的第一个条形分成两部分(1061 和 204),就好像它是一个堆叠条形图一样。其余的条没有这种特殊性,将保持原样。我试图通过添加数字值为零的行来解决这个问题,但我找不到解决这个问题的正确代码。
有人可以帮忙吗?
谢谢
你可以试着算一下之前的总和。然后使用 geom_rect
library(tidyverse)
df %>%
group_by(Type, Correction) %>%
summarise(count=sum(Number))
# A tibble: 12 x 3
# Groups: Type [6]
Type Correction count
<fct> <fct> <int>
1 60-15 Corrected 1265
2 60-15 Native 540
3 60-30 Corrected 315
4 60-30 Native 58
5 70-15 Corrected 200
6 70-15 Native 61
7 70-30 Corrected 259
8 70-30 Native 42
9 80-15 Corrected 166
10 80-15 Native 76
11 80-30 Corrected 182
12 80-30 Native 13
df %>%
group_by(Type, Correction) %>%
summarise(count=sum(Number)) %>%
mutate(Correction=factor(Correction, levels = c(levels(Correction), "new_level"))) %>%
ggplot(aes(Type, count, fill=Correction)) +
geom_col(position = "dodge") +
geom_rect(aes(xmin=.55, xmax=1, ymin=1061, ymax=1061+204), fill="#619CFF") +
scale_fill_discrete(drop=FALSE)