Package: vellum 0.7.0.9000

vellum: Low-Level Graphics with Device-Independent Layout and Queryable Scenes

A grid-like low-level graphics system for R. Text metrics and layout are resolved without a graphics device, so one solved scene renders to PNG, SVG, or PDF with the same geometry, and the finished scene can report that geometry back element by element (a data key and a resolved device-pixel box) or be queried by point. The scene graph, unit/layout engine, and rendering run in a Rust backend.

Authors:David Schoch [aut, cre]

vellum_0.7.0.9000.tar.gz
vellum_0.7.0.9000.zip(r-4.7-x86_64)vellum_0.7.0.9000.zip(r-4.7-arm64)vellum_0.7.0.9000.zip(r-4.6-x86_64)vellum_0.7.0.9000.zip(r-4.6-arm64)vellum_0.7.0.9000.zip(r-4.5-x86_64)
vellum_0.7.0.9000.tgz(r-4.6-x86_64)vellum_0.7.0.9000.tgz(r-4.6-arm64)vellum_0.7.0.9000.tgz(r-4.5-x86_64)vellum_0.7.0.9000.tgz(r-4.5-arm64)
vellum_0.7.0.9000.tar.gz(r-4.7-arm64)vellum_0.7.0.9000.tar.gz(r-4.7-x86_64)vellum_0.7.0.9000.tar.gz(r-4.6-arm64)vellum_0.7.0.9000.tar.gz(r-4.6-x86_64)
manual.pdf |manual.html✨
DESCRIPTION |NEWS
card.svg |card.png
vellum/json (API)

# Install 'vellum' in R:
install.packages('vellum', repos = c('https://schochastics.r-universe.dev', 'https://cloud.r-project.org'))

Bug tracker:https://github.com/r-vellum/vellum/issues

Pkgdown/docs site:https://r-vellum.github.io

On CRAN:

Conda:

data-visualizationdatavizextendrgraphicsrustscene-graphcargo

7.91 score 24 stars 3 packages 56 scripts 96 exports 12 dependencies

Last updated from:51f1867698. Checks:14 OK, 1 FAIL. Indexed: yes.

TargetResultTimeFilesSyslog
linux-devel-arm64OK333
linux-devel-x86_64OK397
source / vignettesOK515
linux-release-arm64OK328
linux-release-x86_64OK366
macos-release-arm64OK364
macos-release-x86_64OK556
macos-oldrel-arm64OK327
macos-oldrel-x86_64OK703
windows-devel-arm64OK589
windows-devel-x86_64OK632
windows-release-arm64OK681
windows-release-x86_64OK577
windows-oldrel-x86_64OK396
wasm-releaseFAIL237

Exports:as_maskas_scene_specas_vellumas_vellum_scenebezier_grobcircle_grobcontour_grobdatashadedatashade_linesdatashade_segmentsdescribedisplaydrawdynspreadedit_nodeelement_geometryfont_checkfont_pinfrom_scene_specget_nodegrid_layoutgrobheightgrobwidthhexagon_grobhit_testis_unitlinear_gradientlines_grobloop_grobmdnode_namespath_grobpdf_pagespoints_grobpolygon_grobpopprofile_renderpushradial_gradientraster_grobrect_grobrenderrender_allrender_gridroundrect_grobscene_diffscene_fontsscene_hashscene_insetscene_modelscene_pdfscene_pngscene_rasterscene_readscene_statsscene_svgscene_writesector_grobsegments_grobsketchspline_grobspreadstroke_to_pathstylesvg_grobtext_grobtext_path_grobvl_arrowvl_buffervl_clear_render_cachevl_contourvl_convertvl_empty_regionvl_gparvl_hatchvl_hullvl_lintvl_lint_assertvl_lint_findingvl_lint_overlayvl_lint_rulevl_lint_rulesvl_nearestvl_path_opvl_patternvl_placevl_render_animationvl_repelvl_scenevl_shadowvl_strheightvl_strwidthvl_svg_pathvl_unitvl_viewportwhy_size

Dependencies:base64encclicpp11gluejsonlitelifecyclerlangS7stringisystemfontstextshapingvctrs

The scene graph and the paint model
The scene graph | Units | The paint model | Gradients | Patterns | Hatching | Masks and group opacity | Stroking with a gradient | Dash phase | Per-segment style | Filling a line | A width that varies | The same taper, resolved at render | A note on dense paths | Recap

Last update: 2026-09-03
Started: 2026-07-05

Asking a scene what it drew: read-back, picking, and editing
Naming nodes | Editing a node | Hit-testing | A per-element model of the scene | Every mark family can be keyed | Hit-testing that respects the shape | For a host that cannot ask | Why this matters

Last update: 2026-09-03
Started: 2026-07-05

Accessible output, and fonts you can trust
Marks that mean something | Roles | Two things this does not change | Fonts you can trust | What it is for | What it deliberately is not | Still missing: selectable, faithful SVG text | Where to go next

Last update: 2026-08-03
Started: 2026-07-31

Inspecting a scene: linting, coverage, profiling
Why this can exist here | vl_lint(): static analysis for graphics | Seeing the findings | The rules that ship | Adding your own rules | scene_stats(): how crowded is this, really? | profile_render(): where the time goes | Putting it in a test | Where to go next

Last update: 2026-08-03
Started: 2026-07-30

Placement: repelling labels, finding room, outlining groups
Repelling labels | It does not care what coordinate system you used | The solve on its own | How it works, and where it gives up | Where is there room? | Outlining a group | Where to go next

Last update: 2026-08-03
Started: 2026-07-31

Render quality: accessibility, crisp edges, group effects
Colour-vision simulation | Crisp gridlines | Group effects | Where to go next

Last update: 2026-08-03
Started: 2026-07-30

Datashading: millions of points, honestly
Generating an orbit | Shading in one call | Why aggregation wins | Mapping density to colour | Lining up with data axes | A gallery | Lines: dense timeseries | Segments: network edges | Keeping thin marks visible: spread | Recap | In a grammar

Last update: 2026-08-03
Started: 2026-07-05

Geometry operations: booleans, contours, imported paths
Boolean operations | Why not just clip? | Holes | Contours | Over a datashaded base | SVG path data | Because it is geometry | Where to go next

Last update: 2026-08-03
Started: 2026-07-31

Typography: layout, halos and OpenType features
Text that fits a box | Alignment | Auto-fit | Text on a path | Halos | OpenType features | Measurement follows features | Both together

Last update: 2026-08-03
Started: 2026-07-30

Choosing an output format
Still pictures | Animation | Documents and batches | Formats vellum does not write | Where to go next

Last update: 2026-07-31
Started: 2026-07-31

Scenes as values: saving, comparing, composing
Saving a scene | Fingerprinting | Comparing | Composing | Where to go next

Last update: 2026-07-30
Started: 2026-07-30

Coming from grid
The concept map | Things grid has no equivalent for | Side by side | What is different, and why | The builder is functional, not stateful | Metrics are eager, so there is no draw-time hook protocol | Units are records, not expression trees | The tree is a value, and it can report geometry | vl_gpar inherits, but there is no cascade | Do I have to rewrite my grid code?

Last update: 2026-07-30
Started: 2026-07-05

Get started
A first scene | Building a scene: push, draw, pop | Rendering to a file | Where to go next

Last update: 2026-07-30
Started: 2026-07-05

The scene contract: what vellumplot and vellumwidget depend on
The seam, in one picture | Carrying identity on a grob | scene_model(): the per-element table | elements | panels | The meta key vocabulary | scene_svg(): the emitted attributes | Pannable panels | Accessibility | Invariants the contract guarantees | For contributors

Last update: 2026-07-30
Started: 2026-07-07

Rendering grid and ggplot2 through vellum
How it works | A grid grob tree | A ggplot2 plot | When to use interop versus the native API

Last update: 2026-07-09
Started: 2026-07-05

Readme and manuals

Help Manual

Help pageTopics
Masksas_mask
Convert a scene to and from a plain listas_scene_spec from_scene_spec
Render grid graphics (ggplot2 / lattice / grid) through vellumas_vellum render_grid
Coerce an object to a vellum sceneas_vellum_scene
Aggregate-then-shade a large point cloud (datashader-style)datashade
Aggregate-then-shade dense lines and segments (datashader-style)datashade_lines datashade_segments
Set a scene's accessibility name and descriptiondescribe
Display a scene in the active graphics devicedisplay
Dynamically spread a raster grob to a target densitydynspread
The true geometry of a scene's addressable elementselement_geometry
Pin a scene's fonts, and check them laterfont_check font_pin
Gradient fillsgradients linear_gradient radial_gradient
Graphical objects (grobs)bezier_grob circle_grob grob hexagon_grob lines_grob loop_grob path_grob points_grob polygon_grob raster_grob rect_grob roundrect_grob sector_grob segments_grob spline_grob text_grob
Size a unit by a grob's extentgrobheight grobwidth
Hit-test a scenehit_test
Rich-text labels (markdown subset)md
Inspect and edit a scene by node nameedit_node get_node node_names
Write several scenes as the pages of one PDFpdf_pages
Where a scene spends its render timeprofile_render
Render many scenes in parallelrender_all
What changed between two scenesscene_diff
Which fonts a scene actually usedscene_fonts
A content fingerprint for a scenescene_hash
Inset one scene inside anotherscene_inset
A serializable, per-element model of a scenescene_model
Render a scene to PNG or PDF bytesscene_pdf scene_png
Read a rendered scene back as pixelsscene_raster
Ink and overplotting statistics for a scenescene_stats
Render a scene to an SVG stringscene_svg
Write and read a scenescene_read scene_write
Hand-drawn ("sketch") renderingsketch
Spread (dilate) the pixels of a raster grobspread
Freeze a stroke into a fillable outlinestroke_to_path
Reusable style classesstyle
Text set along a pathtext_path_grob
Arrowheadsvl_arrow
Buffer a polygon outwardvl_buffer
Clear the render cachevl_clear_render_cache
Contour lines from a gridcontour_grob vl_contour
Convert a unit to another unit, in a scene's contextvl_convert
Find the largest empty rectangle in a scenevl_empty_region
Graphical parametersvl_gpar
Hatch fillvl_hatch
Hull of a point setvl_hull
Check a scene for likely mistakesvl_lint
Fail on lint findingsvl_lint_assert
Build a lint findingvl_lint_finding
Draw lint findings onto the scenevl_lint_overlay
Register a lint rulevl_lint_rule vl_lint_rules
Find the marks nearest a point, by true geometryvl_nearest
Boolean operations on pathsvl_path_op
Tiling-pattern fillsvl_pattern
Move labels so they stop overlappingvl_place vl_repel
Render a keyframe animationvl_render_animation
Build and render a scenedraw pop push render vl_scene
Drop shadow for a viewport groupvl_shadow
Measure textvl_strheight vl_strwidth
SVG path data as scene geometrysvg_grob vl_svg_path
Units of measurementis_unit vl_unit
Viewports and layoutsgrid_layout vl_viewport
Explain why a node has its resolved sizewhy_size