summaryrefslogtreecommitdiff
path: root/research/colorspace/csv_to_svg_path.py
diff options
context:
space:
mode:
Diffstat (limited to 'research/colorspace/csv_to_svg_path.py')
-rwxr-xr-xresearch/colorspace/csv_to_svg_path.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/research/colorspace/csv_to_svg_path.py b/research/colorspace/csv_to_svg_path.py
new file mode 100755
index 0000000..5f638ed
--- /dev/null
+++ b/research/colorspace/csv_to_svg_path.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python3
+import textwrap
+
+def svg_path_from_points(points, r):
+ points_joined = ' '.join(f'{x:.6f} {y:.6f}' for x, y in points)
+ return textwrap.dedent(f'''
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
+ <svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="{r*2}mm"
+ height="{r*2}mm"
+ viewBox="0 0 {r*2} {r*2}"
+ id="svg2">
+ <g id="layer1">
+ <path id="path2991"
+ style="fill:none;stroke:#000000;stroke-width:0.1mm;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 0,0 L {points_joined}" />
+ </g>
+ </svg>
+ ''').strip()
+
+if __name__ == '__main__':
+ import argparse
+ parser = argparse.ArgumentParser()
+ parser.add_argument('locus_csv', help='CSV file containing locus coordinates. Format: lambda, x, y, z.')
+ parser.add_argument('-r', '--radius', type=float, default=100, help='Radius of plot area in mm')
+ args = parser.parse_args()
+
+ import csv, ast
+ points = []
+ with open(args.locus_csv, newline='') as f:
+ for row in csv.reader(f):
+ # use literal_eval to handle entries like "1.153E-5"
+ λ, x, y, z = (ast.literal_eval(e.strip()) for e in row)
+ points.append((x*args.radius*2, y*args.radius*2))
+
+ print(svg_path_from_points(points, args.radius))