Skip to content

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.

Interactive example

Chart queries and totals

Compare a linked chart with a frozen snapshot as the Pivot changes, then relink it.

The example loads when visible.

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.

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 accepts four modes:

ModeIncluded members
noneLeaf and group members only.
grandInclude grand totals.
subtotalsInclude subtotals.
allInclude 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.

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.

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.

Interactive example

Chart data and axes

Inspect the chart's current data in the native table and switch back to the chart.

The example loads when visible.

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.

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.

  • 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.

Continue with drill-down, chart types, or Pivot fields.