image.png

先从hg38的gtf中提取"ANXA1"基因grep '"ANXA1"' hg38.gtf >ANXA1.gtf

在题目之前先分析要处理的数据的结构是什么样的以及要做什么

1.数据结构是怎么样的:

image.png

以gene开头,对应唯一的gene name

接下来是transcript 有唯一的transcript name

transcript下面的包括exon,CDS,start codon,stop codon,three_prime_utr,five_prime_utr都是属于transcript,都会对应有相同的transcript name

有的exon包括5'端的UTR区域或者3'端的UTR区域

而对于不包括UTR的exon就称之为CDS,所以CDS并不等同于exon

所以问题就很清楚了

2.要做什么:

如果要统计gene坐标:

则以gene name 为key建立gene的字典,方法是先构建dict_gene={},然后直接把坐标存到dict_gene[gene_name]=[,]列表中储存坐标

如果要统计exon坐标:

则以gene name 为key建立exon的字典,然后字典中又以不同的transcript name 作为key建立字典,方法是先构建dict_exon[gene_name]={},然后根据找到的transcript name,把transcript name作为key再存入,即dict_exon[gene_name][transcript_name]=[],把transcript对应的exon坐标存到列表中。

如果要统计UTR坐标:

同理;

image.png

image.png

python实现的代码如下import collectionsimport matplotlibimport matplotlib.pyplot as pltimport matplotlib.ticker as tickerimport matplotlib.patches as patches

matplotlib.style.use("ggplot")

gene_cord=collections.OrderedDict()

gene_exon=collections.OrderedDict()

gene_utr=collections.OrderedDict()

gene_start_codon=collections.OrderedDict()

gene_stop_codon=collections.OrderedDict()with open ("ANXA1.gtf") as fh:   for line in fh:

lineL=line.strip().split("\t")      if lineL[2]=="gene":

gene_info=lineL[-1]

gene_infoL=gene_info.split("; ")

gene_name=gene_infoL[2]

gene_nameL=gene_name.split(" ")

gene_name=eval(gene_nameL[1])

gene_cord[gene_name]=[int(lineL[3]),int(lineL[4])]  #对基因构建字典,key是基因名,value是基因坐标

gene_exon[gene_name]={}

gene_utr[gene_name]={}      elif lineL[2]=="transcript":

trans_info=lineL[-1]

trans_infoL=trans_info.split("; ")

trans_name=trans_infoL[9]

trans_nameL=trans_name.split(" ")

trans_name=eval(trans_nameL[1])

gene_exon[gene_name][trans_name]=[]                #字典中套字典,最终的value先建立为空list

gene_exon[gene_name][trans_name].append(lineL[6])  #往空list中添加正负链信息的元素

gene_utr[gene_name][trans_name]=[]      elif lineL[2]=="exon":

gene_exon[gene_name][trans_name].extend([int(lineL[3]),int(lineL[4])]) #往list中加exon坐标

elif lineL[2] in ["five_prime_utr","three_prime_utr"]:

gene_utr[gene_name][trans_name].extend([int(lineL[3]),int(lineL[4])])  #往list中加UTR坐标fig= plt.figure()  #建一个画板ax = fig.add_subplot(111)  #将画板分为1行1列,图像画在从左到右从上到下第一块trans_num=0for trans_name,exon in gene_exon[gene_name].items():

trans_num+=1

if exon[0]=="+":

col="limegreen"

if exon[0]=="-":

col="magenta"

for i in range(1,len(exon),2):   #注意!!!python中for i in range(n,m)  范围包括n,不包括m

#对每个exon画矩形图

#ax.add_patch(patches.Rectangle((x,y),width,height))

rect=patches.Rectangle((exon[i],trans_num-0.1),exon[i+1]-exon[i],0.2,color=col,fill=True)

ax.add_patch(rect)        #对每个intron画线图

if i

ax.plot([exon[i+1],exon[i+2]],[trans_num,trans_num],color="red",linewidth="0.5")#对UTR画图            trans_num=0for trans_name,utr in gene_utr[gene_name].items():

trans_num+=1

if utr==[]:        continue

else:        for i in range(0,len(utr),2):

rect=patches.Rectangle((utr[i],trans_num-0.1),utr[i+1]-utr[i],0.2,color="black")

ax.add_patch(rect)

ax.set_xlabel(gene_name,color="blue",fontsize=14,fontweight="bold")

ax.yaxis.set_major_locator(ticker.FixedLocator(range(1,trans_num+1)))

ax.set_yticklabels(gene_exon[gene_name].keys())

plt.xlim(gene_cord[gene_name])

plt.ylim([0.5,trans_num+0.5])

plt.show()

fig.savefig('rect.png', dpi=90, bbox_inches='tight')

几个注意的点:

1.list中增加元素的方法大概有两种方式:

第一种是list.append

另一种是list.expend

区别在于第一种是直接把整个模块加入list中,第二种是将元素一个个添加到list中

举个例子:B = ['q', 'w', 'e', 'r']

B.append(['t', 'y'])

B

['q', 'w', 'e', 'r', ['t', 'y']]

A = ['q', 'w', 'e', 'r']

A.extend(['t', 'y'])

A

['q', 'w', 'e', 'r', 't', 'y']

我希望把exon和UTR坐标存到list中是当成每个元素去存的,方便后续处理 所以用的是extend

而trans_name是单个的,直接用append就好

2.for i in range(m,n,k),范围包括m,不包括n

作者:天秤座的机器狗

链接:https://www.jianshu.com/p/abb29ce1f76d

python数据结构编程题_生信编程实战第5题(python)相关推荐

  1. python3编程实战_生信编程实战第3题(python)

    image.png wget ftp://ftp.ensembl.org/pub/release-87/gtf/homo_sapiens/Homo_sapiens.GRCh38.87.chr.gtf. ...

  2. python3.7程序实例_生信编程实战第7题(python)

    image.png 做这个题目之间必须要了解一些背景知识 1.超几何分布 超几何分布是统计学上一种离散概率分布.它描述了由有限个物件中抽出n个物件,成功抽出指定种类的物件的次数(不归还),称为超几何分 ...

  3. 引用另一模板的宏_生信人值得拥有的编程模板Shell

    前言 "工欲善其事必先利其器",生信工程师每天写代码.搭流程,而且要使用至少三门编程语言,没有个好集成开发环境(IDE,Integrated Development Environ ...

  4. 编程心得体会_生信编程语言的经验之谈

    对于生信狗来说,日常的数据分析任务大概可以分成三大类: 纯文本处理 数值计算 图表可视化 其中,对这几个任务的可选的解决方案,以及各自的最优解决方案分别为: 纯文本处理: Linux下的文本处理命令, ...

  5. python生信编程1-5

    文章目录 Counting DNA Nucleotides/统计ATCG数 Problem Sample Dataset Sample Output Transcribing DNA into RNA ...

  6. python代码没有反应_没有任何编程经验者不要被Python简明手册误导。

    想学python,没有任何编程经验者不要被python简明手册误导. 1.python简明手册是一本好书 但这本书是针对有经验的程序员看的,详细一点说,有3年以上c++/java,.delphi/vb ...

  7. 扇贝python编程课_【扇贝编程python安卓手机下载】扇贝编程app v1.1.47 破解版-趣致软件园...

    扇贝编程python是运行于安卓平台的一款专业Python课程学习应用,该应用内置了专业强大的教研团队与交互式学习方法,同时还能够支持电脑.手机进度同步,自动保存学习进度,让用户能够使用扇贝编程轻松精 ...

  8. python完全支持面向对象编程思想_面向对象的编程思想和Python的类,访问和属性,继承...

    本文将从访问限制,属性,继承,方法重写这几个方面继续介绍面向对象的编程思想和Python类的继承. 复制代码 一.访问权限: Python中在类的内部定义属性和方法,在类的外部是可以直接调用或进行访问 ...

  9. 手机可以python编程吗_可以使用手机编程实现python吗

    这里介绍2个在可以在手机上编程Python的软件,一个是QPython3,一个是Termux,其中QPython3集成了Python3解释器,可以直接编写运行Python程序,Termux类似于一个手 ...

最新文章

  1. 深度学习Deep Learning 相关库简介
  2. 什么是 Silverlight?
  3. 优化理论08-----约束优化的最优性条件、拉格朗日条件、凸性、约束规范、二阶最优性条件(上)
  4. 灵敏度和稳定性能兼具 新气体传感器技术适用于工业应用
  5. mysql日期函数大全_MYSQL教程mysql日期时间函数大全 mysql函数大全
  6. Java中使用正则表达式
  7. 怎么注册tk域名_.TK后缀顶级域名的免费注册图文教程
  8. 印刷MES管理系统等数字化系统,应用发展如此迅速
  9. 输入关键词获取今日头条免费图片
  10. iOS开发——cache自动清理方案探索
  11. mysql介绍索引类型的章节_mysql索引总结--mysql索引类型以及创建的详细介绍
  12. 石墨笔记,熊掌记和 Effie 哪个更适合 SMZDM 开箱评论者?
  13. html5游戏 很费流量嘛,2017TFC5玩游戏林勇坤 优化HTML5游戏流量数据转化
  14. git(9)Git 内部原理
  15. K60系列学习(一)
  16. Linux网络管理—brctl命令
  17. c语言项目开发全程实录视频,C语言项目开发全程实录(第2版)(软件项目开发全程实录)简介,目录书摘...
  18. 修改app应用程序图标
  19. 933计算机大纲,2020年华南理工大学933化学综合考研大纲
  20. 让人叹为观止的蛋壳艺术

热门文章

  1. HID 异步访问和同步访问
  2. 【QT中使用post】
  3. opensuse 装机踩坑日志
  4. 75 道 BAJT 中高级 Java 面试题,你能答上几道?
  5. 用行内标签插入背景图
  6. 简单的五子棋java代码_求一个最简单的JAVA五子棋程序。。
  7. 组态王 6.55 启停plc_PLC串口通讯和通讯接口知识
  8. MV-HEVC多视点编码器报错:Error parsing option Frame1 with argument B 8 1 0 0 0.442
  9. 操作系统们正在一起步入未来
  10. 我的JAVA笔记--线程