Ntcharts
Nimble Terminal Charts for the Golang BubbleTea framework and your TUIs
Install / Use
/learn @NimbleMarkets/NtchartsREADME
ntcharts - Nimble Terminal Charts
<p> <a href="https://github.com/NimbleMarkets/ntcharts/actions/workflows/go.yml"><img src="https://github.com/NimbleMarkets/ntcharts/actions/workflows/go.yml/badge.svg" alt="Build Status"></a> <a href="https://github.com/NimbleMarkets/ntcharts/tags"><img src="https://img.shields.io/github/tag/NimbleMarkets/ntcharts.svg" alt="Latest Release"></a> <a href="https://pkg.go.dev/github.com/NimbleMarkets/ntcharts?tab=doc"><img src="https://godoc.org/github.com/golang/gddo?status.svg" alt="GoDoc"></a> <a href="https://github.com/NimbleMarkets/ntcharts/blob/main/CODE_OF_CONDUCT.md"><img src="https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg" alt="Code Of Conduct"></a> </p>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. | | Heat Map | Displays (x,y) values on a color-mapped heatmap. | | Line Chart | Displays (X,Y) data points onto a 2D grid in various types of charts. | | OHLC/Candle Chart | Displays Open, High, Low, Close values as candlesticks. | | 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.
<a href="./examples/quickstart/README.md" alt="quickstart readme"><img src="examples/quickstart/demo.gif" alt="quickstart gif" width='300'/></a>
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:
<img src="examples/usage/canvas.png" alt="canvas png" width='50'/>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:
<img src="examples/usage/barchart.png" alt="barchart png" width='80'/>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:
<img src="examples/usage/sparkline.png" alt="sparkline png" width='100'/>Heat Map
Heat Maps map values to colors on a 2D grid. The following example creates a heatmap of the function sin(sqrt(x^2 + y^2)). There are more examples in the examples README.
package main
import (
"fmt"
"math"
"github.com/NimbleMarkets/ntcharts/heatmap"
)
func main() {
hm := heatmap.New(20, 20, heatmap.WithValueRange(0, 1))
hm.SetXYRange(-1, 1, -1, 1)
for x := float64(-1); x < 1.0; x += 1.0 / float64(hm.GraphWidth()) {
for y := float64(-1); y < 1.0; y += 1.0 / float64(hm.GraphHeight()) {
val := math.Sin(math.Sqrt(x*x + y*y))
hm.Push(heatmap.NewHeatPoint(x, y, val))
}
}
hm.Draw()
fmt.Println(hm.View())
}
This example (source) produces the following heatmap:
<img src="examples/usage/heatmap.png" alt="simple heatmap png" width='100'/>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 :mouse:.
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 :heart: and :fire: by the team behind Nimble.Markets.
Related Skills
node-connect
341.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
xurl
341.0kA CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.
frontend-design
84.4kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
341.0kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
