From 5c8e3c92348a977449f76548d2193ed851115a73 Mon Sep 17 00:00:00 2001 From: Dimitri Lozeve Date: Fri, 30 Apr 2021 23:08:44 +0200 Subject: [PATCH] Support NaN values --- uniplot/lineplot.ss | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/uniplot/lineplot.ss b/uniplot/lineplot.ss index 5daa4be..794af01 100644 --- a/uniplot/lineplot.ss +++ b/uniplot/lineplot.ss @@ -12,12 +12,18 @@ (def +default-colors+ '(green blue red yellow cyan magenta white)) +(def (nanmin . rest) + (apply min (filter finite? rest))) + +(def (nanmax . rest) + (apply max (filter finite? rest))) + (def (scale-fn lo hi) (lambda (x) (/ (- x lo) (- hi lo)))) (def (draw-canvas xs ys x-scale-fn y-scale-fn width: (width 160) height: (height 80)) (def canvas (make-braille-canvas (1+ height) (1+ width))) - (for ((x xs) (y ys)) + (for ((x xs) (y ys) when (and (finite? x) (finite? y))) (braille-canvas-set! canvas (inexact->exact (floor (* height (y-scale-fn y)))) (inexact->exact (floor (* width (x-scale-fn x)))) @@ -65,27 +71,27 @@ (match lsts ([ys] (let ((xmin 0) (xmax (length ys)) - (ymin (apply min ys)) - (ymax (apply max ys))) + (ymin (apply nanmin ys)) + (ymax (apply nanmax ys))) (values xmin xmax ymin ymax [(draw-canvas (iota (length ys)) ys (scale-fn xmin xmax) (scale-fn ymin ymax) width: width height: height)]))) - ([xs ys] (let ((xmin (apply min xs)) - (xmax (apply max xs)) - (ymin (apply min ys)) - (ymax (apply max ys))) + ([xs ys] (let ((xmin (apply nanmin xs)) + (xmax (apply nanmax xs)) + (ymin (apply nanmin ys)) + (ymax (apply nanmax ys))) (values xmin xmax ymin ymax [(draw-canvas xs ys (scale-fn xmin xmax) (scale-fn ymin ymax) width: width height: height)]))) - ([xs . yss] (let* ((xmin (apply min xs)) - (xmax (apply max xs)) + ([xs . yss] (let* ((xmin (apply nanmin xs)) + (xmax (apply nanmax xs)) (all-ys (flatten yss)) - (ymin (apply min all-ys)) - (ymax (apply max all-ys)) + (ymin (apply nanmin all-ys)) + (ymax (apply nanmax all-ys)) (x-scale-fn (scale-fn xmin xmax)) (y-scale-fn (scale-fn ymin ymax))) (values xmin xmax ymin ymax