Data Limits and Rendering
Start with the defaults. Tune limits only when a real report is rejected or too crowded to read. A limit caps accepted data; scrolling and sampling determine how accepted data is displayed.
Try it: compare a dense chart with its data table and CSV. Check the reduction notice before interpreting a displayed Top N as the complete source. See exports for the difference between images and data.
Data acquisition limits and rendering policies solve different problems. Limits bound the dataset Pivot Charts accepts; scrolling, sampling and label layout control how an accepted dataset is drawn. A cache changes neither boundary.
Dense-data behavior
Section titled “Dense-data behavior”Defaults are:
const DEFAULT_PIVOT_CHART_LIMITS = { maxCategories: 1_000, maxSeries: 250, maxDataPoints: 50_000,};Chart requests use a 10,000-category acquisition default instead. Categorical charts without scrolling automatically choose a Top N from chart type and available area, plus a synthetic Others group, recalculated from source records. The chart explains the reduction. Ordered, relationship and statistical charts keep their own rendering policies. The built-in renderer automatically shows a native scrollbar when categories no longer fit: horizontal for columns, vertical for bars. It draws only the visible category window and keeps the value axis based on all categories. Scrolling preserves datum identities; CSV/data exports retain the full dataset, and images capture the visible plot. Scroll position is local display state, not persisted chart-model state. The raw projector retains the defaults above when no chart type is supplied.
Effective limits apply in this order: built-in defaults, plugin limits, then
chart-authored limits. The chart model stores only authored overrides, so
omitted keys inherit the current plugin configuration on later operations.
const chart = await charts.createChart({ container, limits: { maxCategories: 2_000, maxDataPoints: 100_000 },});await chart.update({ limits: { maxCategories: 3_000 } }); // replace overridesawait chart.update({ limits: {} }); // inherit plugin limits againA limits update replaces the authored object; undefined leaves it unchanged.
Values must be finite and at least 1, and are rounded down to safe integers.
Unknown keys and non-plain objects are rejected. Limits are budgets, not data
transformations: exceeding one reports LIMIT_EXCEEDED and retains the prior
chart. A limits-only update validates the current frame before requesting data;
a combined selection update validates the newly selected frame. Unlinked charts
validate their captured data without requiring an active Pivot.
Matrix points count every category/series cell, including null cells. Statistical
payloads have a separate point budget: raw sample counts, or one summary plus its
outlier and density entries. Both budgets must fit maxDataPoints; they are not
added together. Providers receive the effective limits for root, refresh, and
drill requests. The plugin validates returned payloads before caching/rendering.
Within those limits, the renderer degrades deliberately:
- every legend position reserves a valid plot rectangle;
- long legends show a deterministic subset and localized hidden count;
- category ticks and data labels are thinned without removing data;
- final text layout measures localized and customized fonts, fits long names with ellipses and full hover captions, and omits labels that cannot fit without overlapping another label. Numeric data labels are omitted rather than shortened;
- Cartesian marks retain exact values;
- density scatter, histograms, strip plots, and large heatmaps can aggregate observations into rendered bins; those bins expose inspection descriptions without claiming an individual observation’s selection or drill identity;
- unstacked line/area families, combination line/area layers, annotated time series, and small multiples sample dense paths while retaining real source points, extrema, and separate finite runs;
- charts with more than 240 rendered inspection targets use one Tab stop with arrow-key navigation. Dense canonical marks remain reachable; source matrix dimensions alone do not determine the keyboard policy.
Sampling affects rendered geometry, not the persisted normalized dataset. Exceeding configured projection limits fails rather than silently truncating the model.
KPI, gauge and progress-gauge views limit visible tiles to the container’s readable capacity. A localized sampling footer and accessible description report the source and rendered row counts. Resizing recalculates the capacity; View data and exports retain the complete dataset. The card itself remains an inspection target even when its optional text cannot fit.
Bounded paths and data tables
Section titled “Bounded paths and data tables”Rendering dense charts
Explore a large category set with scrolling, bounded labels, and keyboard inspection.
Sampled SVG paths share a chart-wide budget of at most 4,800 canonical point marks. Each series also has a pixel-based budget and its family’s existing cap. Sampling retains actual first, minimum, maximum, and last points in each retained bucket in source order when the allocated budget can represent them. Null values split paths before sampling. When there are more finite runs than the budget can represent, the renderer keeps a bounded set of separate runs and reports omitted observations; it never draws a line across an omitted gap.
Sampling changes drawing work. Canonical values, scale domains, saved data, supported semantic annotations, and shared crosshair lookup remain complete. Localized chart descriptions report the source and rendered counts. Column rectangles and stacked/normalized geometry retain their complete visible cells, so their DOM cost still grows with the dataset. Projection limits remain the safety boundary for those families.
View data uses RevoGrid’s native row and column virtualization, keeping every canonical cell reachable by scrolling. Sorting applies to the complete frame, with stable ties and null values last in both directions. The grid is read-only; selection and column resizing remain available.
For remote acquisition, choose complete frames or the explicit viewport contract. Raising a drawing budget does not make a partial server frame complete.
Next steps
Section titled “Next steps”See your first chart, data and measures and the API reference.