diff --git a/genomix/genomix-hadoop/src/test/python/convert_graphviz.py b/genomix/genomix-hadoop/src/test/python/convert_graphviz.py
old mode 100644
new mode 100755
index f5d5cd1..fe9b778
--- a/genomix/genomix-hadoop/src/test/python/convert_graphviz.py
+++ b/genomix/genomix-hadoop/src/test/python/convert_graphviz.py
@@ -2,7 +2,7 @@
 """
 Convert a graph to graphviz format and run `dot` on it.
 
-Kmer sequences are included 
+Kmer sequences are included
 """
 
 __author__ = "Jacob Biesinger"
@@ -12,9 +12,9 @@
 
 import sys
 import os
-import glob
 import re
 import string
+import argparse
 
 import pydot
 
@@ -23,9 +23,11 @@
 #edge_colors = dict(FF='black', FR='red', RF='blue', RR='gray')
 edge_colors = dict(FF='#DD1E2F', FR='#EBB035', RF='#06A2CB', RR='#218559')
 
+
 def reverse_complement(kmer, _table=string.maketrans('ACGT', 'TGCA')):
     return string.translate(kmer, _table)[::-1]
 
+
 def add_legend(graph):
     legend = pydot.Subgraph('cluster_legend', splines='line', rankdir='LR', label='legend', rank='min')
     for i, (edgetype, edgecolor) in enumerate(sorted(edge_colors.items())):
@@ -35,6 +37,7 @@
     graph.add_subgraph(legend)
     return graph
 
+
 def graph_from_file(filename, legend=True, kmers=True, flag=True):
     graph_name = os.path.split(filename)[1].replace('.', '_')
     graph = pydot.Dot(graph_name, graph_type='digraph', rankdir='LR', splines='ortho', weight='2')
@@ -61,41 +64,58 @@
         for edgename, edgelist in [('FF', ff), ('FR', fr), ('RF', rf), ('RR', rr)]:
             for e in edgelist:
                 edges.append(pydot.Edge(nodeid, e, color=edge_colors[edgename]))
-    
+
     for readid, subnodes in nodes.items():
         subg = pydot.Subgraph('cluster_' + readid, fillcolor='lightgray')
         for node in subnodes:
             subg.add_node(node)
         graph.add_subgraph(subg)
-    
+
     for e in edges:
         graph.add_edge(e)
-    
+
     return graph
 
-def recursive_plot(topdir, suffix='.txt'):
+def recursive_plot(topdir, suffix='.txt', **kwargs):
     "Recursively plot any files matching `suffix`"
-    def matches(f):
-        return os.path.isfile(f) and f.endswith(suffix)
-    
     for root, dirnames, filenames in os.walk(topdir):
-        for filename in filter(matches, filenames):
+        for filename in filenames:
+            f = os.path.join(root, filename)
+            if not os.path.isfile(f) or not f.endswith(suffix):
+                continue
             try:
-                graph = graph_from_file(os.path.join(root, filename))
+                graph = graph_from_file(f, **kwargs)
             except Exception:
-                raise
+                pass
             else:
+                print 'plotting', f
                 graph.write_png(f + '.png')
-    
+
+
+def get_parser():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--no-legend', action='store_true')
+    parser.add_argument('--no-kmers', action='store_true')
+    parser.add_argument('--no-flag', action='store_true')
+
+    parser.add_argument('txt_graphs', nargs='*')
+    parser.add_argument('--directory', '-d', help='Recurse here and plot all '
+                        'graphs that are found.', nargs='+', default=[])
+    return parser
+
 
 def main(args):
-    for f in args:
-        try:
-            graph = graph_from_file(f)
-        except Exception as e:
-            raise
-        else:
-            graph.write_png(f + '.png')
+    parser = get_parser()
+    args = parser.parse_args(args)
+    kwargs = dict(legend=not args.no_legend, kmers=not args.no_kmers,
+                  flag=not args.no_flag)
+    for filename in args.txt_graphs:
+        graph = graph_from_file(filename, **kwargs)
+        print 'plotting', filename
+        graph.write_png(filename + '.png')
+
+    for d in args.directory:
+        recursive_plot(d, **kwargs)
 
 if __name__ == '__main__':
     main(sys.argv[1:])
