Radar metric axes and grid
radarLine and radarArea share configurable metric axes in standalone Charts
and Pivot. A dataset category is one metric/spoke; dataset series are the
profiles compared on those metrics. Category IDs identify overrides independently
of source-array order and displayed labels.
const dataset = createChartDataset(rows, mapping);const latencyId = dataset.categories[0].id;const chart = await createChart({ container, chartType: 'radarArea', dataset, chartOptions: { radarDomain: 'metric', radarDivisions: 5, radarGridShape: 'polygon', radarReverse: true, radarValues: true, startAngle: 0, }, axes: { radar: { value: { min: 0, max: 100, tickCount: 5 }, metrics: { [latencyId]: { min: 1, max: 1000, scale: 'log', reverse: true, title: 'Latency', unit: 'ms', tickValues: [1, 10, 100, 1000] }, }, stripeColors: ['#f3f4f6', '#ffffff'], labelOrientation: 'radial', } },});Saved appearance options
Section titled “Saved appearance options”chartOptions field | Omitted/editor default | Accepted values and meaning |
|---|---|---|
radarDomain | 'shared' | 'shared' infers a common domain across displayed metrics/profiles; 'metric' infers each metric’s domain from its displayed profile values. Authored common/metric bounds take precedence. |
radarDivisions | 4 | Integer 1–20; normalized radial grid bands. |
radarGridShape | 'circular' | 'circular' or 'polygon'; polygon corners follow metric directions. |
radarReverse | false | Counterclockwise projection when true, retaining canonical category order. |
radarValues | false | Numeric tick marks and formatted values on the metric spokes. |
startAngle | -90 | Integer -360–360 degrees; zero points right, -90 points up. |
These controls appear in Pivot Customize → Appearance. Their normal reset
controls remove authored values. startAngle is also used by pie charts, with
each chart family’s own defaults.
axes.radar
Section titled “axes.radar”| Field | Default and contract |
|---|---|
value | Optional ChartRadarValueAxis defaults inherited by every metric. |
metrics | Optional record of category ID → ChartRadarValueAxis. Up to 1,000 nonempty IDs of at most 32,768 characters. Unknown/not-yet-loaded category IDs remain dormant. |
gridColor | Resolved theme grid color; validated chart color for ring/spoke defaults. |
stripeColors | Empty by default; up to 32 validated colors repeated over grid bands, from the center outward. These are static saved colors. |
showRings | true; hides ring outlines when false. Authored stripe fills remain. |
showSpokes | true; hides metric spoke lines when false. Numeric ticks remain independently controlled by radarValues. |
showLabels | true; shows category/metric labels independently of numeric values. |
labelOffset | 14 SVG pixels beyond the fitted radius; accepts finite 0–100. |
labelOrientation | 'horizontal', 'radial' or 'tangential'; horizontal by default. Rotated labels flip on the left side to remain upright. |
ChartRadarValueAxis reuses the numeric-axis contract, excluding Cartesian
position. Its fields are:
scale:'linear','log','symlog'or'sqrt'(linear by default).constant: positive finite symlog transition constant; default1.min,max: finite raw bounds, increasing when both are authored. Log bounds and every displayed log observation must be positive.reverse: reverses the metric’s radial projection while semantic bounds remain increasing. It is separate fromradarReverse, which reverses metric angles.title,titleColor: override the metric category label and its color.unit,tickFormat: shared numeric tick formatting.tickFormatacceptsnotation(standard,compact,scientific) and minimum/maximum fraction digits under the ordinary numeric-axis bounds.tickCount,tickValues,tickMinStep,tickMaxStep,tickSpacing: ordinary bounded numeric tick policies, including exact raw positions and pixel spacing.tickCountis an integer from 2 to 1,000; exact values are unique finite numbers with at most 1,000 entries. Step/spacing values are positive and finite.lineColor,labelColor: metric spoke/tick color and numeric value-label color. Renderer label/element customizations retain their normal precedence.
Metric fields override common fields individually. A metric that explicitly changes scale away from symlog drops the inherited symlog constant. Other inherited fields remain active: for example, a log metric inheriting a common zero minimum needs its own positive minimum. Combined inherited domains and scale/constant settings must remain valid. Clearing a metric field resumes its common default; clearing a common field resumes automatic inference.
Values, clipping and compatibility
Section titled “Values, clipping and compatibility”With every new radar option and axes.radar omitted, the old global positive
maximum, four circular rings and original markup/geometry remain. Legacy radar
inputs still reject negative values and omit zero-value markers.
An explicit axes.radar (including {}), or any authored radar option from the
table above, enables the configurable-axis path. It accepts finite zero/signed
values for linear/symlog/sqrt scales. Automatic linear-family domains include
zero and the displayed raw extrema; shared mode uses all displayed metrics and
metric mode uses only that metric. Degenerate/empty domains expand through the
shared numeric-domain owner. Explicit bounds retain authority, and extreme
finite domains use the shared overflow-safe coordinate transform.
Values outside authored domains are projected onto the nearest radial boundary. This changes geometry, never raw data, counts, source IDs or activation values. Nulls remain center corners in the polygon and do not create markers, labels or click/drill records. Subtotals/grand totals do not become metric spokes or affect domains. Hidden profile measures do not contribute to domain inference.
Grid bands represent equal fractions of transformed radial distance. They are not fixed raw-value intervals when axes have different domains or nonlinear scales. Numeric ticks use each metric’s own transform, unit and formatting. Center value labels are omitted to avoid overlapping labels at the common origin. Category labels and numeric labels retain normal layout/density limits; many metrics/ticks can still require application-level simplification.
unit formats axis values. Tooltips, data labels and CSV retain the dataset’s
ordinary raw/formatted source values; use the existing formatter APIs when
different source display text is required. Numeric label customization contexts
use axisId: 'radar' and the metric category descriptor, with no Cartesian
physical-axis orientation. Rotation and domain reversal do not reorder keyboard
targets or fabricate records.
All settings persist in models and work with SVG server rendering, in-place hydration, normal resize, saved restoration and SVG/image/PDF export. Invalid fields or incompatible inherited axes reject atomically. Inference describes the committed displayed dataset; it does not infer global statistics from unrequested provider rows. Ordinary minimum category requirements remain in force.
Pivot metric editing
Section titled “Pivot metric editing”In Customize → Axes and scales, enable Configure radar axes. Choose
Common metric defaults or one Radar metric, then use the shared scale,
minimum/maximum, reversal, unit, title and tick controls. Metric values inherit
common defaults. Cartesian position controls are omitted. Reset radar axes
removes axes.radar; appearance options reset separately. Signed data still needs
an explicit configurable-axis setting, so removing its last opt-in can reject
until the data/configuration is compatible.
The gallery enables axes.radar: {} when selecting a radar for signed data.
Switching between radar line/area retains axes; unrelated chart types prune
radar-specific axes/options. The adapter shares the Charts renderer and
optimistic axis editor, with no Pivot-specific geometry implementation.
Public aliases are PivotChartRadarAxes and PivotChartRadarValueAxis.
Appearance fields use ordinary chartOptions.<field> policy IDs. Axis policies
include axes.radar.enabled, axes.radar, axes.radar.metricSelector,
axes.radar.value.*, axes.radar.metric.* and axes.radar.reset.
Localize captions with localeText.chartOptions.radarAxes, radarEnable,
radarCommon, radarMetric, radarReset, and the normal option
labels/descriptions. selectValues['radarDomain.shared'] supplies the scoped
shared-domain caption; field-specific select captions take precedence over
generic value captions.
This adds radar metric axes and grid authoring. General polar/radial-bar axis collections, angular/radial brushing and zoom, radar area/axis hover modes, striping callbacks and animation remain separate capabilities. The official MUI radar reference describes the related metric-domain and grid controls; the contracts above belong to this shared engine.