Home

Awesome

cl-text-plot

A plotting library for Common Lisp that prints plots on the REPL using Unicode characters. Code quality/style may not be the best.

Can be loaded as "textplot" via Ultralisp.

Usage

For some reason the plots don't show up nicely on Github's markdown renderer, so the outputs look wonkier than they actually are.

There are two backends:

You can use the :as-string key to get the output as a string instead of printing to the console.

Normal Plotting

(plot '((1 2) (2 6) (3 4)) :title "Cool plot" :backend :blocks)
=>
      Cool plot
6🬕🬂🬂🬂🬂🬂🬂🬂🬂🬨🬊🬴🬂🬂🬂🬂🬂🬂🬂🬨
 ▌       🬦🬀  🬈🬱     ▐
 ▌      🬦🬀     🬈🬱   ▐
 ▌     🬦🬀        🬈🬱 ▐
 ▌    🬦🬀           🬈🬻
 ▌   🬦🬀             ▐
 ▌  🬦🬀              ▐
 ▌ 🬦🬀               ▐
 ▌🬦🬀                ▐
2🬺🬮🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬷
 1                  3
(plot '((1 2) (2 6) (3 4)) :title "Cool plot" :backend :braille)
=>

          Cool plot
6⡏⠉⠉⠉⠉⠉⠉⠉⠉⣹⠛⢍⠉⠉⠉⠉⠉⠉⠉⢹
 ⡇⠀⠀⠀⠀⠀⠀⠀ ⣰⠃⠀ ⠀⠑⢄ ⠀⠀⠀⠀⠀⢸
 ⡇⠀⠀⠀⠀⠀⠀ ⣰⠃⠀⠀  ⠀⠀⠀⠑⢄⠀⠀⠀⢸
 ⡇⠀⠀⠀⠀⠀ ⣰⠃⠀⠀⠀  ⠀⠀⠀⠀⠀⠑⢄⠀⢸
 ⡇⠀⠀⠀⠀ ⣰⠃⠀⠀⠀⠀  ⠀⠀⠀⠀⠀⠀⠀⠑⢼
 ⡇⠀⠀⠀ ⣰⠃⠀⠀⠀⠀⠀  ⠀⠀⠀⠀⠀⠀⠀⠀⢸
 ⡇⠀⠀ ⣰⠃⠀⠀⠀⠀⠀⠀  ⠀⠀⠀⠀⠀⠀⠀⠀⢸
 ⡇⠀ ⣰⠃⠀⠀⠀⠀⠀⠀⠀  ⠀⠀⠀⠀⠀⠀⠀⠀⢸
 ⡇ ⣰⠃⠀⠀⠀⠀⠀⠀⠀⠀  ⠀⠀⠀⠀⠀⠀⠀⠀⢸
2⣷⣃⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣸
 1                          3

Plotting Functions

(plot-fun #'sin -4 4 0.1 :blocks)
=>
               0.99957365🬕🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬡🬆🬊🬴🬂🬂🬂🬨
                         🬲           🬔  🬁🬓  ▐
                         🬝🬓         🬘    🬨  ▐
                         ▌🬧        🬞🬄     ▌ ▐
                         ▌🬁🬓       🬘      ▐ ▐
#<FUNCTION SIN>          ▌ 🬧      🬞🬄       ▌▐
                         ▌ 🬁🬓     🬘        ▐▐
                         ▌  🬧    🬞🬄         █
                         ▌  🬁▌   🬔          ▐
               -0.9995735🬲🬭🬭🬭🬷🬱🬭🬷🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬷
                         -4.0       3.9999971
                                  x
(plot-fun #'sin -4 4 0.1 :braille)
=>
               0.99957365⡏⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⢉⠏⠙⢏⠉⠉⠉⢹
                         ⣇⠀⠀⠀ ⠀⠀⠀⠀⠀ ⠀⠀⠀⡎  ⠀⠘⡆⠀⠀⢸
                         ⡟⡄⠀⠀ ⠀⠀⠀⠀⠀ ⠀⠀⡸⠀  ⠀⠀⢹⠀⠀⢸
                         ⡇⢳⠀⠀ ⠀⠀⠀⠀⠀⠀⢀⠇  ⠀⠀⠀⠀⠀⡇⠀⢸
                         ⡇⠈⡆⠀ ⠀⠀⠀⠀⠀⠀⡼⠀  ⠀⠀⠀⠀⠀⢸⠀⢸
#<FUNCTION SIN>          ⡇⠀⢱⠀⠀ ⠀⠀⠀⠀⢠⠇⠀  ⠀⠀⠀⠀⠀⠀⡇⢸
                         ⡇⠀⠈⡆⠀ ⠀⠀⠀⠀⡜⠀ ⠀ ⠀⠀⠀⠀⠀⠀⢸⣸
                         ⡇⠀⠀⢱⠀⠀ ⠀⠀⢠⠃ ⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⢿
                         ⡇⠀⠀⠈⣇⠀ ⠀⠀⡎⠀ ⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⢸
               -0.9995735⣇⣀⣀⣀⣘⣄⣀⣜⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣸
                         -4.0               3.9999971
                                      x

Scatter Plots

(scatter '((1 2) (2 6) (3 3) (4 4)) :backend :blocks)
=>
6.5🬕🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬨
   ▌       🬏          ▐
   ▌      🬁🬆          ▐
   ▌                  ▐
   ▌               🬏  ▐
   ▌              🬁🬆  ▐
   ▌          🬇🬛      ▐
   ▌  🬞               ▐
   ▌  🬊               ▐
1.5🬲🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬷
   0.625          4.375
(scatter '((1 2) (2 6) (3 3) (4 4)) :backend :braille)
=>
6.5⡏⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⢹
   ⡇⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀    ⠀⠀⢸
   ⡇⠀⠀⠀⠀⠀⠀⠈⠋⠀⠀⠀⠀⠀⠀⠀⠀    ⠀⠀⢸
   ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀    ⠀⠀ ⠀⢸
   ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀    ⠀⠀⠀⠀⠀⡀⠀⠀⢸
   ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀    ⠀⠀⠀⠀⠈⠋⠀⠀⢸
   ⡇⠀⠀⠀⠀⠀⠀⠀⠀    ⠀⠀⠠⡦⠀⠀⠀⠀⠀⠀⢸
   ⡇⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀    ⠀⠀⠀⠀⠀⠀⠀⠀⢸
   ⡇⠀⠀⠙⠀⠀⠀⠀⠀⠀⠀⠀⠀    ⠀⠀⠀⠀⠀⠀⢸
1.5⣇⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣸
   0.625                  4.375

Acknowledgement

Inspired by UnicodePlots.jl.

Also check out cl-spark and hbook!

vgplot can also generate text plots if you run (vgplot:format-plot t "set terminal dumb").