dead simple terminal plots from JSON data. single binary, no dependencies. linux, osx, windows.
MIT License
Dead simple terminal plots from JSON (or CSV) data. Bar charts, line charts, scatter plots, histograms and heatmaps 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.12/jp_1.1.12_linux_x86_64.zip
unzip jp_1.1.12_linux_x86_64.zip
# OS X
curl -LO https://github.com/sgreben/jp/releases/download/1.1.12/jp_1.1.12_osx_x86_64.zip
unzip jp_1.1.12_osx_x86_64.zip
# Windows
curl -LO https://github.com/sgreben/jp/releases/download/1.1.12/jp_1.1.12_windows_x86_64.zip
unzip jp_1.1.12_windows_x86_64.zip
jp
reads JSON (or CSV) on stdin and prints plots to stdout.
Usage of jp:
-type value
Plot type. One of [line bar scatter hist hist2d] (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.
-bins uint
Number of histogram bins (default 0 (auto))
-input value
Input type. One of [json csv] (default json)
-height int
Plot height (default 0 (auto))
-width int
Plot width (default 0 (auto))
-canvas value
Canvas type. One of [full full-escape full-bw full-wb quarter braille auto] (default auto)
$ < 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
$ < 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
$ < 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
$ < examples/tcp-time.json jp -y ..Duration
5.726165e+07│
│
│
│
│ ▗
│ ▟
│ █
│▐▝▖
│▐ ▌ ▌
│▐ ▌ ▌
│▌ ▌ ▐▚
│▌ ▌ ▗ ▗ ▐▐ ▌
│▘ ▌ ▖ ▐ ▞▀▖ ▐▐ ▌
│ ▚ ▐▚ ▗▀▖ ▗▚ ▌▌ ▗▘ ▌ ▖▗▀▌ ▌▐ █
│ ▐ ▛▌ ▚▖▞ ▚▐▖ ▞▐ ▌▌ ▗ ▐ ▐▟▐▞ ▚ ▗ ▌▝▖ ▐▐ ▐
│ ▐ ▐ ▝ ▝▌▝▀ ▝▟ ▚▗▜ ▞ ▘ ▐▖█▗▘ ▌ ▐▐ ▗ ▄▖ ▄▖ ▌▌
│ ▝▚▐ ▘ ▘ ▐▘▝▖▄▌ ▝▝▟ ▀▀▚▟ ▌ ▖▞▘▌▐ ▚ ▗▄ ▐ ▚▄▖ ▄ ▄▘▌▞▄▄▀▚ ▄ ▄▗▞▖▞▄▄▚
│ ▝▌ ▛ ▌ ▝ ▙▞▝ ▝▘ ▝▚▘ ▀▘ ▝▀ ▀ ▐▘ ▚▞▀ ▀ ▘ ▚▘
│
│
│
│
4.446018e+07└──────────────────────────────────────────────────────────────────────────────────────
0 99
$ < examples/mvrnorm.json jp -xy '..[x,y]' -type scatter
3.535344│ ⠄ ⠄
│ ⠈⠂ ⠂ ⡀ ⠂
│ ⠐⡀⡀⡂ ⠁ ⢄ ⠁ ⠠
│ ⡀ ⠆ ⠈ ⠄⡀ ⠂
│ ⡀ ⠠ ⡀ ⡀ ⠄ ⡀⠐⠄⠁⠐ ⠠⢆⠠⠂⠂⠄⣀⢈ ⡀⠈ ⡀
│ ⡀⠂⠂⠄ ⡀⠂⢔⠠ ⢤⢀⠌⣡⠁⠦⠄⠐⡐⠂⣀⠅⠁⠈ ⠂ ⠈⠁⠁ ⡀ ⠄
│ ⡀ ⢀ ⠄ ⠈⠠ ⠡⠑⠈⠈⢢⡁⡄⢈⠂⢡⠈⡄⡀⠈⠰⢉⡠⠘⢄⢃⠉⢀⣄⠢⠠⠄ ⠠ ⡀⠁ ⡀ ⠂
│ ⠈ ⡂⠈⡁⠈⠄⢂⡹⡐⡡⡆⡥⣙⡶⡼⠱⣅⣅⣼⢗⡱⢐⣈⠑⢁⠂ ⢐⢁⠭⠘⡀ ⠈
│ ⠁ ⢀⠄⢈⠈⡰⢀⡥⠋⣧⣓⣚⡛⢲⣽⣝⣭⢙⣟⢲⡽⣋⡠⣿⣜⣵⠙⡦⠗ ⣡⠁⠁⠁⠄⠠ ⠄⡂
│ ⠄⠌⠌⠡⠉⡐⢯⣵⡏⢵⡞⠂⢰⣽⣷⢛⣯⡣⣷⢭⣞⣏⠤⣾⢡⡻⠢⢊⢠⡠⠸⢄⣃⡀⢁⠐ ⠐⡀ ⠂ ⠄
│ ⠨ ⡈⠂ ⢀⢑⠄⣜⡾⣴⢨⠶⣪⣧⢿⣷⣷⡱⣿⣞⣲⣮⣮⣯⢾⡷⡬⡷⣺⠤⢏⡼⣨⢌⡬⠠⢂⢠⠒⠱⠆⡈
│ ⠈ ⠃ ⠄⡐⠂⠐⢀⢈⣂⡈⣳⣷⣜⢺⣿⣹⣷⣼⣯⡿⣃⣽⣿⢾⣟⣾⢵⣻⠯⡼⡃⣼⣗⢲⠪⠇⣉⠺ ⢱⠠⠙⡀⢐⠌
│ ⠄ ⠈⠊⠐⠑⠨⠚⢁⡊⢾⡶⢩⢿⣏⣽⢞⣼⣇⣵⣿⣿⣽⣿⢽⣭⠺⣿⣽⣳⢚⣾⣻⣾⣜⠩⡒⣃⠈⢢⠕⢂⢰⡀ ⡔⢀⢀ ⡀
│ ⢀⠂⠁⠂⠇ ⠂⠊⢀⠐⡘⡍⡇⣚⢸⢟⣯⢿⣳⡪⣫⣵⣿⣯⣿⢿⣷⣻⣖⣗⣻⣚⢥⡷⣕⣏⠶⠊⠄⣠⠰⠂⡄⠂ ⠄⠁
│ ⠠⢂ ⠘⠐⣀ ⣀⢡⢐⠔⢫⠯⢕⠫⠿⣹⢶⣾⡻⣭⣽⢗⠿⣹⣛⣺⣿⠯⢲⡼⣵⢉⣭⢐⣟⡍⠄⠈⠥⠄ ⠁ ⠄
│ ⠈⠂ ⠊⡀⡈⠢⡌⡠⠖⢤⠥⡑⣯⣾⣴⣯⡿⣯⣝⣯⣿⠧⣽⣒⢾⣼⣻⣛⣗⡹⡽⢪⠯⠒⡨⠈ ⠈⡐⢄ ⠂⠘⠠ ⠂
│ ⠰ ⡀⠃⠁⠠ ⠉⡈⡨⡱⢍⠌⠷⣯⠫⠬⡙⣴⣯⡣⡟⡮⠩⣫⠿⢞⢵⡰⠞⡂⠴ ⠕⢀⡂⠁ ⢀ ⠤ ⠈
│ ⢩⠂ ⠁⡄ ⢀⠲⢂⠑⢁⡘⠄⠵⣣⢑⢻⠨⡩⣌⠕⢮⣮⣋⢹⡁⣊⡃⠈⡕⡘⡠⠨⠄⡘⠨ ⠊⠁ ⠂
│ ⠐ ⢀ ⠈⠐⠔⠈ ⠁⢀⣀⡃⣊⢁⡘⠁⠛⠨ ⠒⡑⡀⠵⢙⠄⠡⠢⠃⠄⠋⠅ ⠥⠁⠠⢀ ⠄
│ ⢀⢁ ⠆ ⠉⠁⠐ ⠄⠁⢑⡀⢀⠠⠑⢡⢊⠂⠑⠌⡅⠊⠄⠉⢈⡐ ⡀ ⠠ ⠂
│ ⢀ ⠑ ⠂ ⡁ ⠌⢠⠈⠂⠄⠉⡃⠈⠄ ⠂⠠⠁ ⠄ ⢀ ⠠
│ ⠐ ⠐ ⢁⠂⠂⠢⠠⠄⠔⠐ ⠁
│ ⠢ ⠁ ⠂⠐ ⠐ ⠐ ⠈
│ ⢀ ⠄⠈ ⠈
│ ⠐
│
│
│ ⠈
-4.271874└─────────────────────────────────────────────────────────────────────
-4.08815 3.79083
$ < examples/mvrnorm.json jp -x ..x -type hist
684 1 [-3.27033,-2.69856)
█████▌ 2 [-2.69856,-2.12679)
█████▌ 624 3 [-2.12679,-1.55502)
███████████ 4 [-1.55502,-0.983254)
557 ███████████ 5 [-0.983254,-0.411485)
▐████████████████ 6 [-0.411485,0.160285)
▐████████████████ 7 [0.160285,0.732054)
▐████████████████ 8 [0.732054,1.30382)
▐████████████████ 9 [1.30382,1.87559)
▐████████████████ 404 10 [1.87559,2.44736)
▐█████████████████████▌ 11 [2.44736,3.01913)
314 ▐█████████████████████▌ 12 [3.01913,3.5909]
▄▄▄▄▄▟█████████████████████▌
███████████████████████████▌
███████████████████████████▌
███████████████████████████▌
███████████████████████████▌ 176
█████████████████████████████████
98 █████████████████████████████████
▐██████████████████████████████████████ 79
1 4 41 ▐███████████████████████████████████████████ 14 4
▁▁▁▁▁▁▁▁▁▁▁█████████████████████████████████████████████████▁▁▁▁▁▁▁▁▁▁▁
0 1 2 3 4 5 6 7 8 9 10 11 12
$ < examples/mvrnorm.json jp -x ..x -type hist -bins 5
1652
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████
█████████████████ 728
██████████████████████████████████
541 ██████████████████████████████████
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄██████████████████████████████████
███████████████████████████████████████████████████
███████████████████████████████████████████████████
███████████████████████████████████████████████████
███████████████████████████████████████████████████
22 ███████████████████████████████████████████████████ 57
▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███████████████████████████████████████████████████▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
[-3.8421,-2.3555)[-2.3555,-0.8689)[-0.8689,0.6177) [0.6177,2.1043) [2.1043,3.5909]
$ < examples/mvrnorm.json jp -xy '..[x,y]' -type hist2d
3.3608│ ···· ········ ····
│ ···· ········ ····
│ ···· ········ ····
│ ················ ····
│ ················ ····
│ ································
│ ································
│ ················░░░░░░░░░░░░················
│ ················░░░░░░░░░░░░················
│ ············▒▒▒▒▓▓▓▓▒▒▒▒▒▒▒▒░░░░············
│ ············▒▒▒▒▓▓▓▓▒▒▒▒▒▒▒▒░░░░············
│···············▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒············
│···············▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒············
│ ········░░░░▓▓▓▓▓▓▓▓████▓▓▓▓▒▒▒▒············
│ ········░░░░▓▓▓▓▓▓▓▓████▓▓▓▓▒▒▒▒············
│ ········░░░░▓▓▓▓▓▓▓▓████▓▓▓▓▒▒▒▒············
│ ············▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒············
│ ············▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒············
│ ············▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒················
│ ············▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒················
│ ····································
│ ····································
│ ····························
│ ····························
│ ···· ···· ····
│ ···· ···· ····
│ ····
│ ····
-4.0045└───────────────────────────────────────────────────
-3.8421 3.5909
If your data consists of whitespace-separated JSON values (known as JSONLines for newline separators), you can use the -s
("slurp") mode of jq
to aggregate your data points into a single array before passing it to jp
:
$ echo "[0,1]" "[1,2]" "[2,3]" | jq -s . | jp
3.16│
│ ▄▄▀
│ ▄▄▀▀
│ ▄▄▀▀
│ ▗▄▄▀▀
│ ▗▄▞▀▘
│ ▗▄▞▀▘
│ ▗▄▞▀▘
│ ▗▄▞▀▘
│ ▗▄▞▀▘
│ ▗▄▞▀▘
│ ▄▄▀▘
│ ▄▄▀▀
│ ▄▄▀▀
│▄▀▀
0.94└──────────────────────────────────────────────────────
0 2
$ < examples/sin.csv jp -input csv -xy '[*][0,1]'
1.059955│ ▗▄▛▀▀▚▄▖ ▄▄▀▀▀▄▄
│ ▗▞▘ ▝▚▖ ▄▀ ▝▀▄
│ ▟▘ ▝▄ ▗▀ ▝▀▖
│ ▗▛ ▚▖ ▞▘ ▝▙
│ ▄▘ ▀▖ ▞ ▚
│▞▘ ▝▌ ▗▛ ▚▖
│ ▝▚ ▐▘ ▝▄
│ ▜▖ ▟▘ ▝▄
│ ▐▄ ▗▞ ▝▚
│ ▚▖ ▄▀
│ ▀▙▖ ▄▛
│ ▀▀▄▄▄▞▀▘
-1.059955└─────────────────────────────────────────────────────────────────────
0 9.95