jp
jp copied to clipboard
dead simple terminal plots from JSON data. single binary, no dependencies. linux, osx, windows.
jp
Dead simple terminal plots from JSON (or CSV) data. Bar charts, line charts, scatter plots, histograms and heatmaps are supported.

- Get it
- Use it
- Examples
- Bar chart
- Separate X and Y values
- XY pairs
- Y values only (X=index)
- Array data
- Line chart
- Array data, separate X and Y values
- Array data, XY pairs
- Y values only (X=index)
- Scatter plot
- Histogram
- Auto bin number
- Fixed bin number
- 2D Histogram (heatmap)
- JSONLines input
- CSV input
- Bar chart
- Screenshots
- Licensing
Get it
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
Use it
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
Bar chart
Separate X and Y values
$ < 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
XY pairs
$ < 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
Y values only (X=index)
$ < examples/tcp-time.json jp -y ..Count -type bar
69
█████████████
█████████████
█████████████
█████████████
█████████████
█████████████ 21
█████████████ █████████████ 7 2 1
█████████████ █████████████ ▄▄▄▄▄▄▄▄▄▄▄▄▄ ▁▁▁▁▁▁▁▁▁▁▁▁▁ ▁▁▁▁▁▁▁▁▁▁▁▁▁
0 1 2 3 4
Array data
$ 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
Line chart
Array data, separate X and Y values
$ jq -n '[range(200)/20 | [., sin]]' | jp -x '[*][0]' -y '[*][1]'
1.059955│ ▄▄▄▖ ▗▄▄▄▖
│ ▄▀▘ ▝▜▖ ▗▞▘ ▝▚
│ ▟ ▝▄ ▗▀ ▜
│ ▟ ▝▄ ▗▀ ▜
│ ▐ ▝▖ ▗▞ ▚▖
│ ▗▘ ▝▖ ▞ ▚
│ ▗▘ ▚ ▞ ▌
│ ▌ ▌ ▗▘ ▝▖
│ ▞ ▝▖ ▌ ▚
│▗▘ ▚ ▞ ▌
│▌ ▌ ▗▘ ▝▖
│ ▝▖ ▗▘ ▐
│ ▐ ▞ ▚
│ ▚ ▐ ▝▖
│ ▝▖ ▗▘ ▐
│ ▐ ▞ ▚
│ ▀▖ ▐
│ ▚ ▄▘
│ ▙ ▗▘
│ ▚ ▄▘
│ ▚▄ ▗▞▘
│ ▝▀▀▀▘
-1.059955└─────────────────────────────────────────────────────────────────────
0 9.95
Array data, XY pairs
$ jq -n '[range(200)/20 | [., sin]]' | jp -xy '[*][0, 1]'
1.059955│ ▄▄▄▖ ▗▄▄▄▖
│ ▄▀▘ ▝▜▖ ▗▞▘ ▝▚
│ ▟ ▝▄ ▗▀ ▜
│ ▟ ▝▄ ▗▀ ▜
│ ▐ ▝▖ ▗▞ ▚▖
│ ▗▘ ▝▖ ▞ ▚
│ ▗▘ ▚ ▞ ▌
│ ▌ ▌ ▗▘ ▝▖
│ ▞ ▝▖ ▌ ▚
│▗▘ ▚ ▞ ▌
│▌ ▌ ▗▘ ▝▖
│ ▝▖ ▗▘ ▐
│ ▐ ▞ ▚
│ ▚ ▐ ▝▖
│ ▝▖ ▗▘ ▐
│ ▐ ▞ ▚
│ ▀▖ ▐
│ ▚ ▄▘
│ ▙ ▗▘
│ ▚ ▄▘
│ ▚▄ ▗▞▘
│ ▝▀▀▀▘
-1.059955└─────────────────────────────────────────────────────────────────────
0 9.95
Y values only (X=index)
$ < examples/tcp-time.json jp -y ..Duration
5.726165e+07│
│
│
│
│ ▗
│ ▟
│ █
│▐▝▖
│▐ ▌ ▌
│▐ ▌ ▌
│▌ ▌ ▐▚
│▌ ▌ ▗ ▗ ▐▐ ▌
│▘ ▌ ▖ ▐ ▞▀▖ ▐▐ ▌
│ ▚ ▐▚ ▗▀▖ ▗▚ ▌▌ ▗▘ ▌ ▖▗▀▌ ▌▐ █
│ ▐ ▛▌ ▚▖▞ ▚▐▖ ▞▐ ▌▌ ▗ ▐ ▐▟▐▞ ▚ ▗ ▌▝▖ ▐▐ ▐
│ ▐ ▐ ▝ ▝▌▝▀ ▝▟ ▚▗▜ ▞ ▘ ▐▖█▗▘ ▌ ▐▐ ▗ ▄▖ ▄▖ ▌▌
│ ▝▚▐ ▘ ▘ ▐▘▝▖▄▌ ▝▝▟ ▀▀▚▟ ▌ ▖▞▘▌▐ ▚ ▗▄ ▐ ▚▄▖ ▄ ▄▘▌▞▄▄▀▚ ▄ ▄▗▞▖▞▄▄▚
│ ▝▌ ▛ ▌ ▝ ▙▞▝ ▝▘ ▝▚▘ ▀▘ ▝▀ ▀ ▐▘ ▚▞▀ ▀ ▘ ▚▘
│
│
│
│
4.446018e+07└──────────────────────────────────────────────────────────────────────────────────────
0 99
Scatter plot
$ < examples/mvrnorm.json jp -xy '..[x,y]' -type scatter
3.535344│ ⠄ ⠄
│ ⠈⠂ ⠂ ⡀ ⠂
│ ⠐⡀⡀⡂ ⠁ ⢄ ⠁ ⠠
│ ⡀ ⠆ ⠈ ⠄⡀ ⠂
│ ⡀ ⠠ ⡀ ⡀ ⠄ ⡀⠐⠄⠁⠐ ⠠⢆⠠⠂⠂⠄⣀⢈ ⡀⠈ ⡀
│ ⡀⠂⠂⠄ ⡀⠂⢔⠠ ⢤⢀⠌⣡⠁⠦⠄⠐⡐⠂⣀⠅⠁⠈ ⠂ ⠈⠁⠁ ⡀ ⠄
│ ⡀ ⢀ ⠄ ⠈⠠ ⠡⠑⠈⠈⢢⡁⡄⢈⠂⢡⠈⡄⡀⠈⠰⢉⡠⠘⢄⢃⠉⢀⣄⠢⠠⠄ ⠠ ⡀⠁ ⡀ ⠂
│ ⠈ ⡂⠈⡁⠈⠄⢂⡹⡐⡡⡆⡥⣙⡶⡼⠱⣅⣅⣼⢗⡱⢐⣈⠑⢁⠂ ⢐⢁⠭⠘⡀ ⠈
│ ⠁ ⢀⠄⢈⠈⡰⢀⡥⠋⣧⣓⣚⡛⢲⣽⣝⣭⢙⣟⢲⡽⣋⡠⣿⣜⣵⠙⡦⠗ ⣡⠁⠁⠁⠄⠠ ⠄⡂
│ ⠄⠌⠌⠡⠉⡐⢯⣵⡏⢵⡞⠂⢰⣽⣷⢛⣯⡣⣷⢭⣞⣏⠤⣾⢡⡻⠢⢊⢠⡠⠸⢄⣃⡀⢁⠐ ⠐⡀ ⠂ ⠄
│ ⠨ ⡈⠂ ⢀⢑⠄⣜⡾⣴⢨⠶⣪⣧⢿⣷⣷⡱⣿⣞⣲⣮⣮⣯⢾⡷⡬⡷⣺⠤⢏⡼⣨⢌⡬⠠⢂⢠⠒⠱⠆⡈
│ ⠈ ⠃ ⠄⡐⠂⠐⢀⢈⣂⡈⣳⣷⣜⢺⣿⣹⣷⣼⣯⡿⣃⣽⣿⢾⣟⣾⢵⣻⠯⡼⡃⣼⣗⢲⠪⠇⣉⠺ ⢱⠠⠙⡀⢐⠌
│ ⠄ ⠈⠊⠐⠑⠨⠚⢁⡊⢾⡶⢩⢿⣏⣽⢞⣼⣇⣵⣿⣿⣽⣿⢽⣭⠺⣿⣽⣳⢚⣾⣻⣾⣜⠩⡒⣃⠈⢢⠕⢂⢰⡀ ⡔⢀⢀ ⡀
│ ⢀⠂⠁⠂⠇ ⠂⠊⢀⠐⡘⡍⡇⣚⢸⢟⣯⢿⣳⡪⣫⣵⣿⣯⣿⢿⣷⣻⣖⣗⣻⣚⢥⡷⣕⣏⠶⠊⠄⣠⠰⠂⡄⠂ ⠄⠁
│ ⠠⢂ ⠘⠐⣀ ⣀⢡⢐⠔⢫⠯⢕⠫⠿⣹⢶⣾⡻⣭⣽⢗⠿⣹⣛⣺⣿⠯⢲⡼⣵⢉⣭⢐⣟⡍⠄⠈⠥⠄ ⠁ ⠄
│ ⠈⠂ ⠊⡀⡈⠢⡌⡠⠖⢤⠥⡑⣯⣾⣴⣯⡿⣯⣝⣯⣿⠧⣽⣒⢾⣼⣻⣛⣗⡹⡽⢪⠯⠒⡨⠈ ⠈⡐⢄ ⠂⠘⠠ ⠂
│ ⠰ ⡀⠃⠁⠠ ⠉⡈⡨⡱⢍⠌⠷⣯⠫⠬⡙⣴⣯⡣⡟⡮⠩⣫⠿⢞⢵⡰⠞⡂⠴ ⠕⢀⡂⠁ ⢀ ⠤ ⠈
│ ⢩⠂ ⠁⡄ ⢀⠲⢂⠑⢁⡘⠄⠵⣣⢑⢻⠨⡩⣌⠕⢮⣮⣋⢹⡁⣊⡃⠈⡕⡘⡠⠨⠄⡘⠨ ⠊⠁ ⠂
│ ⠐ ⢀ ⠈⠐⠔⠈ ⠁⢀⣀⡃⣊⢁⡘⠁⠛⠨ ⠒⡑⡀⠵⢙⠄⠡⠢⠃⠄⠋⠅ ⠥⠁⠠⢀ ⠄
│ ⢀⢁ ⠆ ⠉⠁⠐ ⠄⠁⢑⡀⢀⠠⠑⢡⢊⠂⠑⠌⡅⠊⠄⠉⢈⡐ ⡀ ⠠ ⠂
│ ⢀ ⠑ ⠂ ⡁ ⠌⢠⠈⠂⠄⠉⡃⠈⠄ ⠂⠠⠁ ⠄ ⢀ ⠠
│ ⠐ ⠐ ⢁⠂⠂⠢⠠⠄⠔⠐ ⠁
│ ⠢ ⠁ ⠂⠐ ⠐ ⠐ ⠈
│ ⢀ ⠄⠈ ⠈
│ ⠐
│
│
│ ⠈
-4.271874└─────────────────────────────────────────────────────────────────────
-4.08815 3.79083
Histogram
Auto bin number
$ < 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
Fixed bin number
$ < 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]
2D Histogram (heatmap)
$ < examples/mvrnorm.json jp -xy '..[x,y]' -type hist2d
3.3608│ ···· ········ ····
│ ···· ········ ····
│ ···· ········ ····
│ ················ ····
│ ················ ····
│ ································
│ ································
│ ················░░░░░░░░░░░░················
│ ················░░░░░░░░░░░░················
│ ············▒▒▒▒▓▓▓▓▒▒▒▒▒▒▒▒░░░░············
│ ············▒▒▒▒▓▓▓▓▒▒▒▒▒▒▒▒░░░░············
│···············▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒············
│···············▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒············
│ ········░░░░▓▓▓▓▓▓▓▓████▓▓▓▓▒▒▒▒············
│ ········░░░░▓▓▓▓▓▓▓▓████▓▓▓▓▒▒▒▒············
│ ········░░░░▓▓▓▓▓▓▓▓████▓▓▓▓▒▒▒▒············
│ ············▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒············
│ ············▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒············
│ ············▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒················
│ ············▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒················
│ ····································
│ ····································
│ ····························
│ ····························
│ ···· ···· ····
│ ···· ···· ····
│ ····
│ ····
-4.0045└───────────────────────────────────────────────────
-3.8421 3.5909
JSONLines input
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
CSV input
$ < examples/sin.csv jp -input csv -xy '[*][0,1]'
1.059955│ ▗▄▛▀▀▚▄▖ ▄▄▀▀▀▄▄
│ ▗▞▘ ▝▚▖ ▄▀ ▝▀▄
│ ▟▘ ▝▄ ▗▀ ▝▀▖
│ ▗▛ ▚▖ ▞▘ ▝▙
│ ▄▘ ▀▖ ▞ ▚
│▞▘ ▝▌ ▗▛ ▚▖
│ ▝▚ ▐▘ ▝▄
│ ▜▖ ▟▘ ▝▄
│ ▐▄ ▗▞ ▝▚
│ ▚▖ ▄▀
│ ▀▙▖ ▄▛
│ ▀▀▄▄▄▞▀▘
-1.059955└─────────────────────────────────────────────────────────────────────
0 9.95
Screenshots





Licensing
- Any original code is licensed under the MIT License.
- Included portions of github.com/buger/goterm are licensed under the MIT License.
- Included portions of github.com/kubernetes/client-go are licensed under the Apache License 2.0.