I am trying to visualize DNA sequences and their assembly. I have been able to produce the image
with the code below. This is very difficult since I need to experiment with the x coordinates to get the sequences with different colors close to each other. I was wondering if there is any proper way of doing this? Thanks in advance!
from revcomp import revcomp
import matplotlib.pyplot as plt
sequence = "ATGCGTGGACGTG"
complement = revcomp(sequence, reverse=False, complement=True)
seqlist_1 = ["5' ", sequence, " 3'"]
hydrobonds_1 = [" ", len(sequence)*"|"]
complist_1 = ["3' ", complement, " 5'"]
# Digest sequence like a 5' exonuclease
digest_1 = ["".join(complist_1)[0:10], 7*" ", "5'"]
sequence = "GACGTGAGTGTGACGTGACCCGGTTTT"
complement = revcomp(sequence, reverse=False, complement=True)
seqlist = ["5' ", sequence, " 3'"]
hydrobonds = [" ", len(sequence)*"|"]
complist = ["3' ", complement, " 5'"]
plt.plot()
plt.text(-0.04, 0.04, "".join(seqlist_1), color = "blue")
plt.text(-0.04, 0.035, "".join(complist_1)[0:10], color = "blue")
plt.text(-0.0235, 0.035, "".join(complist_1)[10:], color = "red")
plt.text(0.025, 0.04, "".join(seqlist)[9:], color = "green")
plt.text(0.01, 0.04, "".join(seqlist)[0:9], color = "red")
plt.text(0.01, 0.035, "".join(complist), color = "green")
plt.text(-0.04, 0.02, "".join(seqlist_1), color = "blue")
plt.text(-0.04, 0.015, "".join(complist_1)[0:10], color = "blue")
plt.text(0.025, 0.02, "".join(seqlist)[9:], color = "green")
plt.text(0.01, 0.015, "".join(complist), color = "green")
plt.text(-0.04, -0.01, "".join(seqlist_1)[:-2], color = "blue")
plt.text(-0.012, -0.01, "".join(seqlist)[9:], color = "green")
plt.text(-0.04, -0.015, "".join(complist_1)[0:10], color = "blue")
plt.text(-0.025, -0.015, "".join(complist)[2:], color = "green")
plt.text(0, 0.025, "5' exonuclease")
plt.text(0, 0, "Gibson assembly")
plt.axis('off')
plt.show()
The code uses the function below:
def revcomp(dna, reverse=True, complement=True):
""" Takes a sequence of DNA and converts it to its
compliment, if only compliment is intended
set reverse to False """
bases = 'ATGCatgcWSRYMKwsrymkHBVDhbvdNnTACGTACGWSYRKMWSYRKMDVBHDVBHNN'
complement_dict = {} # build a dictionary that contains each base with its complement.
for i in range(30):
complement_dict[bases[i]] = bases[i+30]
if reverse: # if reverse is True, default is true
dna = reversed(dna)
result_as_list = None # define an empty list
if complement: # if complement is true, default is true
result_as_list = [complement_dict[base] for base in dna]
else:
result_as_list = [base for base in dna]
return ''.join(result_as_list)