vellumverse hex logo vellumverse hex logo vellum gallery
  • Home
  • Gallery
  • About
  • Ecosystem
    • vellum (the backend)
    • vellumplot (the grammar)
    • vellumwidget (interactive)
    • vellumverse (the meta-package)
Categories
All (73)
Accessibility (3)
Animation (3)
Backend (9)
Basics (7)
Big data (7)
Composition (4)
Effects (4)
Flows (2)
Heatmaps (5)
Hierarchies (2)
Images (2)
Interactive (6)
Legends (2)
Networks (3)
Polar (2)
Spatial (10)
Statistical (11)
Text (8)

Gallery

Plots and interactive widgets built with the vellum ecosystem. Every example is real, runnable code.

Each card is a self-contained example. Click through for the code and the rendered result. Everything is drawn by vellumplot on the vellum engine, which solves the whole figure before it draws any of it.

Alt text that ships with the plot
Accessibility

Every vellumplot writes a text alternative into the file it renders: role=“img” and a in SVG, a tagged Figure in PDF. plot_alt() shows you what a screen reader will…

A chart an agent writes as data, not as code
Backend

spec_fields() grounds a model in the real columns, vplot_from_spec() validates what it produces and reports the mistake as a record, mcp_serve() exposes both to an MCP…

An animation with no pixels in it
Animation

anim_save(“.svg”) writes a keyframe animation as a single animated SVG: every frame emitted as vector markup, stepped by CSS, crisp at any size, and held still for a reader…

Long labels that fit
Text

Rotated and wrapping axis tick labels, titles that wrap instead of overflowing, a relative cex that cascades through the theme, and tabular figures so tick digits stop…

A bar chart race, with no new API
Animation

transition_states() over a rank column turns mark_bar() into a bar chart race: bars keyed by category slide past each other as their ranks change, on frozen scales.

Bar chart with a count stat
Basics

A bar mark that counts rows per category: the count stat, used when no y is supplied.

Every building in Berlin
Spatial

536,700 building footprints from OpenStreetMap, assembled into polygons and drawn with mark_sf(). The streets are the gaps.

A big scatter that stays interactive
Interactive
Big data

120,000 points you can still hover, brush, and zoom. Past 20,000 keyed marks, as_widget() draws the scene once as an image and runs every interaction off a compact index.

Boxplots and violins
Statistical

Two views of the same grouped distribution: a boxplot and a violin, side by side.

The cartographer’s bubble legend
Legends
Spatial

guide_legend(nested = TRUE) draws a size legend as concentric bottom-aligned circles with a leader from each to its label, the proportional-symbol convention, instead of a…

Chord diagram
Flows

Directed flows between a handful of nodes, wrapped onto a circle with an out/in split and self-loops.

Interactive choropleth
Interactive
Spatial

The North Carolina choropleth as a client-side widget: hover a county for a styled HTML tooltip, with data_id keying every interaction.

Choropleth map
Spatial

An sf object drawn directly with mark_sf() and a proper map projection via coord_sf().

A colour bar with the class breaks written on it
Legends
Heatmaps

guide_coloursteps() draws a binned colour scale as one segmented bar labelled at the class boundaries, so the legend reports where the breaks fell and a change of…

Composing plots
Composition

Arrange several independent plots into one figure with a patchwork-style design string.

Contours traced in the engine
Statistical
Heatmaps

mark_contour() and mark_contour_filled() trace iso-lines with vellum’s own marching squares, so contour lines are chained polylines and filled bands are closed rings, with…

Correlation matrix
Heatmaps

A heatmap of a correlation matrix drawn with tile marks and a diverging fill scale.

Coxcomb (polar bars)
Polar

Bars mapped into polar space: a Nightingale-style coxcomb via coord_polar().

Linked views with crosstalk
Interactive

One SharedData, four coordinated views: brush a plot to highlight the others, and filter inputs cross-filter them all. Client-side, no Shiny.

Cyberpunk dashboard
Composition
Effects

Four neon panels composed into one dark dashboard with a design string, glowing lines, and a gradient area fill.

Neon glow and gradient fill
Effects

A high-contrast cyberpunk theme with a glowing line and a gradient area fill.

The US Census, all 306 million points
Big data

Datashading the full 2010 US Census (population density and an additive per-race composite), reproducing the classic datashader example.

Datashading a million points
Big data

Aggregate-then-shade rendering that stays fast and legible at a million points.

Declarative interactivity
Interactive

Selections live in the plot spec. Name one with select_point() or select_interval(), then drive a spotlight with condition() or cross-filter a second panel with filter_by().

Dendrogram
Hierarchies

A hierarchical clustering drawn straight from hclust(), cut into coloured groups.

Density curve
Statistical

A kernel density estimate as a filled area, with an adjustable bandwidth.

Reports, decks, and batch export
Composition

pdf_pages() writes many plots into one PDF, or splits a faceted plot into one page per facet, and render_all() renders a list of plots to separate files across CPU cores.

Faceting
Composition

Small multiples: one panel per level of a grouping variable with facet_wrap().

Flags poured into their borders
Spatial
Effects

clip_to() masks a plot to an sf geometry instead of the panel rectangle, so a country’s flag fills the country’s own outline.

Flow map
Networks

A one-to-many flow map: migration into California fans out along merging branches sized by volume.

Animated bubble chart (gapminder)
Animation

Keyframe animation: a Gapminder bubble chart flowing over year, with scales frozen once across all years and frames tweened in the Rust backend.

OpenStreetMap Germany, two ways
Spatial
Big data

The tagged points of interest, then all 436 million nodes in the country, aggregated in DuckDB so they fit in memory. On a warm earth palette.

Gradient interpolation spaces
Backend

Blend the same gradient stops in sRGB, Oklab, or Oklch and watch what happens to the midtones.

Hexagonal binning
Heatmaps

Twenty thousand points binned into hexagons, shaded by count with a perceptual palette.

Hierarchy diagrams
Hierarchies

One tree drawn four ways from the same parent list: sunburst, treemap, circle-pack, and icicle, switched with a single argument.

Picking that measures to the mark
Interactive

The widget carries each element’s true vertices alongside its bounding box, so a cursor on a line picks that line, a click inside a region hits the region, and a graph edge…

Interactive widget
Interactive

Any vellumplot becomes a client-side interactive widget with as_widget(): hover, select, brush, and zoom.

Labels that get out of each other’s way
Text

repel = TRUE hands label placement to the engine solver, which works in device pixels, so facets, polar coordinates, and warped panels all repel correctly, in one pass with…

A choropleth that names its regions
Spatial
Text

mark_sf_label() places one label per feature at its interior point, reprojected through the same coord_sf() CRS as the fill, so the names land on the geometry even after a…

Layered marks: points and a smooth
Basics

Two marks over the same data: a scatter and a linear smooth with a confidence band.

Lollipop chart
Basics

A lollipop built from primitives: a segment mark for the stems and a point mark for the heads.

Scale bar, north arrow, graticule
Spatial

The cartographic furniture a map needs to be readable: mark_scalebar() and mark_compass() pinned to a panel corner, and graticule lines drawn behind the map by coord_sf().

Marginal distributions
Statistical

add_marginal() draws the x and y distributions along the panel edges, aligned to the scatter. Density or histogram, pooled or split by group.

Twenty-six seasons of NBA shots
Big data
Heatmaps

5.2 million field-goal attempts, 2000–01 to 2025–26, datashaded one facet per season. The mid-range empties out and the three-point arc lights up.

Edge bundling
Networks

Bundled edge routing collapses 2,682 US flight routes into a few legible trunks.

Network diagram
Networks

A node-link diagram from an igraph graph, laid out with a stress layout.

Naming only the points that stand out
Text
Statistical

mark_outlier_label() keeps the rows whose y is an outlier under Tukey’s rule or an sd threshold, per colour group, and labels just those, so a 142-point scatter names its…

The paint model
Backend

Gradients, tiling patterns, masks, group opacity, and blend modes, drawn straight from vellum grobs with no grammar in sight.

Paint model, meet the grammar
Backend
Statistical

The same gradient fills and blend modes from the paint-model page, dropped straight into a vellumplot chart through mark aesthetics.

Hatched fills for greyscale
Accessibility
Basics

Pattern fills tell stacked categories apart by texture, so the chart survives a black-and-white print and colour-blind readers.

Pie and donut
Polar

The same category counts as a pie and as a donut, with a configurable hole.

Linting a figure before anyone sees it
Accessibility

plot_lint() reports the problems a green test suite hides: text below a legibility floor, contrast under the WCAG threshold, labels off the panel. render_plot(cvd = ) shows…

A figure that carries its own provenance
Backend

plot_manifest() fingerprints a plot’s data, spec, and resolved fonts, plot_svg(manifest = TRUE) embeds that in the file, and plot_verify() checks a figure still matches its…

Rainclouds, and the sina spread underneath them
Statistical

mark_raincloud() composes a one-sided density with the raw observations spread by local density, so one band shows the shape of a distribution and every point in it.

Retained-mode editing
Backend

A vellum scene is a retained graph of named nodes. Build it once, then get_node() and edit_node() to recolour a single element, without redrawing the rest.

Rich text labels with md()
Text

Markdown markup in titles and axis names: bold, italic, superscript, and subscript via md().

Sankey diagram
Flows

A multi-stage energy-flow diagram, with ribbons that fade from their source colour to their target.

Scatter with a continuous colour legend
Basics

A point mark encoding a third variable to colour, with a trained continuous scale and guide.

Labels at the ends of the lines, instead of a legend
Text

mark_series_label() names each colour series at its line end in the series colour, repelled apart with leader lines, so reading the chart never involves a round trip to a…

Significance brackets over a boxplot
Statistical

mark_signif() runs the pairwise test itself and draws the bracket, the p-value or the stars, stacking brackets above the data and expanding the y axis to fit them.

Hand-drawn sketch style
Effects

A Rough.js-style hand-drawn rendering, applied per mark or as a whole theme.

632 million map points, one continent
Spatial
Big data

Every OpenStreetMap node in South America, datashaded. 632M points aggregated to 8.4M grid cells in DuckDB before R sees them, so the render fits in memory without losing…

Sparklines in a table
Statistical

vtable() renders a data frame with a list-column of vectors as per-row sparklines; gt_vsparkline() does the same inside a gt table.

Word-sized charts, inline in the text
Text
Statistical

vsparkline() draws an axis-free chart small enough to sit in a sentence. plot_svg() turns it into inline SVG that inherits the surrounding text colour.

The plot is a document
Backend

as_spec() and spec_to_json() serialise a plot to plain data and back; spec_diagnose() validates one against a dataset without throwing; spec_to_vegalite() translates it to…

What a stroke can be
Backend

Gradient strokes, a width and colour per segment, dash phase, an outline you can fill, pixel-snapped hairlines, and haloed text: the paint model applied to lines rather than…

Icons as vector markers
Basics
Images

A point shape can be an SVG icon, a path d string or a .svg file, drawn as crisp vector geometry rather than a raster pasted at every point.

Every point of interest in Switzerland
Spatial
Big data

Half a million OpenStreetMap POIs, streamed straight from a 500 MB .osm.pbf with DuckDB and datashaded into the shape of the country.

Labels that follow the curve
Text

mark_text_path() sets one label per group along that group’s own path, each glyph rotated to the local tangent: direct labelling instead of a legend.

One scene, three formats
Backend

The same vellum scene rendered to PNG, SVG, and PDF. Layout is solved once and each backend walks that one answer, rather than re-solving against its own metrics.

Venn diagrams that are not transparency tricks
Statistical

vvenn() computes the disjoint regions of 2 or 3 sets as real geometry with boolean path operations, so the overlaps are solid fills instead of alpha-composited circles.

Waffle charts, counted rather than eyeballed
Basics

vwaffle() spends a grid of 100 cells on category shares with largest-remainder allocation, so the cells always sum to the grid and a share can be read by counting squares.

Flags as image marks
Images

mark_image() places a raster at every data point. Here round country-flag PNGs mark each World Cup semi-finalist at its pre-tournament Elo rank, and 2026 stands out as the…

No matching items
    Back to top

    Built with Quarto · part of the vellum ecosystem

     

    © 2026 · MIT licensed