view dotplot/dotplot.py @ 2:5fb26b015fbe draft default tip

Uploaded smaller example image
author pdeford
date Tue, 01 Nov 2016 16:53:46 -0400
parents a8fcdd1c2cce
children
line wrap: on
line source

#!/usr/bin/env python

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import sys

def main():
	input_file = open(sys.argv[1])
	filter = int(sys.argv[2])
	png_path = sys.argv[3]

	sizes = {}
	alignments = {}

	for line in input_file:
		fields = line.split()
		r_start = int(fields[5])
		r_end = int(fields[6])
		q_start = int(fields[16])
		q_end = int(fields[17])
		contig_name = fields[9]
		contig_size = int(fields[11])
		reference_size = int(fields[3])

		if contig_name not in sizes:
			sizes[contig_name] = contig_size
			alignments[contig_name] = []

		if abs(r_start - r_end) > filter:
			alignments[contig_name].append([(r_start, r_end), (q_start, q_end)])

	cumulative = 0 

	plt.figure()
	yticks = [[], []]
	for key in sorted(sizes.keys(), key=lambda x:sizes[x], reverse=True):
		for reference, query in alignments[key]:
			plt.plot(reference, [x + cumulative for x in query], 'k-', zorder=10)
		yticks[0].append(cumulative + sizes[key]/2)
		yticks[1].append("{} bp".format(sizes[key]))
		cumulative += sizes[key]
		plt.axhline(cumulative, zorder=1, color='lightgray', )

	plt.xlim([0,reference_size])
	plt.ylim([0,cumulative])
	plt.yticks(*yticks)
	plt.tick_params(axis='y', which='both',length=0)
	plt.xlabel("Position in Reference (bp)")
	plt.ylabel("Contigs by size")
	plt.tight_layout()
	plt.savefig(png_path, dpi=200, format='pdf')

if __name__ == '__main__':
	main()