From 46d5d0a90d5dcc0ca15287498dbb3c4b704988c8 Mon Sep 17 00:00:00 2001 From: Dimitri Lozeve Date: Thu, 29 Apr 2021 20:04:12 +0200 Subject: [PATCH] Improve color handling --- README.org | 3 +++ demo.png | Bin 0 -> 25947 bytes demo.ss | 5 +++-- uniplot/braille.ss | 2 +- uniplot/lineplot.ss | 31 ++++++++++++++++--------------- 5 files changed, 23 insertions(+), 18 deletions(-) create mode 100644 demo.png diff --git a/README.org b/README.org index 3e57e92..fcbba92 100644 --- a/README.org +++ b/README.org @@ -4,6 +4,9 @@ Unicode plotting library for [[https://cons.io/][Gerbil Scheme]]. Depends on [[https://github.com/dlozeve/fancy][Fancy]] for colors and display. +#+ATTR_HTML: :width 100% :style margin-left: auto; margin-right: auto; +[[./demo.png]] + ** Features - Braille canvas for plotting diff --git a/demo.png b/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..db79963bbfb4c78d109e4466c3cc626dd58eb8a1 GIT binary patch literal 25947 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 bKVIGnN%MBJrYslJJG7;(u6G5gW*_!nsuXoZ literal 0 HcmV?d00001 diff --git a/demo.ss b/demo.ss index 3a32cc5..b159bb2 100755 --- a/demo.ss +++ b/demo.ss @@ -9,5 +9,6 @@ (def (main . args) (let* ((xs (iota 1000 0 0.01)) (ys1 (map cos xs)) - (ys2 (map sin xs))) - (displayln (line-plot [xs ys1 ys2])))) + (ys2 (map (lambda (x) (/ 1 (+ 0.5 x))) xs)) + (ys3 (map (lambda (x) (sin (* 2 x))) xs))) + (displayln (line-plot [xs ys1 ys2 ys3])))) diff --git a/uniplot/braille.ss b/uniplot/braille.ss index b13c2a4..a095bf5 100644 --- a/uniplot/braille.ss +++ b/uniplot/braille.ss @@ -44,7 +44,7 @@ (def (indexf pred . lsts) (find pred (apply map list lsts))) -(def (canvases->string canvases (colors '(red green cyan yellow magenta white))) +(def (canvases->string canvases colors) (def canvases-str (map canvas->string canvases)) (def size (string-length (car canvases-str))) (apply str diff --git a/uniplot/lineplot.ss b/uniplot/lineplot.ss index ece0da4..80e0099 100644 --- a/uniplot/lineplot.ss +++ b/uniplot/lineplot.ss @@ -6,6 +6,8 @@ :dlozeve/uniplot/braille :dlozeve/fancy/format) +(def +default-colors+ '(green blue red yellow cyan magenta white)) + (def (scale-fn lo hi) (lambda (x) (/ (- x lo) (- hi lo)))) @@ -18,20 +20,18 @@ #t)) canvas) -(def (line-plot lsts width: (width 160) height: (height 80)) - (match lsts - ([ys] (canvas->string - (draw-canvas (iota (length ys)) ys - (scale-fn 0 (length ys)) - (scale-fn (apply min ys) (apply max ys)) - width: width height: height))) - ([xs ys] (canvas->string - (draw-canvas xs ys - (scale-fn (apply min xs) (apply max xs)) - (scale-fn (apply min ys) (apply max ys)) - width: width height: height))) - ([xs . yss] - (canvases->string +(def (line-plot lsts (colors +default-colors+) width: (width 160) height: (height 80)) + (canvases->string + (match lsts + ([ys] [(draw-canvas (iota (length ys)) ys + (scale-fn 0 (length ys)) + (scale-fn (apply min ys) (apply max ys)) + width: width height: height)]) + ([xs ys] [(draw-canvas xs ys + (scale-fn (apply min xs) (apply max xs)) + (scale-fn (apply min ys) (apply max ys)) + width: width height: height)]) + ([xs . yss] (let* ((x-scale-fn (scale-fn (apply min xs) (apply max xs))) (all-ys (flatten yss)) (min-ys (apply min all-ys)) @@ -39,4 +39,5 @@ (y-scale-fn (scale-fn min-ys max-ys))) (for/collect ((ys yss)) (draw-canvas xs ys x-scale-fn y-scale-fn - width: width height: height))))))) + width: width height: height))))) + colors))