Chart API and interactions
Use the published package root to render, update, inspect, and clean up charts. The chart reference covers all eleven data families and their visual options; the gallery runs one example of each.
Entry points
| Export | Purpose |
|---|---|
createChart(canvas, options, style?) | Browser Canvas chart; returns a ChartInstance. Options are ChartOptions: PlotOptions without required dimensions, plus browser lifecycle fields below. |
plot(options) | Synchronous renderer-neutral Scene with required type, width, and height. A scene has dimensions, primitives, and optional 3D metadata. |
renderToCanvas(canvas, options, style?) | One-shot Canvas render returning a Scene; CanvasPlotOptions accepts optional logical width/height, plus canvas.pixelRatio and canvas.resolutionScale. Omitted dimensions reuse the logical Canvas size. |
renderToPNG(options) | Returns Promise<Uint8Array> containing UTF-8 JSON scene data, not PNG image bytes. This existing placeholder is not a general PNG encoder. |
renderScene3dToSVG(options), renderScene3dToPNG(options) | Static 3D export. SVG returns a string; PNG returns bytes asynchronously and needs optional native Node capability. |
Browser-only ChartOptions add responsive, progressiveRender, resizeTarget, interactions, and onX event callbacks. progressiveRender: true draws a skeleton phase before a full trace phase. resizeTarget is a DOM Element. Set dimensions explicitly when layout requires fixed pixels; resize(width, height) updates the instance. The optional style argument supplies color/lineWidth Canvas defaults.
Update data and state
Keep the returned instance. render() draws and returns the latest scene; resize(width, height) changes dimensions; updateOptions(partialOptions) applies chart options. Use setData(data) for the single-series form, setTraces(traces) to replace traces, or setTraceData(traceIndex, data) for one trace. appendData(data, { traceIndex, maxPoints }) supports a bounded sliding window. These operations return a scene when they render; methods declared Scene | undefined can return undefined when no valid change is applied.
import { createChart } from "fastplotjs";
const canvas = document.getElementById("chart");
const chart = createChart(canvas, {
type: "line", engine: "ts",
data: [{ x: 0, y: 2 }, { x: 1, y: 5 }],
axes: { show: true },
});
chart.appendData([{ x: 2, y: 3 }], { maxPoints: 100 });
chart.on("dataUpdate", ({ mode, pointCounts }) => console.log(mode, pointCounts));
// On component teardown:
chart.destroy();
getDataState() returns { traceCount, traceData }; setDataState(state, { emit?: boolean }) applies a matching trace topology without replacing styles. getChartState()/setChartState(state, { emit?: boolean }) use ChartState fields chartType, data, viewport, traceVisibility, polarRotation, optional camera3d/cameras3d, dragMode, and optional pointSelection. State inputs and getters are snapshots; incompatible topology or stale state fails. { emit: false } prevents feedback loops when syncing charts while still applying valid state.
getTraceVisibility() returns { traceCount, visibleTraceIndexes, hiddenTraceIndexes }. Use setTraceVisibility(indexes, visible, { emit? }), setTraceVisibilityState(state, { emit? }), or resetTraceVisibility({ emit? }). At least one trace remains visible. getScene() reads the latest scene. Call destroy() when the Canvas leaves the page; subsequent updates are invalid.
Interaction options
All pointer features are opt-in. interactions accepts zoom, pan, polarRotate, camera3d, dragMode, tooltip, crosshair, pointClick, and pointSelection. Boolean true enables a feature's package defaults; an object sets individual fields. dragMode is zoom or pan.
| Group | Fields and applicability |
|---|---|
zoom | wheel/drag/pinch/mode/factor/preventDefault/minDragDistance. Mode is x, y, or xy. Applies to compatible Cartesian viewport charts; bar and polar ignore axis viewport zoom. |
pan | mode/mouseButton/modifierKey/preventDefault/minDragDistance. Modifier: alt, ctrl, meta, none, or shift. Bar and polar ignore axis viewport pan. |
polarRotate | mouseButton/preventDefault/minDragDistance for polar start-angle rotation. |
camera3d | orbit/dolly/pan/touch/keyboard/mouseButton/panModifierKey/preventDefault/minDragDistance/orbitDegreesPerPixel/wheelDollySpeed/keyboardOrbitDegrees/keyboardDollyFactor/keyboardPanRatio/minDistance/maxDistance/minOrthographicScale/maxOrthographicScale/maxPitchDegrees/maxInteractivePoints. Experimental 3D only. |
tooltip | enabled/mode/lineMode/shared/sharedXMode/radius/formatter/style plus direct style aliases below. Inspection needs a rendered hit. |
crosshair | enabled/mode/snap/style/label. Line, bar, and wonderplot Canvas overlay. |
pointClick | enabled/mouseButton/maxMovement/radius. Emits a hit event for supported rendered geometry. |
pointSelection | enabled/mode/keyboard/mouseButton/maxMovement/radius/strokeColor/fillColor/lineWidth/padding. Persistent highlight for 2D families, not 3D. |
Interaction distances, line widths, marker radii, drag thresholds, and label offsets are Canvas pixels. Degrees appear explicitly in rotation/camera option names. Ratios are unitless; opacity is 0…1. Callback formatters run for display text and should be pure.
Viewport, polar rotation, 3D camera
getViewport() returns x/y axis-id range maps. setViewport(viewport, { activeSubplotId, mode, emit? }) and zoom(viewport, ...) apply ranges. zoomIn/zoomOut take optional subplotId/mode/xAxes/yAxes/emit/factor/xRatio/yRatio. pan uses optional subplotId/mode/xAxes/yAxes/emit/xRatio/yRatio. resetZoom/autoscale use optional subplotId/mode/xAxes/yAxes/emit. getViewportControlState reports which directions/reset/autoscale are available for an external toolbar; its options contain optional zoom/pan/reset/autoscale/panStepRatio. getDragMode()/setDragMode(mode) switch zoom/pan left-drag behavior.
Wheel, drag-box, pinch, pan, and programmatic patches stay in an active subplot and can synchronize compatible named axes through viewportGroup. Axis zoom interactions and zoom helpers are no-ops for bar and polar; direct setViewport() can still update stored viewport state and emit an event. No built-in zoom toolbar is supplied. getViewportControlState() returns canZoomIn, canZoomOut, canPanLeft, canPanRight, canPanUp, canPanDown, canResetZoom, and canAutoscale flags.
getPolarRotation()/setPolarRotation({ startAngleDegrees }, { emit? }) control polar orientation. Experimental 3D uses getCamera3d(subplotId?), setCamera3d(camera, { subplotId, emit? }), orbitCamera3d({ yawDegrees, pitchDegrees, subplotId, emit? }), dollyCamera3d({ factor, subplotId, emit? }), panCamera3d({ xRatio, yRatio, subplotId, emit? }), and resetCamera3d({ subplotId, emit? }). A before-camera event can cancel a change.
const chart = createChart(canvas, {
type: "line", engine: "ts", data: [{ x: 0, y: 2 }, { x: 1, y: 5 }],
interactions: { zoom: true, pan: { modifierKey: "shift" } },
});
chart.on("viewportChange", ({ viewportAfter }) => console.log(viewportAfter));
chart.zoomIn({ mode: "x", factor: 2 });
chart.resetZoom();Tooltip, crosshair, and selected points
interactions.tooltip is disabled by default. Its mode is default/custom; lineMode is points/segments; shared aggregates one visible trace per active subplot and x-axis; sharedXMode is exact (default) or nearest. formatter receives a source-aware ChartTooltipItem with subplotId/traceIndex/traceName/traceColor/pointIndex/xAxisId/yAxisId/x/y/xValue/yValue/xCategory/yCategory/value/z/colorValue/renderedColor/size/sizeValue/radius/opacity/opacityValue/renderedOpacity/normalizedValue/baseline/depth (the latter fields are optional), and optional shared items. It returns text. Tooltip style has text/backgroundColor/borderColor/borderWidth/borderRadius/padding; direct aliases are textStyle/backgroundColor/borderColor/borderWidth/borderRadius/padding. getTooltip(), setTooltip({ subplotId?, traceIndex, pointIndex }, { emit? }), and clearTooltip({ emit? }) manage transient state. A hidden or unrendered target has no hit.
crosshair.mode is x/y/xy; snap is none/nearest. style has color/lineWidth/lineDash. Its label is a boolean or show/formatter/font/lineHeight/color/backgroundColor/borderColor/borderWidth/padding/offset; formatter receives subplot, mode, snap, axis ids, numeric values, labels and default label. getCrosshair(), setCrosshair({ activeSubplotId?, xAxisId?, yAxisId?, xValue, yValue }, { emit? }), and clearCrosshair({ emit? }) manage the overlay.
pointClick emits one source-aware hit. pointSelection.mode is single/multiple; getPointSelection() returns { traceCount, selection, selections? }. setPointSelection(state, { emit? })/clearPointSelection({ emit? }) update persistent 2D highlights. Data changes retain valid identities. No public API returns every original point inside a drawn area, including points omitted by LOD; that source-point area query is planned, not implemented.
Events and callbacks
Subscribe with chart.on("eventName", handler); it returns an unsubscribe function. chart.off(name, handler) removes the same handler. ChartOptions offers a matching onX callback for every event below. A callback payload carries its type and event-specific state; optional source distinguishes pointer, API, legend, keyboard, or data where declared.
| Event names | Meaning |
|---|---|
renderStart, renderPhase, renderEnd, beforeRender, render | Rendering lifecycle. Phase is skeleton/full when progressive output applies. |
resizing, resize, error | Size change and error notification. |
beforeZoom, zoomStart, zoom, viewportChange, zoomEnd, zoomCancel, dragModeChange | Viewport lifecycle; beforeZoom.preventDefault() cancels. viewportChange follows successful viewport mutation. |
polarRotationChange, beforeCamera3dChange, camera3dChange | Family-specific navigation; before-camera can cancel. |
tooltip, tooltipClear, crosshairChange, crosshairClear | Transient inspection state. |
pointClick, pointSelectionChange, traceVisibility, dataUpdate, chartStateChange | Source hit, persistent selection, legend/API visibility, data and whole-chart state. |
Callback names are onRenderStart, onRenderPhase, onRenderEnd, onBeforeRender, onRender, onResizing, onResize, onError, onBeforeZoom, onZoomStart, onZoom, onViewportChange, onZoomEnd, onZoomCancel, onDragModeChange, onPolarRotationChange, onBeforeCamera3dChange, onCamera3dChange, onTooltip, onTooltipClear, onCrosshairChange, onCrosshairClear, onPointClick, onPointSelectionChange, onTraceVisibility, onDataUpdate, and onChartStateChange.
Payload type glossary
These named values complete the event signatures below. AxisInteractionMode is "x" | "y" | "xy". AxisViewportPatch is { xAxes: Record<string, { min, max }>, yAxes: Record<string, { min, max }>, resetXAxes?: string[], resetYAxes?: string[] }, with scalar range endpoints. ChartZoomPointer is Canvas-pixel { x, y }; ChartZoomSelection has start and end pointers. ChartSize is pixel { width, height }. Scene contains dimensions, primitives, and optional 3D metadata.
ChartZoomSource: wheel, drag, pinch, pan, api. ChartZoomCancelReason: prevented, threshold, pointercancel. ChartCamera3dSource: api, pointer, wheel, pinch, keyboard. ChartCamera3dChangeReason: set, orbit, dolly, pan, pan-dolly, reset, rollback. ChartPolarRotationSource: api, pointer. ChartTooltipSource and ChartCrosshairSource: pointer, api. ChartPointSelectionSource: pointer, keyboard, api, data. ChartTraceVisibilitySource: legend, api. ChartDataUpdateMode: setData, setTraces, setTraceData, appendData, setDataState. ChartRenderPhase: skeleton, full.
Exact event payloads
The rows below reproduce the public 0.3.0 event field contracts. Each payload includes the literal type shown by its event name. State objects are described above; optional fields are marked ?. beforeZoom.preventDefault() and beforeCamera3dChange.preventDefault() cancel their respective changes.
| Event and type | Payload fields |
|---|---|
renderPhaseChartRenderPhaseEvent | type: "renderPhase"; phase: ChartRenderPhase; size: ChartSize; scene: Scene; |
renderStartChartRenderStartEvent | type: "renderStart"; size: ChartSize; |
renderEndChartRenderEndEvent | type: "renderEnd"; size: ChartSize; scene: Scene; |
beforeRenderChartBeforeRenderEvent | type: "beforeRender"; size: ChartSize; |
renderChartRenderEvent | type: "render"; size: ChartSize; scene: Scene; |
resizingChartResizingEvent | type: "resizing"; previousSize: ChartSize; size: ChartSize; |
resizeChartResizeEvent | type: "resize"; previousSize: ChartSize; size: ChartSize; scene: Scene; |
errorChartErrorEvent | type: "error"; error: unknown; |
beforeZoomChartBeforeZoomEvent | type: "beforeZoom"; source: ChartZoomSource; mode: AxisInteractionMode; activeSubplotId: string; viewportBefore: AxisViewportState | undefined; viewportAfter: AxisViewportState | undefined; patch: AxisViewportPatch; pointer?: ChartZoomPointer; selection?: ChartZoomSelection; defaultPrevented: boolean; preventDefault(): void; |
zoomStartChartZoomStartEvent | type: "zoomStart"; source: ChartZoomSource; mode: AxisInteractionMode; activeSubplotId: string; viewportBefore: AxisViewportState | undefined; pointer?: ChartZoomPointer; selection?: ChartZoomSelection; |
zoomChartZoomEvent | type: "zoom"; source: ChartZoomSource; mode: AxisInteractionMode; activeSubplotId: string; viewportBefore: AxisViewportState | undefined; viewportAfter: AxisViewportState | undefined; patch: AxisViewportPatch; scene: Scene; pointer?: ChartZoomPointer; selection?: ChartZoomSelection; |
viewportChangeChartViewportChangeEvent | type: "viewportChange"; source: ChartZoomSource; mode: AxisInteractionMode; activeSubplotId: string; viewportBefore: AxisViewportState | undefined; viewportAfter: AxisViewportState | undefined; patch: AxisViewportPatch; scene: Scene; pointer?: ChartZoomPointer; selection?: ChartZoomSelection; |
zoomEndChartZoomEndEvent | type: "zoomEnd"; source: ChartZoomSource; mode: AxisInteractionMode; activeSubplotId: string; viewportBefore: AxisViewportState | undefined; viewportAfter: AxisViewportState | undefined; pointer?: ChartZoomPointer; selection?: ChartZoomSelection; |
zoomCancelChartZoomCancelEvent | type: "zoomCancel"; source: ChartZoomSource; mode: AxisInteractionMode; activeSubplotId?: string; reason: ChartZoomCancelReason; viewportBefore: AxisViewportState | undefined; pointer?: ChartZoomPointer; selection?: ChartZoomSelection; |
dragModeChangeChartDragModeChangeEvent | type: "dragModeChange"; previousMode: ChartDragMode; mode: ChartDragMode; |
polarRotationChangeChartPolarRotationChangeEvent | type: "polarRotationChange"; source: ChartPolarRotationSource; previous: ChartPolarRotationState; state: ChartPolarRotationState; |
beforeCamera3dChangeChartBeforeCamera3dChangeEvent | type: "beforeCamera3dChange"; subplotId: string; source: ChartCamera3dSource; reason: ChartCamera3dChangeReason; previous: ChartCamera3dState; state: ChartCamera3dState; defaultPrevented: boolean; preventDefault(): void; |
camera3dChangeChartCamera3dChangeEvent | type: "camera3dChange"; subplotId: string; source: ChartCamera3dSource; reason: ChartCamera3dChangeReason; previous: ChartCamera3dState; state: ChartCamera3dState; scene: Scene; |
tooltipChartTooltipEvent | active: true; activeSubplotId: string; pointer: ChartZoomPointer; text: string; style: ChartTooltipStyle; values: ChartTooltipFormatterArgs; type: "tooltip"; source?: ChartTooltipSource; |
tooltipClearChartTooltipClearEvent | type: "tooltipClear"; source?: ChartTooltipSource; activeSubplotId?: string; pointer?: ChartZoomPointer; previous?: ChartTooltipState; |
crosshairChangeChartCrosshairChangeEvent | activeSubplotId: string; mode: ChartCrosshairMode; snap: ChartCrosshairSnap; xAxisId: string; yAxisId: string; xValue: number; yValue: number; xLabel: string; yLabel: string; defaultLabel: string; pointer: ChartZoomPointer; type: "crosshairChange"; source: ChartCrosshairSource; |
crosshairClearChartCrosshairClearEvent | type: "crosshairClear"; source: ChartCrosshairSource; previous: ChartCrosshairState; |
pointClickChartPointClickEvent | type: "pointClick"; activeSubplotId: string; pointer: ChartZoomPointer; values: ChartTooltipItem; |
pointSelectionChangeChartPointSelectionChangeEvent | type: "pointSelectionChange"; source: ChartPointSelectionSource; previous: ChartPointSelectionState; state: ChartPointSelectionState; scene: Scene; |
traceVisibilityChartTraceVisibilityEvent | traceCount: number; visibleTraceIndexes: number[]; hiddenTraceIndexes: number[]; type: "traceVisibility"; source: ChartTraceVisibilitySource; changedTraceIndexes: number[]; scene: Scene; |
dataUpdateChartDataUpdateEvent | type: "dataUpdate"; mode: ChartDataUpdateMode; traceIndexes: number[]; previousPointCounts: number[]; pointCounts: number[]; state?: ChartDataState; scene: Scene; |
chartStateChangeChartStateChangeEvent | type: "chartStateChange"; previous: ChartState; state: ChartState; scene: Scene; |
All instance methods
The published interface groups methods by purpose. Methods returning Scene | undefined may fail closed on unsupported or unchanged state; getters may return undefined when the relevant state does not exist.
| Group | Methods |
|---|---|
| Render and data | render, resize, updateOptions, setData, setTraces, setTraceData, appendData, getDataState, setDataState, getChartState, setChartState |
| Selection | getPointSelection, setPointSelection, clearPointSelection |
| Viewport | setViewport, zoom, zoomIn, zoomOut, pan, resetZoom, autoscale, getViewportControlState, getDragMode, setDragMode, getViewport |
| Polar and 3D | getPolarRotation, setPolarRotation, getCamera3d, setCamera3d, orbitCamera3d, dollyCamera3d, panCamera3d, resetCamera3d |
| Inspection and visibility | getTooltip, setTooltip, clearTooltip, getCrosshair, setCrosshair, clearCrosshair, getTraceVisibility, setTraceVisibility, setTraceVisibilityState, resetTraceVisibility |
| Events and cleanup | on, off, getScene, destroy |
Exact method signatures
This is the public 0.3.0 ChartInstance contract. Scene | undefined means a call may make no valid change; state getters can be undefined when the feature is unavailable or inactive. on() returns an unsubscribe function. Option shapes are described in the sections above and in the published package declarations.
type ChartInstance = {
render(): Scene;
resize(width: number, height: number): Scene;
updateOptions(options: Partial<ChartOptions>): Scene;
setData(data: DataPoint[]): Scene;
setTraces(traces: TraceInput[]): Scene;
setTraceData(traceIndex: number, data: DataPoint[]): Scene;
appendData(data: DataPoint[], options?: ChartAppendDataOptions): Scene | undefined;
getDataState(): ChartDataState | undefined;
setDataState(state: ChartDataState, options?: ChartDataStateUpdateOptions): Scene | undefined;
getChartState(): ChartState | undefined;
setChartState(state: ChartState, options?: ChartStateUpdateOptions): Scene | undefined;
getPointSelection(): ChartPointSelectionState | undefined;
setPointSelection(state: ChartPointSelectionState, options?: ChartPointSelectionUpdateOptions): Scene | undefined;
clearPointSelection(options?: ChartPointSelectionUpdateOptions): Scene | undefined;
setViewport(viewport: AxisViewportState | undefined, options?: ChartViewportUpdateOptions): Scene | undefined;
zoom(viewport: AxisViewportState, options?: ChartViewportUpdateOptions): Scene | undefined;
zoomIn(options?: ChartProgrammaticZoomOptions): Scene | undefined;
zoomOut(options?: ChartProgrammaticZoomOptions): Scene | undefined;
pan(options?: ChartProgrammaticPanOptions): Scene | undefined;
resetZoom(options?: ChartViewportScopeOptions): Scene | undefined;
autoscale(options?: ChartViewportScopeOptions): Scene | undefined;
getViewportControlState(options?: ChartViewportControlStateOptions): ChartViewportControlState;
getDragMode(): ChartDragMode;
setDragMode(mode: ChartDragMode): void;
getPolarRotation(): ChartPolarRotationState | undefined;
setPolarRotation(state: ChartPolarRotationState, options?: ChartPolarRotationUpdateOptions): Scene | undefined;
getCamera3d(subplotId?: string): ChartCamera3dState | undefined;
setCamera3d(state: ChartCamera3dState, options?: ChartCamera3dUpdateOptions): Scene | undefined;
orbitCamera3d(options?: ChartCamera3dOrbitOptions): Scene | undefined;
dollyCamera3d(options: ChartCamera3dDollyOptions): Scene | undefined;
panCamera3d(options?: ChartCamera3dPanOptions): Scene | undefined;
resetCamera3d(options?: ChartCamera3dUpdateOptions): Scene | undefined;
getTooltip(): ChartTooltipState | undefined;
setTooltip(target: ChartTooltipTarget, options?: ChartTooltipUpdateOptions): ChartTooltipState | undefined;
clearTooltip(options?: ChartTooltipUpdateOptions): void;
getCrosshair(): ChartCrosshairState | undefined;
setCrosshair(position: ChartCrosshairPosition, options?: ChartCrosshairUpdateOptions): ChartCrosshairState | undefined;
clearCrosshair(options?: ChartCrosshairUpdateOptions): void;
getTraceVisibility(): ChartTraceVisibilityState;
setTraceVisibility(traceIndexes: number | number[], visible: boolean, options?: ChartTraceVisibilityUpdateOptions): Scene | undefined;
setTraceVisibilityState(state: ChartTraceVisibilityState, options?: ChartTraceVisibilityUpdateOptions): Scene | undefined;
resetTraceVisibility(options?: ChartTraceVisibilityUpdateOptions): Scene | undefined;
on<Type extends ChartEventType>(type: Type, handler: ChartEventHandler<Type>): () => void;
off<Type extends ChartEventType>(type: Type, handler: ChartEventHandler<Type>): void;
getScene(): Scene | undefined;
getViewport(): AxisViewportState | undefined;
destroy(): void;
};
Browser, Node, and export
Browser charts need a real Canvas and DOM. The published TypeScript module supports engine: "ts" without extra initialization; auto selects an available compatible engine. Optional Node native and browser WASM engines use initNodePlotEngine/hasNodePlotEngine and initWasmPlotEngine/hasWasmPlotEngine/getWasmPlotEngineStatus/getLastWasmInitError. engine: "rust" requires an initialized compatible capability and fails if unavailable. Experimental 3D remains TypeScript-only for geometry.
import { plot, renderScene3dToSVG } from "fastplotjs";
const options = {
type: "scatter3d", engine: "ts", width: 640, height: 400,
data: [{ x: 0, y: 0, z: 0 }, { x: 1, y: 2, z: 1 }],
};
const scene = plot(options); // renderer-neutral primitives and 3D metadata
const svg = renderScene3dToSVG(options); // static SVG string
console.log(scene.primitives.length, svg.length);
renderScene3dToPNG(options) needs the optional native Node addon. It rejects unsupported chart types, dimensions, unavailable native capability, and raster failures with Scene3dNodePngExportError and a typed failure code. Real PNG output has been validated on Windows only; no browser PNG promise follows from the package API. renderToPNG(options) returns UTF-8 JSON scene bytes in a Uint8Array, despite its historical name; it is not a PNG file or general image export. Static exports omit pointer interaction, live camera controls, and hit-testing.
Other package-root exports serve advanced integrations: applyAxisViewportState, mergeAxisViewportState, resolveAxisBoxZoomInteractionPatch, resolveAxisPanInteractionPatch, resolveAxisZoomInteractionPatch, resolveInteractionBindingsFromPlotOptions, resolveSharedAxisInteractionPatch, and viewportStateToAxesOptions are low-level viewport helpers. DEFAULT_TRACE_COLORS is the default palette; getLastLineAxisLayoutDiagnostics is a diagnostic accessor. Scene3dWebgl2CapabilityError and Scene3dNodePngExportError expose typed capability/export failures. Use the chart-instance methods for ordinary browser navigation.
Supported combinations and limits
- Line, heatmap, and wonderplot support Cartesian viewport zoom/pan, subject to their configured axes and grid coordinates. Bar and polar axis zoom interactions and zoom helpers are no-ops; direct
setViewport()can still store state. Polar has its own rotation control. - Tooltip, click, crosshair, selection, and legend have family-specific geometry. Crosshair applies to line, bar, and wonderplot; persistent point selection to supported 2D marks, not experimental 3D.
- Scatter3D, Line3D, Surface, Mesh3D, and Pie3D are experimental. The first four have opt-in LOD with distinct budgets and can omit points, segments, cells, or faces. Returned rendered-item metadata does not provide every omitted source record.
- The proposed selected-area query returning original values, IDs, series, and decimated-away points is not implemented in 0.3.0.
For exact chart options and per-family examples, return to the chart reference or the live gallery.
