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:
parent
b138a28101
commit
98c6ab537c
2 changed files with 13 additions and 10 deletions
11
uniplot.ss
11
uniplot.ss
|
@ -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)))
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue