ggplot

package module
v0.0.0-...-370038a Latest Latest
Warning

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

Go to latest
Published: Apr 24, 2026 License: MIT Imports: 16 Imported by: 0

README

ggplot

Go Reference Go Report Card CI codecov GitHub release (latest by date)

ggplot

Production-grade Grammar of Graphics for Go.

A pure-Go data visualization library implementing a rigorous, declarative Grammar of Graphics pipeline. Inspired by Hadley Wickham's renowned ggplot2, but architected specifically for Go's performance characteristics, static typing, and concurrency model.

Overview

ggplot provides an expressive, composable API for generating complex data visualizations. It decouples the data manipulation (Apache Arrow, BigQuery, Memory) from the statistical transformations and the final vector rendering, resulting in highly scalable plotting pipelines.

Capability Supported Features
Geometries Point, Line, Path, Step, Bar, Histogram, Area, Density, Rug, HLine, VLine, Text, BoxPlot, Smooth
Statistics Identity, Bin/Count, Density (KDE), Smooth (LOESS), Summary, BoxPlot (Tukey 1.5×IQR)
Scales Linear, Log10, Sqrt, Reverse, Discrete
Faceting Grid (row ~ col), Wrap (NCols/NRows)
Data Backends Native Memory, Apache Arrow IPC/Parquet, BigQuery
Theming Default, Classic, Minimal, Dark, BW

Clifford Attractor Butterfly Curve
Clifford attractor — 500 k points, alpha blending, continuous color scale Butterfly curve — parametric path with color interpolation
Scatter Line Area
Bar Histogram Smooth

Why ggplot?

Data science in Go often suffers from fragmented or overly imperative plotting APIs. ggplot solves this by introducing:

  • Declarative Compositions — Build complex charts by layering geometries and statistics instead of drawing pixels.
  • Provider-Agnostic Engines — Swap out the underlying dataset execution engine (memory vs arrow) without changing a single line of your plotting code.
  • Publication-Ready Outputs — Anti-aliased 2D vector rendering powered by gogpu/gg, saving to high-DPI PNGs or in-memory canvases.

Quick Start

Installation
go get github.com/TuSKan/ggplot
1. Scatter Plot
package main

import (
	"log"

	"github.com/TuSKan/ggplot"
	"github.com/TuSKan/ggplot/aes"
	"github.com/TuSKan/ggplot/dataset"
	"github.com/TuSKan/ggplot/dataset/memory"
	"github.com/TuSKan/ggplot/geom"
)

func main() {
	// Initialize a memory engine and construct columns explicitly.
	eng := memory.NewEngine()
	ds, err := dataset.NewDataset(eng,
		eng.NewFloat64Column("x", []float64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}),
		eng.NewFloat64Column("y", []float64{2, 4, 5, 4, 6, 8, 7, 9, 10, 11}),
	)
	if err != nil {
		log.Fatalln(err)
	}

	// Build the plot using declarative Grammar of Graphics.
	ggplot.New(ds, aes.X("x"), aes.Y("y")).
		Layer(geom.Point(geom.WithSize(5), geom.WithColor("coral"))).
		Layer(geom.Smooth()).
		Labs(ggplot.Title("Quick Start"), ggplot.XLab("X"), ggplot.YLab("Y")).
		Theme("minimal").
		Save("scatter.png", 800, 500)
}
2. Faceted Time Series
ggplot.New(ds, aes.X("day"), aes.Y("temp")).
    Layer(geom.Line(geom.WithColor("seagreen"), geom.WithLineWidth(1.5))).
    FacetWrap("season", 2, 0).
    Labs(ggplot.Title("Temperature by Season")).
    Theme("dark").
    Save("facets.png", 900, 600)
3. Box Plot with Groups
ggplot.New(ds, aes.X("group"), aes.Y("value")).
    Layer(geom.BoxPlot(geom.WithFill("lightyellow"), geom.WithAlpha(0.8))).
    Labs(ggplot.Title("Distribution by Group")).
    Theme("classic").
    Save("boxplot.png", 800, 500)

Architecture & Data Backends

ggplot is built around a rigorous, interface-driven dataset.Table engine. This means you are not limited to []float64 slices. You can back your plots with robust columnar frameworks. See DATASET.md for a deep-dive into the backend engine architecture.

  • Memory Engine (dataset/memory): Lightweight, native Go slices. Best for standard web-server rendering.
  • Arrow Engine (dataset/arrow): Apache Arrow backed IPC streams and Parquet datasets. Best for high-performance ML pipelines or datasets >1M rows.
  • BigQuery Engine (dataset/bigquery): Lazy SQL pushdown execution. Best for massive data warehouses where filtering and statistics must be executed on the database before streaming the visual aggregate to Go.

Documentation

Document Description
DATASET.md Deep dive into the Engine abstraction, Memory, and Arrow backends
ARCHITECTURE.md Package map, rendering pipeline, design decisions
ROADMAP.md 19-phase development plan aligned with the ggplot2 book (3e)

Project Roadmap

We actively track our development pipeline across multiple capability tiers focusing on Grammar Primitives, Scaling Functions, and Advanced Geometries.

Please see our full Project Roadmap to understand current milestones and architectural expansion goals.

  • Phases 1–4 — Core architecture, grammar primitives, data backends, production hardening
  • 🔲 Phases 5–8 — Position/colour/other scales, faceting controls
  • 🔲 Phases 9–12 — Annotations, composition (patchwork), maps, networks
  • 🔲 Phases 13–19 — Themes deep-dive, guides, output backends, programming/extensibility

Dependencies

Package Role
gogpu/gg 2D vector rendering with anti-aliased lines, fills, and text
apache/arrow-go Zero-copy columnar data

Contributing

Contributions are welcome!

License

MIT — see LICENSE.

Documentation

Overview

draw.go contains geometry rendering functions for the ggplot rendering pipeline. Each draw function maps data coordinates to pixel positions using a coordinate system and renders shapes via the canvas abstraction.

Package ggplot is a production-grade, pure-Go Grammar of Graphics plotting library.

Inspired by R's ggplot2, it provides a declarative, composable API for building statistical visualizations from data, aesthetics, geometries, scales, coordinate systems, facets, and themes.

Quick Start

p := ggplot.New(ds,
    aes.X("x"),
    aes.Y("y"),
    aes.Color("group"),
).
    Layer(geom.Point(geom.WithSize(4), geom.WithAlpha(0.7))).
    Layer(geom.Smooth(geom.WithMethod("lm"))).
    Labs(ggplot.Title("My Plot"), ggplot.XLab("X Axis")).
    Theme("minimal").
    Save("output.png", 1200, 800)

Architecture

The library follows a strict pipeline:

PlotSpec → Validate → Stat Transform → Scale Training → Layout → Render

All data flows through the dataset.Dataset abstraction backed by Apache Arrow for zero-copy performance, with lazy evaluation for ETL operations.

util.go contains internal utility functions used across the ggplot rendering pipeline.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type LabOpt

type LabOpt func(*grammar.Labels)

LabOpt is a functional option for configuring plot labels.

func Caption

func Caption(text string) LabOpt

Caption sets the plot caption.

func Subtitle

func Subtitle(text string) LabOpt

Subtitle sets the plot subtitle.

func Title

func Title(text string) LabOpt

Title sets the plot title.

func XLab

func XLab(text string) LabOpt

XLab sets the x-axis label.

func YLab

func YLab(text string) LabOpt

YLab sets the y-axis label.

type Plot

type Plot struct {
	// contains filtered or unexported fields
}

Plot is the immutable, declarative plot builder. Every method returns a new Plot with the modification applied, enabling a fluent chaining style.

Plot is safe to share and reuse — modifying a derived plot does not affect the original.

func New

func New(ds dataset.Dataset, globalAes ...aes.Mapping) *Plot

New initializes a plot with a dataset and optional global aesthetic mappings.

func (*Plot) Aes

func (p *Plot) Aes(mappings ...aes.Mapping) *Plot

Aes adds or overrides global aesthetic mappings.

func (*Plot) Coord

func (p *Plot) Coord(c coord.Coord) *Plot

Coord sets the coordinate system.

func (*Plot) CoordFlip

func (p *Plot) CoordFlip() *Plot

CoordFlip swaps the x and y axes.

func (*Plot) FacetGrid

func (p *Plot) FacetGrid(rowCol, colCol string) *Plot

FacetGrid applies grid faceting by row and column variables.

func (*Plot) FacetWrap

func (p *Plot) FacetWrap(col string, opts ...facet.WrapOpt) *Plot

FacetWrap applies wrap faceting by a column.

func (*Plot) Labs

func (p *Plot) Labs(opts ...LabOpt) *Plot

Labs configures plot labels (title, subtitle, axis labels, caption).

func (*Plot) Layer

func (p *Plot) Layer(l geom.Layer, localAes ...aes.Mapping) *Plot

Layer adds a geometry layer to the plot with optional per-layer aesthetic overrides.

func (*Plot) LegendPosition

func (p *Plot) LegendPosition(pos string) *Plot

LegendPosition sets the legend placement. Valid values: "right" (default), "left", "top", "bottom", "none".

func (*Plot) Render

func (p *Plot) Render(width, height int) (*canvas.GGCanvas, error)

Render produces the rendered canvas for further processing. This is the low-level entry point; prefer [Save] or Show for common cases.

func (*Plot) Save

func (p *Plot) Save(filename string, width, height int) error

Save renders the plot to a PNG file at the given dimensions.

func (*Plot) ScaleX

func (p *Plot) ScaleX(scaleType string) *Plot

ScaleX sets the x-axis scale type. Valid values: "log10", "sqrt", "reverse".

func (*Plot) ScaleY

func (p *Plot) ScaleY(scaleType string) *Plot

ScaleY sets the y-axis scale type. Valid values: "log10", "sqrt", "reverse".

func (*Plot) Theme

func (p *Plot) Theme(name string) *Plot

Theme sets the theme by name.

func (*Plot) XLim

func (p *Plot) XLim(min, max float64) *Plot

XLim sets explicit x-axis limits. Pass math.NaN() for either end to auto-detect.

func (*Plot) YLim

func (p *Plot) YLim(min, max float64) *Plot

YLim sets explicit y-axis limits. Pass math.NaN() for either end to auto-detect.

Directories

Path Synopsis
Package aes provides aesthetic mapping constructors for the Grammar of Graphics.
Package aes provides aesthetic mapping constructors for the Grammar of Graphics.
Package coord defines coordinate systems that control how data positions are mapped to the 2D plotting surface.
Package coord defines coordinate systems that control how data positions are mapped to the 2D plotting surface.
Package dataset provides zero-copy, lazy-evaluating columnar data abstractions for the Grammar of Graphics pipeline.
Package dataset provides zero-copy, lazy-evaluating columnar data abstractions for the Grammar of Graphics pipeline.
arrow
Package arrow provides an Apache Arrow-backed compute engine for the dataset package.
Package arrow provides an Apache Arrow-backed compute engine for the dataset package.
bigquery
Package bigquery implements a BigQuery SQL pushdown engine for the dataset library.
Package bigquery implements a BigQuery SQL pushdown engine for the dataset library.
compute
Package compute provides portable SIMD primitives for the dataset engines.
Package compute provides portable SIMD primitives for the dataset engines.
csv
Package csv provides CSV reading and writing for the dataset package.
Package csv provides CSV reading and writing for the dataset package.
math
Package math provides SIMD-accelerated mathematical transforms for the dataset engines.
Package math provides SIMD-accelerated mathematical transforms for the dataset engines.
memory
Package memory provides a lightweight Go-slice-backed compute engine for the dataset package.
Package memory provides a lightweight Go-slice-backed compute engine for the dataset package.
parquet
Package parquet provides Parquet reading and writing for the dataset package.
Package parquet provides Parquet reading and writing for the dataset package.
sort
Package sort provides SIMD-accelerated sorting for the dataset engines.
Package sort provides SIMD-accelerated sorting for the dataset engines.
examples
annotations command
Example: Reference lines and text annotations.
Example: Reference lines and text annotations.
butterfly command
Example: Butterfly curve with continuous color gradient.
Example: Butterfly curve with continuous color gradient.
categorical command
Example: Boxplot and Categorical (Discrete) X Axis
Example: Boxplot and Categorical (Discrete) X Axis
clifford command
Example: Clifford attractor with continuous color gradient.
Example: Clifford attractor with continuous color gradient.
color_mapping command
Example: Multi-Group Scatter with Colour Mapping and Legend
Example: Multi-Group Scatter with Colour Mapping and Legend
geometries/area command
geometries/bar command
geometries/line command
multiline command
Example: Multi-Line Plot
Example: Multi-Line Plot
phase2_features command
Phase 2: Coordinates, Faceting, Themes, Guides, Aesthetics, LegendPosition
Phase 2: Coordinates, Faceting, Themes, Guides, Aesthetics, LegendPosition
phase2_geometries command
Phase 2: Geometries — Point, Line, Step, Bar, Histogram, Area, Density, Rug, HLine, VLine, Text, BoxPlot, Smooth
Phase 2: Geometries — Point, Line, Step, Bar, Histogram, Area, Density, Rug, HLine, VLine, Text, BoxPlot, Smooth
phase2_scales command
Phase 2: Scales — Linear, Log10, Sqrt, Reverse, Discrete
Phase 2: Scales — Linear, Log10, Sqrt, Reverse, Discrete
phase2_statistics command
Phase 2: Statistics — Identity, Bin/Count, Density (KDE), Smooth (LOESS), Summary, BoxPlot
Phase 2: Statistics — Identity, Bin/Count, Density (KDE), Smooth (LOESS), Summary, BoxPlot
showcase command
Example: Feature Showcase
Example: Feature Showcase
themes command
Example: Theme Showcase
Example: Theme Showcase
Package facet splits a dataset into subsets for "small multiple" panel layouts.
Package facet splits a dataset into subsets for "small multiple" panel layouts.
Package geom provides geometry specifications for the Grammar of Graphics.
Package geom provides geometry specifications for the Grammar of Graphics.
Package guide provides axis, legend, and title rendering for plots.
Package guide provides axis, legend, and title rendering for plots.
internal
canvas
Package canvas defines the rendering backend abstraction.
Package canvas defines the rendering backend abstraction.
color
Package color provides color palettes and utilities for data visualization.
Package color provides color palettes and utilities for data visualization.
fonts
Package fonts provides a cross-platform, pure-Go typography subsystem.
Package fonts provides a cross-platform, pure-Go typography subsystem.
Package output provides rendering output abstractions for exporting and displaying plots.
Package output provides rendering output abstractions for exporting and displaying plots.
Package position defines position adjustments that control how overlapping geometries are arranged.
Package position defines position adjustments that control how overlapping geometries are arranged.
Package scale provides scale transformations that map data values to visual aesthetic values.
Package scale provides scale transformations that map data values to visual aesthetic values.
Package stat provides statistical transformations for the Grammar of Graphics.
Package stat provides statistical transformations for the Grammar of Graphics.
Package theme provides visual styling configurations for plots.
Package theme provides visual styling configurations for plots.

Jump to

Keyboard shortcuts

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