在 R 中的堆叠条形图中保留分隔值
Keep separated values in stacked bar charts in R
我在文件中有此数据:
protein,0,1,2,3,4
*Q76BS1_N_294,15,5,3,8,12
*N1NEW2_N_516,20,3,20
*B4DUL1_N_41,20,3,20
*F6R1P3_T_24,20,1,20
P80051_N_57,20,3,20
*F6QLE9_N_101,20,3,20
*A0A0M4QAG2_N_564,20,3,20
*G3RZA4_T_653,20,1,20
在另一个文件中,我有相应的名称分配给列 0,1,2,3,4 中包含的每个值:
Kringle2_D,Cupin_1_D,PMP22_Claudin_O,nodomain4_N,Hormone_6_O,Interferon_O,Transferrin-like_D,nodomain633_N
nodomain289_N,glycosite_N_G,glycosite_N_G,glycosite_T_G,glycosite_N_G,glycosite_N_G,glycosite_N_G,glycosite_T_G
glycosite_N_G,Cupin_1_D,PMP22_Claudin_O,nodomain25_N,Hormone_6_O,Interferon_O,Transferrin-like_D,nodomain654_N
nodomain297_N,NA,NA,NA,NA,NA,NA,NA
Kringle3_D,NA,NA,NA,NA,NA,NA,NA
我需要制作堆叠条形图来表示 0、1、2、3、4 列中的值,并保持它们出现的确切顺序。
我成功地绘制了图形,但 ggplot2 将具有相同值(在第二个文件中报告的名称相同)的条统一在一个唯一的条中。
这是我目前生成的图表:
如你所见,除了第一个,最后一个和第五个柱子,其他的都没有把变量"glycosite_N_G "放在中间,把另外两个变量分开,因为它们是相同的输入,例如 Cupin_1_D 或 Transferrin-like_D..
即使它们相同,我也希望将它们分开,因为顺序很重要并且在我的数据中指定。
这是我的代码:
#!/usr/bin/env Rscript
library(ggplot2)
library(reshape2)
da=read.csv('dataInterval.csv', h=T)
da2=read.csv('domainName.csv', h=F, stringsAsFactors=F)
avector <- c(t(da2))
da$protein <- factor(da$protein, da$protein)
data.lng <- melt(da, id=c("protein"))
data.lng["names"] <- factor(avector, levels=unique(avector))
le <- length(unique(data.lng$variable))
re <- replicate(le, "white")
ggplot(na.omit(data.lng), aes(x=protein, weight=value, fill=names), size=0.5) +
geom_bar(width = 0.1) +
coord_flip() +
scale_x_discrete("Accession number", expand=c(0.02, 0)) +
labs(x="X Label", y="amino acids position", title="Domains around glycosites")
通过一些计算,您可以使用 geom_segment
而不是 geom_bar
来完成此操作。您需要根据 "value" 变量计算每个蛋白质中片段的起点和终点。端点是价值的累积总和。第一个段的起始点为 0,其他段的滞后累积和。
我在 dplyr 中做这项工作:
library(dplyr)
dat.seg = data.lng %>%
na.omit %>%
group_by(protein) %>%
arrange(protein) %>%
mutate(end = cumsum(value),
start = c(0, na.omit(lag(end))))
看起来像:
Source: local data frame [26 x 6]
Groups: protein [8]
protein variable value names end start
<fctr> <fctr> <int> <fctr> <int> <dbl>
1 *A0A0M4QAG2_N_564 X0 20 Transferrin-like_D 20 0
2 *A0A0M4QAG2_N_564 X1 3 glycosite_N_G 23 20
3 *A0A0M4QAG2_N_564 X2 20 Transferrin-like_D 43 23
4 *B4DUL1_N_41 X0 20 PMP22_Claudin_O 20 0
5 *B4DUL1_N_41 X1 3 glycosite_N_G 23 20
6 *B4DUL1_N_41 X2 20 PMP22_Claudin_O 43 23
...
现在用 geom_segment
绘图。使用 geom_segment
您可以水平构建绘图而不是使用 coord_flip
.
ggplot(dat.seg, aes(y = protein, color = names)) +
geom_segment(aes(yend = protein, x = start, xend = end), size = 2) +
scale_x_continuous("Accession number", expand=c(0.02, 0)) +
labs(x="X Label", y="amino acids position", title="Domains around glycosites")
我在文件中有此数据:
protein,0,1,2,3,4
*Q76BS1_N_294,15,5,3,8,12
*N1NEW2_N_516,20,3,20
*B4DUL1_N_41,20,3,20
*F6R1P3_T_24,20,1,20
P80051_N_57,20,3,20
*F6QLE9_N_101,20,3,20
*A0A0M4QAG2_N_564,20,3,20
*G3RZA4_T_653,20,1,20
在另一个文件中,我有相应的名称分配给列 0,1,2,3,4 中包含的每个值:
Kringle2_D,Cupin_1_D,PMP22_Claudin_O,nodomain4_N,Hormone_6_O,Interferon_O,Transferrin-like_D,nodomain633_N
nodomain289_N,glycosite_N_G,glycosite_N_G,glycosite_T_G,glycosite_N_G,glycosite_N_G,glycosite_N_G,glycosite_T_G
glycosite_N_G,Cupin_1_D,PMP22_Claudin_O,nodomain25_N,Hormone_6_O,Interferon_O,Transferrin-like_D,nodomain654_N
nodomain297_N,NA,NA,NA,NA,NA,NA,NA
Kringle3_D,NA,NA,NA,NA,NA,NA,NA
我需要制作堆叠条形图来表示 0、1、2、3、4 列中的值,并保持它们出现的确切顺序。 我成功地绘制了图形,但 ggplot2 将具有相同值(在第二个文件中报告的名称相同)的条统一在一个唯一的条中。
这是我目前生成的图表:
如你所见,除了第一个,最后一个和第五个柱子,其他的都没有把变量"glycosite_N_G "放在中间,把另外两个变量分开,因为它们是相同的输入,例如 Cupin_1_D 或 Transferrin-like_D..
即使它们相同,我也希望将它们分开,因为顺序很重要并且在我的数据中指定。
这是我的代码:
#!/usr/bin/env Rscript
library(ggplot2)
library(reshape2)
da=read.csv('dataInterval.csv', h=T)
da2=read.csv('domainName.csv', h=F, stringsAsFactors=F)
avector <- c(t(da2))
da$protein <- factor(da$protein, da$protein)
data.lng <- melt(da, id=c("protein"))
data.lng["names"] <- factor(avector, levels=unique(avector))
le <- length(unique(data.lng$variable))
re <- replicate(le, "white")
ggplot(na.omit(data.lng), aes(x=protein, weight=value, fill=names), size=0.5) +
geom_bar(width = 0.1) +
coord_flip() +
scale_x_discrete("Accession number", expand=c(0.02, 0)) +
labs(x="X Label", y="amino acids position", title="Domains around glycosites")
通过一些计算,您可以使用 geom_segment
而不是 geom_bar
来完成此操作。您需要根据 "value" 变量计算每个蛋白质中片段的起点和终点。端点是价值的累积总和。第一个段的起始点为 0,其他段的滞后累积和。
我在 dplyr 中做这项工作:
library(dplyr)
dat.seg = data.lng %>%
na.omit %>%
group_by(protein) %>%
arrange(protein) %>%
mutate(end = cumsum(value),
start = c(0, na.omit(lag(end))))
看起来像:
Source: local data frame [26 x 6]
Groups: protein [8]
protein variable value names end start
<fctr> <fctr> <int> <fctr> <int> <dbl>
1 *A0A0M4QAG2_N_564 X0 20 Transferrin-like_D 20 0
2 *A0A0M4QAG2_N_564 X1 3 glycosite_N_G 23 20
3 *A0A0M4QAG2_N_564 X2 20 Transferrin-like_D 43 23
4 *B4DUL1_N_41 X0 20 PMP22_Claudin_O 20 0
5 *B4DUL1_N_41 X1 3 glycosite_N_G 23 20
6 *B4DUL1_N_41 X2 20 PMP22_Claudin_O 43 23
...
现在用 geom_segment
绘图。使用 geom_segment
您可以水平构建绘图而不是使用 coord_flip
.
ggplot(dat.seg, aes(y = protein, color = names)) +
geom_segment(aes(yend = protein, x = start, xend = end), size = 2) +
scale_x_continuous("Accession number", expand=c(0.02, 0)) +
labs(x="X Label", y="amino acids position", title="Domains around glycosites")