Allow plotting very large CSV files

Using apply leads to implementation limits in the number of arguments
which are fairly low. Refactoring everything as folds allows to handle
an arbitrary number of datapoints.
This commit is contained in:
Dimitri Lozeve 2021-10-23 19:34:10 +02:00
parent b138a28101
commit 98c6ab537c
2 changed files with 13 additions and 10 deletions

View file

@ -3,15 +3,18 @@
(export main) (export main)
(import :std/iter (import :std/iter
:std/misc/func
:std/text/csv :std/text/csv
:dlozeve/uniplot/lineplot) :dlozeve/uniplot/lineplot)
(def (parse-number s)
(or (string->number s) +nan.0))
(def (main . args) (def (main . args)
(def csv (read-csv-lines (current-input-port))) (def csv (read-csv-lines (current-input-port)))
(def names (car csv)) (def names (car csv))
(def lsts (def lsts
(apply map list (for/fold (lsts (repeat '() (length names)))
(for/collect ((row (cdr csv))) ((row (cdr csv)))
(for/collect ((x row)) (map cons (map parse-number row) lsts)))
(or (string->number x) +nan.0)))))
(displayln (line-plot lsts title: (if (null? args) "" (car args)) names: names))) (displayln (line-plot lsts title: (if (null? args) "" (car args)) names: names)))

View file

@ -76,18 +76,18 @@
(match lsts (match lsts
([ys] (let ((xmin 0) ([ys] (let ((xmin 0)
(xmax (length ys)) (xmax (length ys))
(ymin (apply nanmin ys)) (ymin (for/fold (ymin +nan.0) (y ys) (nanmin ymin y)))
(ymax (apply nanmax ys))) (ymax (for/fold (ymax +nan.0) (y ys) (nanmax ymax y))))
(values xmin xmax ymin ymax (values xmin xmax ymin ymax
[(draw-canvas (iota (length ys)) ys [(draw-canvas (iota (length ys)) ys
(scale-fn xmin xmax) (scale-fn xmin xmax)
(scale-fn ymin ymax) (scale-fn ymin ymax)
width: width height: height)]))) width: width height: height)])))
([xs . yss] (let* ((xmin (apply nanmin xs)) ([xs . yss] (let* ((xmin (for/fold (xmin +nan.0) (x xs) (nanmin xmin x)))
(xmax (apply nanmax xs)) (xmax (for/fold (xmax +nan.0) (x xs) (nanmax xmax x)))
(all-ys (flatten yss)) (all-ys (flatten yss))
(ymin (apply nanmin all-ys)) (ymin (for/fold (ymin +nan.0) (y all-ys) (nanmin ymin y)))
(ymax (apply nanmax all-ys)) (ymax (for/fold (ymax +nan.0) (y all-ys) (nanmax ymax y)))
(x-scale-fn (scale-fn xmin xmax)) (x-scale-fn (scale-fn xmin xmax))
(y-scale-fn (scale-fn ymin ymax))) (y-scale-fn (scale-fn ymin ymax)))
(values xmin xmax ymin ymax (values xmin xmax ymin ymax