Dead simple terminal plots from JSON (or CSV) data. Bar charts, line charts, and scatter plots are supported.
go get -u github.com/sgreben/jp/cmd/jp
Or download the binary from the releases page.
# Linux
curl -LO https://github.com/sgreben/jp/releases/download/1.1.3/jp_1.1.3_linux_x86_64.zip
unzip jp_1.1.3_linux_x86_64.zip
# OS X
curl -LO https://github.com/sgreben/jp/releases/download/1.1.3/jp_1.1.3_osx_x86_64.zip
unzip jp_1.1.3_osx_x86_64.zip
# Windows
curl -LO https://github.com/sgreben/jp/releases/download/1.1.3/jp_1.1.3_windows_x86_64.zip
unzip jp_1.1.3_windows_x86_64.zip
jp
reads JSON on stdin and prints plots to stdout.
Usage of jp:
-type value
Plot type. One of [line bar scatter hist] (default line)
-x string
x values (JSONPath expression)
-y string
y values (JSONPath expression)
-xy string
x,y value pairs (JSONPath expression). Overrides -x and -y if given.
-height int
Plot height (default 0 (auto))
-width int
Plot width (default 0 (auto))
-canvas value
Canvas type. One of [full quarter braille auto] (default auto)
-input value
Input type. One of [json csv] (default json)
$ cat examples/tcp-time.json | jp -x ..Label -y ..Count -type bar
69
█████████████
█████████████
█████████████
█████████████
█████████████
█████████████ 21
█████████████ █████████████ 7 2 1
█████████████ █████████████ ▄▄▄▄▄▄▄▄▄▄▄▄▄ ▁▁▁▁▁▁▁▁▁▁▁▁▁ ▁▁▁▁▁▁▁▁▁▁▁▁▁
46.85267ms 48.38578ms 49.91889ms 51.452ms 52.98511ms
$ cat examples/tcp-time.json | jp -xy "..[Label,Count]" -type bar
69
█████████████
█████████████
█████████████
█████████████
█████████████
█████████████ 21
█████████████ █████████████ 7 2 1
█████████████ █████████████ ▄▄▄▄▄▄▄▄▄▄▄▄▄ ▁▁▁▁▁▁▁▁▁▁▁▁▁ ▁▁▁▁▁▁▁▁▁▁▁▁▁
46.85267ms 48.38578ms 49.91889ms 51.452ms 52.98511ms
$ cat examples/tcp-time.json | jp -y ..Count -type bar
69
█████████████
█████████████
█████████████
█████████████
█████████████
█████████████ 21
█████████████ █████████████ 7 2 1
█████████████ █████████████ ▄▄▄▄▄▄▄▄▄▄▄▄▄ ▁▁▁▁▁▁▁▁▁▁▁▁▁ ▁▁▁▁▁▁▁▁▁▁▁▁▁
0 1 2 3 4
$ echo '[[-3, 5], [-2, 0], [-1, 0.1], [0, 1], [1, 2], [2, 3]]' | jp -xy '[*][0, 1]' -type bar
5
███████████
███████████
███████████ 3
███████████ ▄▄▄▄▄▄▄▄▄▄▄
███████████ 2 ███████████
███████████ 1 ███████████ ███████████
███████████ 0.1 ▄▄▄▄▄▄▄▄▄▄▄ ███████████ ███████████
███████████ 0 ▁▁▁▁▁▁▁▁▁▁▁ ███████████ ███████████ ███████████
-3 -2 -1 0 1 2
$ jq -n '[range(200)/20 | [., sin]]' | jp -x '[*][0]' -y '[*][1]'
1.059955│ ▄▄▄▖ ▗▄▄▄▖
│ ▄▀▘ ▝▜▖ ▗▞▘ ▝▚
│ ▟ ▝▄ ▗▀ ▜
│ ▟ ▝▄ ▗▀ ▜
│ ▐ ▝▖ ▗▞ ▚▖
│ ▗▘ ▝▖ ▞ ▚
│ ▗▘ ▚ ▞ ▌
│ ▌ ▌ ▗▘ ▝▖
│ ▞ ▝▖ ▌ ▚
│▗▘ ▚ ▞ ▌
│▌ ▌ ▗▘ ▝▖
│ ▝▖ ▗▘ ▐
│ ▐ ▞ ▚
│ ▚ ▐ ▝▖
│ ▝▖ ▗▘ ▐
│ ▐ ▞ ▚
│ ▀▖ ▐
│ ▚ ▄▘
│ ▙ ▗▘
│ ▚ ▄▘
│ ▚▄ ▗▞▘
│ ▝▀▀▀▘
-1.059955└─────────────────────────────────────────────────────────────────────
0 9.95
$ jq -n '[range(200)/20 | [., sin]]' | jp -xy '[*][0, 1]'
1.059955│ ▄▄▄▖ ▗▄▄▄▖
│ ▄▀▘ ▝▜▖ ▗▞▘ ▝▚
│ ▟ ▝▄ ▗▀ ▜
│ ▟ ▝▄ ▗▀ ▜
│ ▐ ▝▖ ▗▞ ▚▖
│ ▗▘ ▝▖ ▞ ▚
│ ▗▘ ▚ ▞ ▌
│ ▌ ▌ ▗▘ ▝▖
│ ▞ ▝▖ ▌ ▚
│▗▘ ▚ ▞ ▌
│▌ ▌ ▗▘ ▝▖
│ ▝▖ ▗▘ ▐
│ ▐ ▞ ▚
│ ▚ ▐ ▝▖
│ ▝▖ ▗▘ ▐
│ ▐ ▞ ▚
│ ▀▖ ▐
│ ▚ ▄▘
│ ▙ ▗▘
│ ▚ ▄▘
│ ▚▄ ▗▞▘
│ ▝▀▀▀▘
-1.059955└─────────────────────────────────────────────────────────────────────
0 9.95
$ cat examples/tcp-time.json | jp -y ..Duration
5.726165e+07│
│
│
│
│ ▗
│ ▟
│ █
│▐▝▖
│▐ ▌ ▌
│▐ ▌ ▌
│▌ ▌ ▐▚
│▌ ▌ ▗ ▗ ▐▐ ▌
│▘ ▌ ▖ ▐ ▞▀▖ ▐▐ ▌
│ ▚ ▐▚ ▗▀▖ ▗▚ ▌▌ ▗▘ ▌ ▖▗▀▌ ▌▐ █
│ ▐ ▛▌ ▚▖▞ ▚▐▖ ▞▐ ▌▌ ▗ ▐ ▐▟▐▞ ▚ ▗ ▌▝▖ ▐▐ ▐
│ ▐ ▐ ▝ ▝▌▝▀ ▝▟ ▚▗▜ ▞ ▘ ▐▖█▗▘ ▌ ▐▐ ▗ ▄▖ ▄▖ ▌▌
│ ▝▚▐ ▘ ▘ ▐▘▝▖▄▌ ▝▝▟ ▀▀▚▟ ▌ ▖▞▘▌▐ ▚ ▗▄ ▐ ▚▄▖ ▄ ▄▘▌▞▄▄▀▚ ▄ ▄▗▞▖▞▄▄▚
│ ▝▌ ▛ ▌ ▝ ▙▞▝ ▝▘ ▝▚▘ ▀▘ ▝▀ ▀ ▐▘ ▚▞▀ ▀ ▘ ▚▘
│
│
│
│
4.446018e+07└──────────────────────────────────────────────────────────────────────────────────────
0 99
$ cat examples/mvrnorm.json | jp -xy '..[x,y]' -type scatter
3.535344│ ⠄ ⠄
│ ⠈⠂ ⠂ ⡀ ⠂
│ ⠐⡀⡀⡂ ⠁ ⢄ ⠁ ⠠
│ ⡀ ⠆ ⠈ ⠄⡀ ⠂
│ ⡀ ⠠ ⡀ ⡀ ⠄ ⡀⠐⠄⠁⠐ ⠠⢆⠠⠂⠂⠄⣀⢈ ⡀⠈ ⡀
│ ⡀⠂⠂⠄ ⡀⠂⢔⠠ ⢤⢀⠌⣡⠁⠦⠄⠐⡐⠂⣀⠅⠁⠈ ⠂ ⠈⠁⠁ ⡀ ⠄
│ ⡀ ⢀ ⠄ ⠈⠠ ⠡⠑⠈⠈⢢⡁⡄⢈⠂⢡⠈⡄⡀⠈⠰⢉⡠⠘⢄⢃⠉⢀⣄⠢⠠⠄ ⠠ ⡀⠁ ⡀ ⠂
│ ⠈ ⡂⠈⡁⠈⠄⢂⡹⡐⡡⡆⡥⣙⡶⡼⠱⣅⣅⣼⢗⡱⢐⣈⠑⢁⠂ ⢐⢁⠭⠘⡀ ⠈
│ ⠁ ⢀⠄⢈⠈⡰⢀⡥⠋⣧⣓⣚⡛⢲⣽⣝⣭⢙⣟⢲⡽⣋⡠⣿⣜⣵⠙⡦⠗ ⣡⠁⠁⠁⠄⠠ ⠄⡂
│ ⠄⠌⠌⠡⠉⡐⢯⣵⡏⢵⡞⠂⢰⣽⣷⢛⣯⡣⣷⢭⣞⣏⠤⣾⢡⡻⠢⢊⢠⡠⠸⢄⣃⡀⢁⠐ ⠐⡀ ⠂ ⠄
│ ⠨ ⡈⠂ ⢀⢑⠄⣜⡾⣴⢨⠶⣪⣧⢿⣷⣷⡱⣿⣞⣲⣮⣮⣯⢾⡷⡬⡷⣺⠤⢏⡼⣨⢌⡬⠠⢂⢠⠒⠱⠆⡈
│ ⠈ ⠃ ⠄⡐⠂⠐⢀⢈⣂⡈⣳⣷⣜⢺⣿⣹⣷⣼⣯⡿⣃⣽⣿⢾⣟⣾⢵⣻⠯⡼⡃⣼⣗⢲⠪⠇⣉⠺ ⢱⠠⠙⡀⢐⠌
│ ⠄ ⠈⠊⠐⠑⠨⠚⢁⡊⢾⡶⢩⢿⣏⣽⢞⣼⣇⣵⣿⣿⣽⣿⢽⣭⠺⣿⣽⣳⢚⣾⣻⣾⣜⠩⡒⣃⠈⢢⠕⢂⢰⡀ ⡔⢀⢀ ⡀
│ ⢀⠂⠁⠂⠇ ⠂⠊⢀⠐⡘⡍⡇⣚⢸⢟⣯⢿⣳⡪⣫⣵⣿⣯⣿⢿⣷⣻⣖⣗⣻⣚⢥⡷⣕⣏⠶⠊⠄⣠⠰⠂⡄⠂ ⠄⠁
│ ⠠⢂ ⠘⠐⣀ ⣀⢡⢐⠔⢫⠯⢕⠫⠿⣹⢶⣾⡻⣭⣽⢗⠿⣹⣛⣺⣿⠯⢲⡼⣵⢉⣭⢐⣟⡍⠄⠈⠥⠄ ⠁ ⠄
│ ⠈⠂ ⠊⡀⡈⠢⡌⡠⠖⢤⠥⡑⣯⣾⣴⣯⡿⣯⣝⣯⣿⠧⣽⣒⢾⣼⣻⣛⣗⡹⡽⢪⠯⠒⡨⠈ ⠈⡐⢄ ⠂⠘⠠ ⠂
│ ⠰ ⡀⠃⠁⠠ ⠉⡈⡨⡱⢍⠌⠷⣯⠫⠬⡙⣴⣯⡣⡟⡮⠩⣫⠿⢞⢵⡰⠞⡂⠴ ⠕⢀⡂⠁ ⢀ ⠤ ⠈
│ ⢩⠂ ⠁⡄ ⢀⠲⢂⠑⢁⡘⠄⠵⣣⢑⢻⠨⡩⣌⠕⢮⣮⣋⢹⡁⣊⡃⠈⡕⡘⡠⠨⠄⡘⠨ ⠊⠁ ⠂
│ ⠐ ⢀ ⠈⠐⠔⠈ ⠁⢀⣀⡃⣊⢁⡘⠁⠛⠨ ⠒⡑⡀⠵⢙⠄⠡⠢⠃⠄⠋⠅ ⠥⠁⠠⢀ ⠄
│ ⢀⢁ ⠆ ⠉⠁⠐ ⠄⠁⢑⡀⢀⠠⠑⢡⢊⠂⠑⠌⡅⠊⠄⠉⢈⡐ ⡀ ⠠ ⠂
│ ⢀ ⠑ ⠂ ⡁ ⠌⢠⠈⠂⠄⠉⡃⠈⠄ ⠂⠠⠁ ⠄ ⢀ ⠠
│ ⠐ ⠐ ⢁⠂⠂⠢⠠⠄⠔⠐ ⠁
│ ⠢ ⠁ ⠂⠐ ⠐ ⠐ ⠈
│ ⢀ ⠄⠈ ⠈
│ ⠐
│
│
│ ⠈
-4.271874└─────────────────────────────────────────────────────────────────────
-4.08815 3.79083
$ cat examples/mvrnorm.json | jp -x ..x -type hist
684 1 [0.571769,1.14354)
██████ 2 [1.14354,1.71531)
██████ 624 3 [1.71531,2.28708)
████████████ 4 [2.28708,2.85885)
557 ████████████ 5 [2.85885,3.43062)
██████████████████ 6 [3.43062,4.00238)
██████████████████ 7 [4.00238,4.57415)
██████████████████ 8 [4.57415,5.14592)
██████████████████ 9 [5.14592,5.71769)
██████████████████ 404 10 [5.71769,6.28946)
████████████████████████ 11 [6.28946,6.86123)
314 ████████████████████████ 12 [6.86123,7.433]
▄▄▄▄▄▄████████████████████████
██████████████████████████████
██████████████████████████████
██████████████████████████████
██████████████████████████████ 176
████████████████████████████████████
98 ████████████████████████████████████
██████████████████████████████████████████ 79
1 4 41 ████████████████████████████████████████████████ 14 4
▁▁▁▁▁▁▁▁▁▁▁▁██████████████████████████████████████████████████████▁▁▁▁▁▁▁▁▁▁▁▁
0 1 2 3 4 5 6 7 8 9 10 11 12
$ cat examples/mvrnorm.json | jp -x ..x -type hist -bins 5
1652
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████ 728
██████████████████████████████████
541 ██████████████████████████████████
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄██████████████████████████████████
███████████████████████████████████████████████████
███████████████████████████████████████████████████
███████████████████████████████████████████████████
███████████████████████████████████████████████████
22 ███████████████████████████████████████████████████ 57
▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███████████████████████████████████████████████████▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
[0,1.4866) [1.4866,2.9732) [2.9732,4.4598) [4.4598,5.9464) [5.9464,7.433]
$ cat examples/sin.csv | jp -input csv -xy '[*][0,1]'
1.059955│ ▗▄▛▀▀▚▄▖ ▄▄▀▀▀▄▄
│ ▗▞▘ ▝▚▖ ▄▀ ▝▀▄
│ ▟▘ ▝▄ ▗▀ ▝▀▖
│ ▗▛ ▚▖ ▞▘ ▝▙
│ ▄▘ ▀▖ ▞ ▚
│▞▘ ▝▌ ▗▛ ▚▖
│ ▝▚ ▐▘ ▝▄
│ ▜▖ ▟▘ ▝▄
│ ▐▄ ▗▞ ▝▚
│ ▚▖ ▄▀
│ ▀▙▖ ▄▛
│ ▀▀▄▄▄▞▀▘
-1.059955└─────────────────────────────────────────────────────────────────────
0 9.95
In case you're on mobile, here's some PNGs of what jp
output looks like: