基因家族分析(4):基因家族蛋白质模体鉴定与可视化

本文主要工作

  1. 使用meme鉴定了SBT家族的蛋白质模体组成
  2. 对meme鉴定结果进行处理并用ggplot2进行可视化

4.蛋白质与基因结构可视化分析

4.1 蛋白质模体预测

Protein Motif这个概念比较混乱,需要在这里特别说明。在生物化学中,一个比较清晰的英文定义是这样给出的:

”Protein motifs are small regions of protein three-dimensional structure or amino acid sequence shared among different proteins. They are recognizable regions of protein structure that may (or may not) be defined by a unique chemical or biological function.” (https://bio.libretexts.org/Bookshelves/Cell_and_Molecular_Biology/Book%3A_Basic_Cell_and_Molecular_Biology_(Bergtrom)/03%3A_Details_of_Protein_Structure/3.06%3A_Protein_Domains_Motifs_and_Folds_in_Protein_Structure))

翻译成中文即为 “蛋白质模体是不同蛋白质中共有的、小区域的蛋白质三维结构或是氨基酸序列。它们是蛋白质结构中可被识别的区域,可能(或可能不)具备生物学功能。”因此,我们可以大致理解为结构特别、可能具备一定功能的小的氨基酸序列,这个适用范围是所有的蛋白质的。而在基因家族分析中,它所适应的范围是我们所鉴定的基因家族内部的所有蛋白质,需要得到的模体短而保守,并可能具备一定的功能,从而借此呈现不同蛋白质间的进化关系。

在明细概念后,我们就可以进行分析了。这里使用meme这款软件在使用conda安装后进行本地化分析,当然它也有网页版的,但是灵活度上讲我个人还是推荐本地分析。在这里的脚本中,我们使用之前鉴定得到的SBT家族蛋白质序列。但是同样为了美观,我们要把蛋白质序列中的序列号“.1”删去。随后使用meme鉴定motif。输出的结果存放地址可以通过参数指定。此外,我在这里还通过seqtk comp生成了一个统计各个蛋白质长度的文件,这是为之后我们可视化蛋白质模体分布服务的。

在meme输出的文件夹中存放了不同类型的文件。其中以.png结尾的即为各个模体的seqlogo图。模体的网页版报告可以通过.html结尾文件查看。而我们需要的信息存放在以.txtx结尾的文件中。由于该文件十分复杂,而我们想要提取想要的信息,需要依靠特殊的脚本解决,这里提供一个思路(python 处理):

#!/usr/bin/env python

import re
import argparse

parser = argparse.ArgumentParser(description='meme file stat')
parser.add_argument('-i', '--input_file', type=str, required=True, metavar='<file name>',
                    help='Input txt file the meme outputs, i.e., meme.txt')
parser.add_argument('-o', '--output_file', type=str, required=True, metavar='<file name>', help='output stat file')
args = parser.parse_args()

content = []
motif_order = 1
pattern1 = "Motif ([A-Z]+) MEME-[0-9]+ sites sorted by position p-value"
pattern2 = "Aco[0-9]+\s+[0-9]+\s+[0-9]+\.[0-9]+e-[0-9]+\s+[A-Z]+\s+[A-Z]+\s+[A-Z]+"
Motif_info_dict = {}
Motif_sample_dict = {}
seq_motif_info_all = []

with open(args.input_file) as f:
    while True:
        content_list = f.readline()

        if not content_list:
            break
        else:
            content_list = content_list.replace("\t", "").replace("\n", "")
            if re.search("\+s", content_list):
                continue

        if re.search(pattern1, content_list):
            match = re.findall(pattern1, content_list)
            Motif_name = "Motif" + str(motif_order)
            motif_order = int(motif_order) + 1
            Motif_sample_dict["seq"] = match[0]
            Motif_sample_dict["length"] = len(match[0])
            Motif_info_dict[Motif_name] = Motif_sample_dict

        if re.search(pattern2, content_list):
            protein_motif_info_list = re.split("\s+", content_list)
            seq_name = protein_motif_info_list[0]
            seq_start = int(protein_motif_info_list[1])
            seq_end = int(Motif_sample_dict["length"]) + int(seq_start) - 1
            seq_motif = Motif_name
            seq_motif_seq = str(protein_motif_info_list[4])
            seq_motif_info = [seq_name, seq_motif, seq_start, seq_end, seq_motif_seq]
            seq_motif_info_all.append(seq_motif_info)

for i in seq_motif_info_all:
    output = i[0] + "\t" + i[1] + "\t" + str(i[2]) + "\t" + str(i[3]) + "\t" + i[4] + "\n"
    with open(args.output_file, "a") as f:
        f.write(output)

得到处理好的文件后,为了呈现文章中的效果,我们可以用ggplot2进行可视化,结合我之前的文件在这里提供一个思路:

library(data.table)
library(tidyverse)

# 载入文本
pep_meme <- fread("./DATA/test.txt", header = F)
new_pep <- pep_meme %>%
  arrange(V1) %>%
  group_by(V1) 

pep_length <- fread("./DATA/length.stat.pep.txt", header = F)
pep_length <- mutate(pep_length, V3=0)

# 画图
ggplot() +
  geom_segment(data = new_pep, 
               aes(x = as.numeric(V3), 
                   y = V1,
                   xend = as.numeric(V4),
                   yend = V1,
                   color = V2),
               linewidth = 2.5, 
               position = position_nudge(y = 0.2)) +
  scale_color_brewer(palette = "Set3") +
  geom_segment(data = pep_length, 
               aes(x = as.numeric(V3),
                   y = V1,
                   xend = as.numeric(V2),
                   yend = V1),
               color = "grey",
               linewidth = 1) +
  scale_x_continuous(expand = c(0,0)) +
  labs(y = "Family",
       x = "Length",
       color = "Motif") +
  theme_classic()

最终效果还是不错的。

| 基因家族分析系列(持续更新)

0.基因家族分析(0):概念明晰

1.基因家族分析(1):数据下载与处理

2.基因家族分析(2):基因家族鉴定与蛋白质性质简单分析

3.基因家族分析(3):序列比对与进化树构建

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容