ntcharts

module
v0.1.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 28, 2024 License: MIT

README

ntcharts - Nimble Terminal Charts

Latest Release GoDoc Code Of Conduct

ntcharts is a Golang Terminal Charting library for the Bubble Tea Framework and other TUIs.

We supply many chart types within the glory of your terminal!

Type Description
Canvas A 2D grid to plot arbitrary runes, with LipGloss for styling and BubbleZone for mousing. It is the foundation for all the following charts.
Bar Chart Displays values as either horizontal rows or vertical columns.
Line Chart Displays (X,Y) data points onto a 2D grid in various types of charts.
Scatter Chart Plots abitrary runes onto (X,Y) coordinates.
Streamline Chart Displays a continuous a line moving across the Canvas from the right side to the left side.
Time Series Chart Displays lines with values on the Y axis and time values on the X axis.
Waveline Chart A line chart that connects points in a wave pattern.
Sparkline A small, simple visual of data chart for quick understanding.

Quickstart Tutorial

This tutorial creates a simple Time Series Chart with two data sets utilizing the Bubble Tea framework, Lip Gloss for styling and BubbleZone for mouse support.

quickstart gif

Usage

See the examples folder for code samples and visuals of each type.

Canvas
package main

import (
    "fmt"
    "github.com/NimbleMarkets/ntcharts/canvas"
    "github.com/charmbracelet/lipgloss"
)

func main() {
    c := canvas.New(5, 2)
    c.SetLinesWithStyle(
        []string{"hello", "world"},
        lipgloss.NewStyle().Foreground(lipgloss.Color("6"))) // cyan

    fmt.Println(c.View())
}

This example produces the following canvas with Lip Gloss foreground color:

canvas png
Bar Chart
package main

import (
    "fmt"
    "github.com/NimbleMarkets/ntcharts/barchart"
    "github.com/charmbracelet/lipgloss"
)

func main() {
    d1 := barchart.BarData{
        Label: "A",
        Values: []barchart.BarValue{
            {"Item1", 21.2, lipgloss.NewStyle().Foreground(lipgloss.Color("10"))}}, // green
    }
    d2 := barchart.BarData{
        Label: "B",
        Values: []barchart.BarValue{
            {"Item1", 15.2, lipgloss.NewStyle().Foreground(lipgloss.Color("9"))}}, // red
    }

    bc := barchart.New(11, 10)
    bc.PushAll([]barchart.BarData{d1, d2})
    bc.Draw()

    fmt.Println(bc.View())
}

This example produces the following bar chart with green and red bars:

barchart png
Streamline Chart
package main

import (
    "fmt"
    "github.com/NimbleMarkets/ntcharts/linechart/streamlinechart"
)

func main() {
    slc := streamlinechart.New(13, 10)
    for _, v := range []float64{4, 6, 8, 10, 8, 6, 4, 2, 0, 2, 4} {
        slc.Push(v)
    }
    slc.Draw()

    fmt.Println(slc.View())
}

This example produces the following streamline chart:

  │  ╭╮      
 8│  ││      
  │ ╭╯╰╮     
 6│ │  │     
  │╭╯  ╰╮    
 4├╯    ╰╮  ╭
  │      │  │
 2│      ╰╮╭╯
  │       ││ 
 0│       ╰╯ 
Time Series Chart
package main

import (
    "fmt"
    "time"
    "github.com/NimbleMarkets/ntcharts/linechart/timeserieslinechart"
)

func main() {
    tslc := timeserieslinechart.New(41, 10)
    for i, v := range []float64{0, 4, 8, 10, 8, 4, 0, -4, -8, -10, -8, -4, 0} {
        date := time.Now().Add(time.Hour * time.Duration(24*i))
        tslc.Push(timeserieslinechart.TimePoint{date, v})
    }
    tslc.DrawBraille()

    fmt.Println(tslc.View())
}

This example produces the following time series chart using braille runes starting with today's date:

 10│      ⣀⠤⠒⠉⠒⠤⡀                        
   │    ⡠⠊      ⠈⠢⡀                      
  5│  ⡠⠊          ⠈⠢⡀                    
   │⡠⠊              ⠈⠑⢄                 ⢀
  0│                   ⠑⡄              ⡔⠁
   │                    ⠈⠢⡀          ⡠⠊  
 -5│                      ⠈⠢⡀      ⡠⠊    
   │                        ⠈⠑⠢⢄⡠⠔⠊      
-10└─────────────────────────────────────
   '24 03/27   03/31   04/03   04/05     
Waveline Chart
package main

import (
    "fmt"
    "github.com/NimbleMarkets/ntcharts/canvas"
    "github.com/NimbleMarkets/ntcharts/linechart/wavelinechart"
)

func main() {
    wlc := wavelinechart.New(12, 10, wavelinechart.WithYRange(-3, 3))
    wlc.Plot(canvas.Float64Point{1.0, 2.0})
    wlc.Plot(canvas.Float64Point{3.0, -2.0})
    wlc.Plot(canvas.Float64Point{5.0, 2.0})
    wlc.Plot(canvas.Float64Point{7.0, -2.0})
    wlc.Plot(canvas.Float64Point{9.0, 2.0})
    wlc.Draw()

    fmt.Println(wlc.View())
}

This example produces the following waveline chart:

 3│         
  │╭╮  ╭╮  ╭
 2│││  ││  │
  │││  ││  │
 0├╯╰╮╭╯╰╮╭╯
  │  ││  ││ 
-2│  ││  ││ 
  │  ╰╯  ╰╯ 
-3└─────────
  0 2 4 6    
Sparkline
package main

import (
    "fmt"
    "github.com/NimbleMarkets/ntcharts/sparkline"
)

func main() {
    sl := sparkline.New(10, 5)
    sl.PushAll([]float64{7.81, 3.82, 8.39, 2.06, 4.19, 4.34, 6.83, 2.51, 9.21, 1.3})
    sl.Draw()

    fmt.Println(sl.View())
}

This example produces the following sparkline:

sparkline png

Open Collaboration

We welcome contributions and feedback. Please adhere to our Code of Conduct when engaging our community.

Acknowledgements

Thanks to Charm.sh for making the command line glamorous and sharing Bubble Tea and Lip Gloss and more. Thanks to BubbleZone for bringing the mouse support 🐭.

Thanks also to asciigraph, ratatui, and termdash for inspiration.

License

Released under the MIT License, see LICENSE.txt.

Copyright (c) 2024 Neomantra Corp.


Made with ❤ and 🔥 by the team behind Nimble.Markets.

Directories

Path Synopsis
Package barchart implements a canvas that displays a bar chart with bars going either horizontally or vertically.
Package barchart implements a canvas that displays a bar chart with bars going either horizontally or vertically.
Package canvas implements an abstract 2D area used to plot arbitary runes that can be displayed using the bubbletea framework.
Package canvas implements an abstract 2D area used to plot arbitary runes that can be displayed using the bubbletea framework.
buffer
Package buffer contain buffers used with charts.
Package buffer contain buffers used with charts.
graph
Package graph contains data structures and functions to help draw runes on to a canvas.
Package graph contains data structures and functions to help draw runes on to a canvas.
runes
Package runes contains commonly used runes and functions to obtain runes.
Package runes contains commonly used runes and functions to obtain runes.
cmd
ntcharts-ohlc
Displays OHLC data as a line chart from an input CSV file.
Displays OHLC data as a line chart from an input CSV file.
Package examples includes various examples of using the ntcharts package.
Package examples includes various examples of using the ntcharts package.
quickstart
Quickstart is a tutorial creating a simple timeserieslinechart that uses keyboard and mouse for zooming in and out, and moving the chart right and left.
Quickstart is a tutorial creating a simple timeserieslinechart that uses keyboard and mouse for zooming in and out, and moving the chart right and left.
Package linechart implements a canvas that displays (X,Y) Cartesian coordinates as a line chart.
Package linechart implements a canvas that displays (X,Y) Cartesian coordinates as a line chart.
streamlinechart
Package streamlinechart implements a linechart that draws lines going from the right of the chart to the left of the chart
Package streamlinechart implements a linechart that draws lines going from the right of the chart to the left of the chart
timeserieslinechart
Package timeserieslinechart implements a linechart that draws lines for time series data points
Package timeserieslinechart implements a linechart that draws lines for time series data points
wavelinechart
Package wavelinechart implements a linechart that draws wave lines on the graph
Package wavelinechart implements a linechart that draws wave lines on the graph
Package sparkline implements a canvas that displays time series data as a chart with columns moving from right to left.
Package sparkline implements a canvas that displays time series data as a chart with columns moving from right to left.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL