如何在python中创建两个DNA序列的点图

时间:2016-11-26 19:42:46

标签: python-2.7

我有兴趣做一个两个dna序列的点图矩阵,其中k作为身份相似性得分,t作为阈值。我正在学习python,虽然我很擅长数据,但我还是在使用表格和点图。我创建了上面的代码来生成一个简单的单一矩阵。现在我需要改变它或产生一个新的。

请参阅this paper了解所需的定义。

2 个答案:

答案 0 :(得分:1)

你应该将生成矩阵的逻辑与制作角色的相对简单的逻辑分开。

首先定义delta函数:

def delta(x,y):
    return 0 if x == y else 1

现在M[i,j]

def M(seq1,seq2,i,j,k):
    return sum(delta(x,y) for x,y in zip(seq1[i:i+k],seq2[j:j+k]))

制作一个矩阵:

def makeMatrix(seq1,seq2,k):
    n = len(seq1)
    m = len(seq2)
    return [[M(seq1,seq2,i,j,k) for j in xrange(m-k+1)] for i in xrange(n-k+1)]

绘制矩阵。您可以尝试使用不同的字符:

def plotMatrix(M,t, seq1, seq2, nonblank = unichr(0x25A0), blank = ' '):
    print(' |' + seq2)
    print('-'*(2 + len(seq2)))
    for label,row in zip(seq1,M):
        line = ''.join(nonblank if s < t else blank for s in row)
        print(label + '|' + line)

包装函数:

def dotplot(seq1,seq2,k = 1,t = 1):
    M = makeMatrix(seq1,seq2,k)
    plotMatrix(M, t, seq1,seq2) #experiment with character choice

然后:

#for testing purposes (drawn from paper):

seqx = "ACCTGAGCTCACCTGAGTTA"
seqy = "ACCTGAGCTCACCTGAGTTA"
dotplot(seqx,seqy)

输出:

 |ACCTGAGCTCACCTGAGTTA
----------------------
A|■    ■    ■    ■   ■
C| ■■    ■ ■ ■■       
C| ■■    ■ ■ ■■       
T|   ■    ■    ■   ■■ 
G|    ■ ■       ■ ■   
A|■    ■    ■    ■   ■
G|    ■ ■       ■ ■   
C| ■■    ■ ■ ■■       
T|   ■    ■    ■   ■■ 
C| ■■    ■ ■ ■■       
A|■    ■    ■    ■   ■
C| ■■    ■ ■ ■■       
C| ■■    ■ ■ ■■       
T|   ■    ■    ■   ■■ 
G|    ■ ■       ■ ■   
A|■    ■    ■    ■   ■
G|    ■ ■       ■ ■   
T|   ■    ■    ■   ■■ 
T|   ■    ■    ■   ■■ 
A|■    ■    ■    ■   ■

哪个与纸张上的数字相匹配(尽管它没有行标签和列标签 - 如果需要,可以添加):

Airbnb style guide

答案 1 :(得分:1)

为了获得更漂亮的情节,在接受的答案中添加了一点点......

import numpy
import matplotlib.pyplot as plt
dotplot=plt.imshow(numpy.array(makeMatrix(seqx,seqy,1)))
xt=plt.xticks(numpy.arange(len(list(seqx))),list(seqx))
yt=plt.yticks(numpy.arange(len(list(seqx))),list(seqx))

example dot plot