在 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")