Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Go package to make lightweight ASCII line graph ╭┈╯ in command line apps with no other dependencies.

License

Notifications You must be signed in to change notification settings

guptarohit/asciigraph

Repository files navigation

asciigraph

Build status Go Report Card Coverage Status GoDoc License Mentioned in Awesome Go

Go package to make lightweight ASCII line graphs ╭┈╯.

image

Installation

go get -u github.com/guptarohit/asciigraph@latest

Usage

Basic graph

package main
import (
 "fmt"
 "github.com/guptarohit/asciigraph"
)
func main() {
 data := []float64{3, 4, 9, 6, 2, 4, 5, 8, 5, 10, 2, 7, 2, 5, 6}
 graph := asciigraph.Plot(data)
 fmt.Println(graph)
}

Running this example would render the following graph:

 10.00 ┤ ╭╮
 9.00 ┤ ╭╮ ││
 8.00 ┤ ││ ╭╮││
 7.00 ┤ ││ ││││╭╮
 6.00 ┤ │╰╮ ││││││ ╭
 5.00 ┤ │ │ ╭╯╰╯│││╭╯
 4.00 ┤╭╯ │╭╯ ││││
 3.00 ┼╯ ││ ││││
 2.00 ┤ ╰╯ ╰╯╰╯

Multiple Series

package main
import (
 "fmt"
 "github.com/guptarohit/asciigraph"
)
func main() {
	data := [][]float64{{0, 1, 2, 3, 3, 3, 2, 0}, {5, 4, 2, 1, 4, 6, 6}}
	graph := asciigraph.PlotMany(data)
	fmt.Println(graph)
}

Running this example would render the following graph:

 6.00 ┤ ╭─
 5.00 ┼╮ │
 4.00 ┤╰╮ ╭╯
 3.00 ┤ │╭│─╮
 2.00 ┤ ╰╮│ ╰╮
 1.00 ┤╭╯╰╯ │
 0.00 ┼╯ ╰

Colored graphs

package main
import (
 "fmt"
 "github.com/guptarohit/asciigraph"
)
func main() {
	data := make([][]float64, 4)
	for i := 0; i < 4; i++ {
		for x := -20; x <= 20; x++ {
			v := math.NaN()
			if r := 20 - i; x >= -r && x <= r {
				v = math.Sqrt(math.Pow(float64(r), 2)-math.Pow(float64(x), 2)) / 2
			}
			data[i] = append(data[i], v)
		}
	}
	graph := asciigraph.PlotMany(data, asciigraph.Precision(0), asciigraph.SeriesColors(
		asciigraph.Red,
		asciigraph.Yellow,
		asciigraph.Green,
		asciigraph.Blue,
	))
	fmt.Println(graph)
}

Running this example would render the following graph:

colored_graph_image

Legends for colored graphs

The graph can include legends for each series, making it easier to interpret.

package main
import (
	"fmt"
	"github.com/guptarohit/asciigraph"
	"math"
)
func main() {
	data := make([][]float64, 3)
	for i := 0; i < 3; i++ {
		for x := -12; x <= 12; x++ {
			v := math.NaN()
			if r := 12 - i; x >= -r && x <= r {
				v = math.Sqrt(math.Pow(float64(r), 2)-math.Pow(float64(x), 2)) / 2
			}
			data[i] = append(data[i], v)
		}
	}
	graph := asciigraph.PlotMany(data,
		asciigraph.Precision(0),
		asciigraph.SeriesColors(asciigraph.Red, asciigraph.Green, asciigraph.Blue),
		asciigraph.SeriesLegends("Red", "Green", "Blue"),
		asciigraph.Caption("Series with legends"))
	fmt.Println(graph)
}

Running this example would render the following graph:

graph_with_legends_image

CLI Installation

This package also brings a small utility for command line usage.

Assuming $GOPATH/bin is in your $PATH, install CLI with following command:

go install github.com/guptarohit/asciigraph/cmd/asciigraph@latest

or pull Docker image:

docker pull ghcr.io/guptarohit/asciigraph:latest

or download binaries from the releases page.

CLI Usage

> asciigraph --help
Usage of asciigraph:
 asciigraph [options]
Options:
 -ac axis color
 	y-axis color of the plot
 -b buffer
 	data points buffer when realtime graph enabled, default equal to `width`
 -c caption
 	caption for the graph
 -cc caption color
 	caption color of the plot
 -d delimiter
 	data delimiter for splitting data points in the input stream (default ",")
 -f fps
 	set fps to control how frequently graph to be rendered when realtime graph enabled (default 24)
 -h height
 	height in text rows, 0 for auto-scaling
 -lb lower bound
 	lower bound set the minimum value for the vertical axis (ignored if series contains lower values) (default +Inf)
 -lc label color
 	y-axis label color of the plot
 -o offset
 	offset in columns, for the label (default 3)
 -p precision
 	precision of data point labels along the y-axis (default 2)
 -r realtime
 	enables realtime graph for data stream
 -sc series colors
 	comma-separated series colors corresponding to each series
 -sl series legends
 	comma-separated series legends corresponding to each series
 -sn number of series
 	number of series (columns) in the input data (default 1)
 -ub upper bound
 	upper bound set the maximum value for the vertical axis (ignored if series contains larger values) (default -Inf)
 -w width
 	width in columns, 0 for auto-scaling
asciigraph expects data points from stdin. Invalid values are logged to stderr.

Feed it data points via stdin:

seq 1 72 | asciigraph -h 10 -c "plot data from stdin"

or use Docker image:

seq 1 72 | docker run -i --rm ghcr.io/guptarohit/asciigraph -h 10 -c "plot data from stdin"

Output:

 72.00 ┤ ╭────
 64.90 ┤ ╭──────╯
 57.80 ┤ ╭──────╯
 50.70 ┤ ╭──────╯
 43.60 ┤ ╭──────╯
 36.50 ┤ ╭───────╯
 29.40 ┤ ╭──────╯
 22.30 ┤ ╭──────╯
 15.20 ┤ ╭──────╯
 8.10 ┤ ╭──────╯
 1.00 ┼──╯
 plot data from stdin

Example of real-time graph for data points stream via stdin:

Realtime graph for data points via stdin (google ping) using asciigraph

command for above graph
ping -i.2 google.com | grep -oP '(?<=time=).*(?=ms)' --line-buffered | asciigraph -r -h 10 -w 40 -c "realtime plot data (google ping in ms) from stdin"

Example of multi-series real-time graph for data points stream via stdin:

Ping latency comparison: Google (Blue) vs. DuckDuckGo (Red) with asciigraph

command for above graph
{unbuffer paste -d, <(ping -i 0.4 google.com | sed -u -n -E 's/.*time=(.*)ms.*/1円/p') <(ping -i 0.4 duckduckgo.com | sed -u -n -E 's/.*time=(.*)ms.*/1円/p') } | asciigraph -r -h 15 -w 60 -sn 2 -sc "blue,red" -c "Ping Latency Comparison" -sl "Google, DuckDuckGo"

Acknowledgement

This package started as golang port of asciichart.

Contributing

Feel free to make a pull request! :octocat:

Sponsor this project

Packages

AltStyle によって変換されたページ (->オリジナル) /