Choose Data and Measures
A chart answers a question about your report, such as sales by region. Row fields become categories; measures supply the numbers; column fields usually create separate series.
Start with a working chart. Use the chart’s Layout controls to choose fields and measures. Choose Data to check the exact numbers being drawn.
Try it: in Linked and frozen data, choose Toggle linked state, then Change source sales. A linked chart follows the Pivot report; a frozen chart keeps its captured values. Relink it to catch up with the report again.
Chart queries and totals
Compare a linked chart with a frozen snapshot as the Pivot changes, then relink it.
To choose fields in the built-in interface, open the workspace in the chart data-table example below, then use Layout. Choose row fields for categories, column fields for series, and the measures you want to plot. Use the example selector above to explore a chart-only query or totals separately.
Series and values-on-rows
Section titled “Series and values-on-rows”seriesIds selects a subset of dataset series. Types whose catalog definition
uses firstAvailable select one series even when the Pivot exposes several.
Types marked all retain the compatible series selection.
When the Pivot places values on rows, the category carries its measure.
categoryMeasure selects the required { prop, aggregator } pair without
rewriting row paths or pretending the measure is a column series.
const dataset = await charts.getChartData({ chartType: 'line', seriesIds: ['series:2026'], categoryMeasure: { prop: 'revenue', aggregator: 'sum', },});Totals
Section titled “Totals”totals accepts four modes:
| Mode | Included members |
|---|---|
none | Leaf and group members only. |
grand | Include grand totals. |
subtotals | Include subtotals. |
all | Include grand totals and subtotals. |
For a ready chart, include grand totals with:
await chart.update({ totals: 'grand' });The default is none. Totals keep their semantic member kind, so charts,
tooltips, data tables, drill logic, and persisted models can distinguish them
from ordinary categories. Totals select the generated members available in the
current Pivot scope; they do not enable totals disabled in the Pivot configuration.
At a semantic root, parent aggregates already represent the immediate members,
so selecting subtotals need not add separate row categories.
Give one chart its own layout and filters
Section titled “Give one chart its own layout and filters”A linked chart can author its own query without changing the shared Pivot
layout or adding a shared filter contribution. A query can select registered
row and column fields, select existing configured measures, add member filters,
sort categories, and rank immediate row members with Top/Bottom N.
await chart.update({ query: { slice: { rows: ['region'], columns: ['year'] }, filters: { status: ['Open'] }, topBottom: { direction: 'top', count: 5, measure: { prop: 'sales', aggregator: 'avg', valueIndex: 0 }, otherLabel: 'Other regions', }, },});
// Reset a linked chart to the current Pivot query.await chart.update({ query: {} });The fields and measure identities must exist in the committed Pivot
configuration. Use id or the original configured valueIndex when the same
source measure appears more than once. Queries cannot define new aggregators
or calculated measures.
query updates replace the whole object. Omit it to preserve its authored
settings; pass {} to reset a linked chart. Chart-local member filters
intersect inherited member selections and chart-owned shared filters, including
when both constrain the same field.
In chart-query member selections, null denotes both missing and null source
values, and signed zeros use the same member identity.
Top/Bottom N ranks the immediate children of the current row scope. Ranking uses the selected raw-measure aggregator within the requested column scope. Ties retain source order and missing scores rank last. Without an explicit sort, retained members follow ranking order and Other follows them.
Other contains the excluded source transactions, which are aggregated again by Pivot. This preserves averages, distinct counts, custom aggregators, and statistical samples. Ranking changes member presentation order while preserving source transaction order for custom aggregators and samples. It never adds displayed averages or distinct counts. Without Other, excluded members also leave the query’s totals; with Other, their transactions remain. Other is a synthetic member and cannot drill into fabricated children, filter the shared source, or identify a peer-chart member.
charts.getDataShapingCapabilities() reports current support and reasons.
Unsupported inherited ranking,
aggregate filters, or opaque filter execution fail with a reason instead of
discarding those constraints. Ranking or sorting by a calculated measure is
unsupported. Server queries require an opted-in complete-data provider.
The native query path conservatively rejects Advanced Filter and custom Core
filter evaluators, including when they appear inactive, because their public
state does not establish an exact source predicate for an isolated query.
Changing the slice layout resets chart drill and viewport state. A chart with an independent layout uses chart-local or application-controlled drill; Pivot-synchronized drill requires the shared layout. A sort preserves semantic viewport endpoints. Filtering and ranking retain valid scopes or fall back to a valid ancestor.
Unlinking freezes the shaped dataset and its descriptive query. Recalculating or resetting that query requires relinking to the source.
In the Layout tab, valid field, measure, sort, rank, and member-filter edits update automatically. Incomplete or invalid edits remain local with validation feedback. Drafts survive tab changes and earlier asynchronous acknowledgments. Reset query clears local and applied query settings. Series/binding and Pivot connection controls also apply immediately.
Fields already used on either axis cannot be added again. Independent layouts show a drill-synchronization hint and require Chart only or Application event for independent query edits. Calculated measures remain available for projection, while sort and ranking selectors disable them.
Member lookup searches and pages in batches of 50, retains selected raw values
across pages, cancels obsolete requests, and provides loading, empty, error, and
retry states. Labels and summaries use localeText.query.formatMemberValue;
formatting never changes the predicate’s raw value. Query status and recovery
text are customizable through localeText.query.description,
immediateChanges, independentLayoutSync, memberLoading, memberEmpty, and
retryMembers. UI policies can hide or disable
query.independentLayoutSync, query.memberStatus, query.retryMembers, and
controls.connectionHint, alongside the existing query and connection controls.
Follow live data or keep a snapshot
Section titled “Follow live data or keep a snapshot”A linked chart follows the current committed Pivot. Data, filters, sorting, group expansion, source, Pivot model, and relevant theme changes schedule coalesced refreshes.
Turning off Keep linked to Pivot stores the current bounded normalized
dataset in model.dataset. Later Pivot changes do not affect that chart.
Relinking removes the stored snapshot and projects the latest committed Pivot
state. Restore validates both linked models and embedded unlinked datasets.
The dialog’s context strip identifies the linked chart or saved snapshot, current category and series counts, totals policy, hierarchy, and available Pivot/chart member filters. It also states when additional provider or Pivot filters may apply; missing metadata is not treated as proof of an unfiltered source. Unlinked charts retain their captured source context.
The Data details button opens a separate popup with the current data size, link status, row and column hierarchy, totals policy, and member filters. Opening it leaves the plot size unchanged. Close it with Escape, the close button, or a click outside the popup.
Inspect the chart values in a table
Section titled “Inspect the chart values in a table”Chart data and axes
Inspect the chart's current data in the native table and switch back to the chart.
The header’s Data action replaces the plot with a read-only RevoGrid for the active drill frame. It:
- uses the same category order, series, and formatted display values as the chart;
- represents missing observations consistently;
- virtualizes rows and columns, supports selection and column resizing, and provides keyboard-operable sorting with sort announcements;
- does not alter the chart model, link state, Pivot, or drill state;
- switches back through Chart.
Scope and limits
Section titled “Scope and limits”getChartData can request the immediate children of a semantic parent:
const dataset = await charts.getChartData({ chartType: 'groupedColumn', totals: 'none', scope: { rowPath: ['Europe'], columnPath: [2026], },});Chart creation and getChartData() use default acquisition limits of 10,000
categories, 250 series, and 50,000 data points. The raw projector uses a
1,000-category default when no chart type is supplied. Plugin and chart-authored
limits override these defaults; see data limits and rendering
for precedence and rendering policies.
The plugin validates limits, actual counts, matrix dimensions, observations,
bindings, and chart compatibility. Unsafe projections fail with a
PivotChartError rather than silently changing persisted data.
Common mistakes
Section titled “Common mistakes”- A chart measure must already be available in the Pivot configuration; changing a label does not create a new calculation.
- Including totals does not enable totals disabled in the Pivot report, and can mix totals with their components. Include them only when that comparison makes sense.
- A chart-local filter changes one chart. Use filter interaction when the table or peers should change too.
Next steps
Section titled “Next steps”Continue with drill-down, chart types, or Pivot fields.