首页 > 解决方案 > ggplot2 突出显示字母串

问题描述

不确定这是否可以使用 ggplot2 这是我到目前为止所拥有的,

我有两个字符串

main="TTTTTTTTGGCTCTTTTCCTCCTAAGAGC"
search="CTCTTTTCCTC"

我要做的第一件事是获取开始和结束的索引

library(stringr)
# this is later used to add x min and xmax
str_locate_all(pattern ='CTCTTTTCCTC', "TTTTTTTTGGCTCTTTTCCTCCTAAGAGC")

# code 
ref <- unlist(stringr::str_split("TTTTTTTTGGCTCTTTTCCTCCTAAGAGC", ""))
whole.df <- data.frame(nts = c(ref),
                       poS = seq(1,29),
                       set = c("REF"))
ggplot(whole.df, aes_string(x = 'poS', y = 'set', col = 'nts',label = 'nts')) +
  geom_text(size = 4, family = "Courier") +
  geom_rect(xmin = 11 - 0.5,xmax = 21 + 0.5, ymin = 0.8, ymax = 1.2,
            fill = NA, col ="black")

在此处输入图像描述

所以基本上我试图突出主字符串中的模式

我正在苦苦挣扎的是,当我在 df 中有不止一个主时,我只显示两行我有超过 500 行不同的开始和结束,但我的长度(主)总是 29 个字符

# test
t <- read.table(text="locus main    pattern score   gap
+ REF1  TCTGTCTCTGCTCCCCTGCTTTTCAGGTG   CTCCCCTGCTTTT   148 -4
+ REF2  TTTTTTTTGGCTCTTTTCCTCCTAAGAGC   CTCTTTTCCTC 164 -6", sep='\t', header=T, stringsAsFactors=F )
#get start and end
t$start <- str_locate_all(pattern = t$pattern, t$main)[[1]][1]
t$end <- str_locate_all(pattern = t$pattern, t$main)[[2]][1]
t
                        loci                      main           pattern score gap start end
1  REF1 TCTGTCTCTGCTCCCCTGCTTTTCAGGTG CTCCCCTGCTTTT   148  -4    11  23
2 REF2 TTTTTTTTGGCTCTTTTCCTCCTAAGAGC   CTCTTTTCCTC   164  -6    11  23

不知道如何进行

标签: rstringggplot2plot

解决方案


我认为您的代码中有一个错误,如果我们看看以下结果str_locate

str_locate_all(pattern = t$pattern, t$main)
[[1]]
     start end
[1,]    11  23

[[2]]
     start end
[1,]    11  21

如果我们查看第二个end值,它是 21,而在您的tdata.frame 中,它报告为 23。

您可以使用以下方法解决此问题:

t$start <- sapply(str_locate_all(pattern = t$pattern, t$main), `[`, j = 1)
t$end <- sapply(str_locate_all(pattern = t$pattern, t$main), `[`, j = 2)

也就是说,您可以通过以下方式处理多个字符串,方法是为不同的层提供不同的数据。

# setting up the letter data
strings <- strsplit(t$main, "")
df <- data.frame(locus = rep(t$locus, lengths(strings)),
                 letters = unlist(strings),
                 pos = unlist(lapply(strings, seq_along)))

ggplot(df, aes(x = pos, y = locus, label = letters)) +
  geom_tile(data = t, aes(x = (start + end)/2, width = end - start + 1, y = locus),
            inherit.aes = FALSE, fill = NA, colour = "black", alpha = 0.5) +
  geom_text(aes(colour = letters), family = "mono")

在此处输入图像描述


推荐阅读