Skip to content
/ jp Public

dead simple terminal plots from JSON data. single binary, no dependencies. linux, osx, windows.

License

Notifications You must be signed in to change notification settings

sgreben/jp

Repository files navigation

jp

Dead simple terminal plots from JSON (or CSV) data. Bar charts, line charts, and scatter plots are supported.

Build Status

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.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

Use it

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)

Examples

Bar chart

Separate X and Y values

$ 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         

XY pairs

$ 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                

Y values only (X=index)

$ cat 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)

$ cat examples/tcp-time.json | jp -y ..Duration
 5.726165e+07│
             │
             │
             │
             │ ▗
             │ ▟
             │ █
             │▐▝▖
             │▐ ▌                                   ▌
             │▐ ▌                                   ▌
             │▌ ▌                                  ▐▚
             │▌ ▌                ▗       ▗         ▐▐    ▌
             │▘ ▌              ▖ ▐      ▞▀▖        ▐▐    ▌
             │  ▚   ▐▚  ▗▀▖   ▗▚ ▌▌    ▗▘ ▌ ▖▗▀▌   ▌▐    █
             │  ▐  ▛▌ ▚▖▞ ▚▐▖ ▞▐ ▌▌ ▗  ▐  ▐▟▐▞ ▚ ▗ ▌▝▖  ▐▐                      ▐
             │  ▐ ▐    ▝  ▝▌▝▀ ▝▟ ▚▗▜  ▞     ▘ ▐▖█▗▘ ▌  ▐▐    ▗  ▄▖     ▄▖      ▌▌
             │  ▝▚▐        ▘    ▘ ▐▘▝▖▄▌        ▝▝▟  ▀▀▚▟ ▌ ▖▞▘▌▐ ▚ ▗▄ ▐ ▚▄▖ ▄ ▄▘▌▞▄▄▀▚   ▄ ▄▗▞▖▞▄▄▚
             │   ▝▌                  ▛            ▌     ▝ ▙▞▝  ▝▘ ▝▚▘ ▀▘   ▝▀ ▀  ▐▘    ▚▞▀ ▀ ▘ ▚▘
             │
             │
             │
             │
 4.446018e+07└──────────────────────────────────────────────────────────────────────────────────────
             0                                                                                    99

Scatter plot

$ cat examples/mvrnorm.json | jp -xy '..[x,y]' -type scatter

 3.535344│                                 ⠄             ⠄                     
         │                               ⠈⠂   ⠂       ⡀ ⠂                      
         │                          ⠐⡀⡀⡂   ⠁  ⢄  ⠁ ⠠                           
         │                            ⡀    ⠆     ⠈  ⠄⡀        ⠂                
         │           ⡀       ⠠  ⡀ ⡀ ⠄  ⡀⠐⠄⠁⠐ ⠠⢆⠠⠂⠂⠄⣀⢈  ⡀⠈ ⡀                    
         │                     ⡀⠂⠂⠄ ⡀⠂⢔⠠ ⢤⢀⠌⣡⠁⠦⠄⠐⡐⠂⣀⠅⠁⠈ ⠂ ⠈⠁⠁      ⡀     ⠄     
         │  ⡀         ⢀  ⠄     ⠈⠠ ⠡⠑⠈⠈⢢⡁⡄⢈⠂⢡⠈⡄⡀⠈⠰⢉⡠⠘⢄⢃⠉⢀⣄⠢⠠⠄ ⠠ ⡀⠁ ⡀ ⠂          
         │                   ⠈ ⡂⠈⡁⠈⠄⢂⡹⡐⡡⡆⡥⣙⡶⡼⠱⣅⣅⣼⢗⡱⢐⣈⠑⢁⠂ ⢐⢁⠭⠘⡀  ⠈              
         │                ⠁ ⢀⠄⢈⠈⡰⢀⡥⠋⣧⣓⣚⡛⢲⣽⣝⣭⢙⣟⢲⡽⣋⡠⣿⣜⣵⠙⡦⠗ ⣡⠁⠁⠁⠄⠠ ⠄⡂             
         │                  ⠄⠌⠌⠡⠉⡐⢯⣵⡏⢵⡞⠂⢰⣽⣷⢛⣯⡣⣷⢭⣞⣏⠤⣾⢡⡻⠢⢊⢠⡠⠸⢄⣃⡀⢁⠐ ⠐⡀ ⠂    ⠄     
         │              ⠨ ⡈⠂ ⢀⢑⠄⣜⡾⣴⢨⠶⣪⣧⢿⣷⣷⡱⣿⣞⣲⣮⣮⣯⢾⡷⡬⡷⣺⠤⢏⡼⣨⢌⡬⠠⢂⢠⠒⠱⠆⡈            
         │          ⠈  ⠃ ⠄⡐⠂⠐⢀⢈⣂⡈⣳⣷⣜⢺⣿⣹⣷⣼⣯⡿⣃⣽⣿⢾⣟⣾⢵⣻⠯⡼⡃⣼⣗⢲⠪⠇⣉⠺ ⢱⠠⠙⡀⢐⠌           
         │          ⠄   ⠈⠊⠐⠑⠨⠚⢁⡊⢾⡶⢩⢿⣏⣽⢞⣼⣇⣵⣿⣿⣽⣿⢽⣭⠺⣿⣽⣳⢚⣾⣻⣾⣜⠩⡒⣃⠈⢢⠕⢂⢰⡀  ⡔⢀⢀    ⡀   
         │            ⢀⠂⠁⠂⠇ ⠂⠊⢀⠐⡘⡍⡇⣚⢸⢟⣯⢿⣳⡪⣫⣵⣿⣯⣿⢿⣷⣻⣖⣗⣻⣚⢥⡷⣕⣏⠶⠊⠄⣠⠰⠂⡄⠂ ⠄⠁          
         │             ⠠⢂ ⠘⠐⣀ ⣀⢡⢐⠔⢫⠯⢕⠫⠿⣹⢶⣾⡻⣭⣽⢗⠿⣹⣛⣺⣿⠯⢲⡼⣵⢉⣭⢐⣟⡍⠄⠈⠥⠄   ⠁   ⠄       
         │             ⠈⠂  ⠊⡀⡈⠢⡌⡠⠖⢤⠥⡑⣯⣾⣴⣯⡿⣯⣝⣯⣿⠧⣽⣒⢾⣼⣻⣛⣗⡹⡽⢪⠯⠒⡨⠈ ⠈⡐⢄ ⠂⠘⠠        ⠂ 
         │              ⠰  ⡀⠃⠁⠠ ⠉⡈⡨⡱⢍⠌⠷⣯⠫⠬⡙⣴⣯⡣⡟⡮⠩⣫⠿⢞⢵⡰⠞⡂⠴ ⠕⢀⡂⠁ ⢀ ⠤   ⠈         
         │               ⢩⠂ ⠁⡄ ⢀⠲⢂⠑⢁⡘⠄⠵⣣⢑⢻⠨⡩⣌⠕⢮⣮⣋⢹⡁⣊⡃⠈⡕⡘⡠⠨⠄⡘⠨ ⠊⠁   ⠂           
         │          ⠐     ⢀ ⠈⠐⠔⠈  ⠁⢀⣀⡃⣊⢁⡘⠁⠛⠨ ⠒⡑⡀⠵⢙⠄⠡⠢⠃⠄⠋⠅ ⠥⠁⠠⢀ ⠄               
         │                  ⢀⢁ ⠆   ⠉⠁⠐ ⠄⠁⢑⡀⢀⠠⠑⢡⢊⠂⠑⠌⡅⠊⠄⠉⢈⡐  ⡀ ⠠   ⠂             
         │                      ⢀   ⠑ ⠂  ⡁ ⠌⢠⠈⠂⠄⠉⡃⠈⠄   ⠂⠠⠁ ⠄  ⢀ ⠠              
         │                             ⠐ ⠐ ⢁⠂⠂⠢⠠⠄⠔⠐       ⠁                    
         │                         ⠢  ⠁    ⠂⠐  ⠐       ⠐   ⠈                   
         │                           ⢀  ⠄⠈       ⠈                             
         │                                        ⠐                            
         │                                                                     
         │                                                                     
         │                                      ⠈                              
-4.271874└─────────────────────────────────────────────────────────────────────
          -4.08815                                                       3.79083

Histogram

Auto bin number

$ 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

Fixed bin number

$ 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]

CSV input

$ cat examples/sin.csv | jp -input csv -xy '[*][0,1]'

  1.059955│       ▗▄▛▀▀▚▄▖                                    ▄▄▀▀▀▄▄
          │     ▗▞▘      ▝▚▖                                ▄▀      ▝▀▄
          │    ▟▘          ▝▄                             ▗▀          ▝▀▖
          │  ▗▛              ▚▖                          ▞▘             ▝▙
          │ ▄▘                ▀▖                        ▞                 ▚
          │▞▘                  ▝▌                     ▗▛                   ▚▖
          │                     ▝▚                   ▐▘                     ▝▄
          │                       ▜▖                ▟▘                       ▝▄
          │                        ▐▄             ▗▞                          ▝▚
          │                          ▚▖          ▄▀
          │                           ▀▙▖      ▄▛
          │                             ▀▀▄▄▄▞▀▘
 -1.059955└─────────────────────────────────────────────────────────────────────
          0                                                                 9.95

Screenshots

In case you're on mobile, here's some PNGs of what jp output looks like:

  • Scatter plot
  • Bar chart
  • Line chart