Skip to main content
LiveChartSeries draws multiple line series that share an axis, time window, and crosshair. Pass a SharedValue<SeriesConfig[]>.
Live example: app/demo/multi-series.tsx in the example app.

Multiple live series with a toggleable legend

Update the series the same way you feed a single chart — append points in place with series.modify(...) (mutating each entry’s data array and value), or replace the whole array with series.set(...). Avoid series.value = ....

Series options

Each SeriesConfig supports: Set line={{ simplify: 1 }} on LiveChartSeries to denoise every rendered path by roughly one screen pixel. A series can choose a different tolerance, or set simplify: 0 to keep its exact point path. The shared axis, scrub values, and live dots continue to use the original series data.

Dimming replacement data

For a timeframe change, retain the current series while the next range loads, then set one UI-thread opacity multiplier for every plotted series:
The multiplier covers strokes, value lines, and inline value labels. It does not dim axes, the legend, reference lines, or scrub UI. Live dots and pulse rings fade completely out while the multiplier is below 1, then fade back in after the plotted series returns to full opacity.

Legend

The legend renders toggle chips by default. Configure it with the legend prop, and listen for taps with onSeriesToggle:

Per-series dots

The dot prop controls the live dots, their pulse, optional static glow, value lines, and inline labels. Each dot has a crisp contrasting outer ring (in the chart background color) by default, matching the single-series live dot so overlapping series stay legible. The soft glow remains opt-in:
Tune or turn off the backing ring, tune the independent glow, hide the dots, or override the fill color:
See the full prop list in the LiveChartSeries reference.

Per-series scrub tooltip

LiveChartSeries keeps its historical guide-only scrub by default. Opt into the Morfi market-detail readout with scrub.seriesTooltip: a dashed vertical guide, a top-centred bucket range, and one pill plus intersection dot for every visible series. Close values stack instead of overlapping, wide pills flip to the guide’s left near the right edge, and hidden legend series are omitted.
This feature is opt-in and backward compatible. scrub={true}, scrub={{}}, and scrub={{ seriesTooltip: false }} all keep the existing guide-only multi-series behavior. The existing scrub.tooltip property is still the master switch; setting it to false also suppresses the per-series pills.
Enable the default tooltip treatment with:
Pass an object instead of true to customize formatting and appearance:
formatSeriesValue and formatTimeRange run on the UI thread; keep them worklet-safe, just like the chart’s formatValue and formatTime. Omit bucketSeconds to infer the range width from the first visible series. The range end is always clamped to the chart’s current-time anchor, so an in-progress live bucket never displays a future end time. Set alwaysShow to keep the value pills at the visible endpoints while the user is not touching the chart. Idle mode deliberately hides the guide and time pill; scrubbing restores the full readout.
The multi-series demo has live toggles for the pills, pinned mode, and styling.