我有兴趣做一个两个dna序列的点图矩阵,其中k作为身份相似性得分,t作为阈值。我正在学习python,虽然我很擅长数据,但我还是在使用表格和点图。我创建了上面的代码来生成一个简单的单一矩阵。现在我需要改变它或产生一个新的。
请参阅this paper了解所需的定义。
答案 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|■ ■ ■ ■ ■
哪个与纸张上的数字相匹配(尽管它没有行标签和列标签 - 如果需要,可以添加):
答案 1 :(得分:1)