| output | github_document |
|---|
ggWebGL is an R package for browser-native WebGL rendering of R graphics
through htmlwidgets. It supports grammar-style graphics workflows and
renderer-ready specifications for dense analytical and scientific scenes,
including point, line, trajectory, raster, vector, mesh, and surface layers,
shader-driven display modes, timeline controls, structured views, selection
metadata, Shiny output, and publication-oriented static export helpers.
The package keeps rendering in the browser and avoids any mandatory CUDA,
Metal, or OpenCL toolchain. Heavier preprocessing, large-data preparation,
and device-specific acceleration are left to companion packages.
ggWebGL provides two complementary interfaces:
- grammar-style layers for selected
ggplot2workflows; - renderer-ready layer and specification helpers for downstream packages or custom visualization pipelines.
The package provides browser-native rendering, widget construction,
renderer-ready specifications, shader modes, interaction contracts, structured
views, timelines, and static export surfaces. It does not implement downstream
scientific, simulation, topological, model-explanation, or domain-specific
semantics. Those semantics should enter ggWebGL through explicit adapter
boundaries such as backend-neutral tables, renderer-ready primitive layers, or
ggwebgl_spec payloads.
The current implementation supports:
| Feature | Current status |
|---|---|
geom_point_webgl() |
Rendered in WebGL |
geom_line_webgl() |
Rendered in WebGL |
geom_raster_webgl() |
Rendered in WebGL |
geom_vector_webgl() |
Renderer path for vector-arrow layers |
geom_mesh_webgl() |
Renderer path for indexed mesh layers |
geom_surface_webgl() |
Renderer path for triangulated surface layers |
| Renderer-ready layers | Points, lines, vectors, rasters, meshes, and surfaces through ggwebgl_layer_*() helpers |
| Renderer specification | ggwebgl_spec() and as_ggwebgl_spec() adapter boundaries |
| Shader modes | default, density_splat, trajectory_age, trajectory_age_glow |
| Interaction | pan, zoom, hover; visible brush and lasso selection through ggwebgl_selection() |
| Runtime controls | Exact/cumulative timeline controls through ggwebgl_timeline() |
| View contract | Structured 2D/3D view and camera metadata through ggwebgl_view() |
| Output targets | R Markdown / Quarto HTML, Shiny, and static image export helpers |
ggplot2 compatibility |
Focused grammar-preserving paths for dense scenes and fixed-scale facets |
| Unsupported facet mode | Free x/y scales fall back to metadata |
ggWebGL is not a full replacement for ggplot2. It is a browser-native
WebGL rendering backend with both grammar-style front ends and explicit
renderer-ready adapter boundaries.
install.packages("ggWebGL")For the development version:
# install.packages("remotes")
remotes::install_github("fbertran/ggWebGL")library(ggplot2)
library(ggWebGL)
plot <- ggplot(diamonds, aes(carat, price, colour = cut)) +
geom_point_webgl(size = 1.1, alpha = 0.18) +
theme_webgl(
shader = "density_splat",
interactions = c("pan", "zoom", "hover")
)
ggplot_webgl(plot, height = 520)ggWebGL can also render explicit primitive layers without requiring the input
to originate from a ggplot2 object.
library(ggWebGL)
points <- ggwebgl_layer_points(
data.frame(
x = c(0, 1, 2),
y = c(2, 1, 0),
colour = c("#0f766e", "#f97316", "#2563eb")
),
x = "x",
y = "y",
colour = "colour",
size = 4
)
spec <- ggwebgl_spec(
layers = list(points),
labels = list(title = "Renderer-ready point layer")
)
ggWebGL(spec, height = 420)- Parse supported grammar-style point, line, raster, vector, mesh, surface, and fixed-scale facet layers.
- Normalize parsed layers into a renderer-scene contract.
- Accept renderer-ready primitive payloads from explicit adapter boundaries.
- Resolve raster fills and styling metadata on the R side.
- Bind panel-local payloads to browser-side
WebGLbuffers, textures, attributes, and shader modes. - Render interactively through an
htmlwidgetswidget. - Reuse the same widget in
Shiny.
For static capture and publication workflows, ggWebGL exposes:
snapshot_ggwebgl()for PNG/JPEG captures;compose_ggwebgl_figure()for figure assembly, labels, and lightweight annotations.
