mkaz.blog

Terminal Heatmap Chart

Awhile ago I created a simple script to create bar charts on the command-line for when I published my running year in review, 2017 example here. I published the script on Github and surprisingly have received a few contributors over the years, recently a couple of students from Greece did a nice upgrade to numerous features which is awesome.

I also track my running data using a Javsacript heatmap chart, which is published here. Publishing requires generating the data, uploading, and then viewing on Codepen. This is too many steps, which got me thinking maybe I can create a terminal heatmap chart. Yes, I can.


     Jun Jul Aug Sep Oct Nov Dec Jan Feb Mar Apr May Jun
Mon: ░   ░         ░░░                    ░          ░  ░
Tue:  ░     ░                         ░
Wed: ░   ░ ░    ░░    ░ ░                 ░         ░   ░░
Thu:   ░   ░░ ░░  ░▒
Fri: ░   ░   ░  ░    ░   ░
Sat:  ░░░  ░     ▒     ▒                                ░
Sun:          ░ ░     ░

The above is the example from the updated termgraph.py script. So to generate the data, first I store my data in a simple text file with the following format:

# date | distance | time | notes
2018-06-20 | 4.26 | 38:58 |

This needed to be massaged a little, since the script expects the data either comma or space seperated. Using the awk command it is straight forward to change the delimiter and print out the first two columns; which can then be piped straight to termgraph.py

awk 'BEGIN{FS="|"}{ print $1 $2 }' runs.data | termgraph.py --calendar

If you need an Awk refresher, check out An Awk Tutorial by Example.

So now I can see a quick calendar of my latest runs for the year, but the tool is also fairly flexible to work with any type of data you want to chart. It supports a color parameter, which looks like this in the terminal:

Fun things you can do charting on the command-line, take a look at the repo for other charting examples on Github: https://github.com/mkaz/termgraph

Bonus, I recently added emoji support to termgraph.py, this also works in the heatmap which is a little less accurate, but more fun.

     Jun  Jul  Aug  Sep  Oct  Nov  Dec  Jan  Feb  Mar  Apr  May  Jun
Mon:     😀         😀😀😀                    😀          😀  😀
Tue:        😀                         😀
Wed:     😀 😀    😀😀    😀 😀                 😀         😀   😀😀
Thu:   😀   😀😀 😀😀  😀😀
Fri:     😀   😀  😀    😀   😀
Sat:  😀😀😀  😀     😀     😀                                😀
Sun:          😀 😀     😀