DreamLake
Browse docs

Parallel coordinates

Compare experiment settings and outcomes in one plot. Each line is a run; its axes can mix continuous values such as learning rate with categories such as optimizer.

Experiment selection and table linkage

Select a line, button, or table checkbox below. They share selected experiment IDs, which also survive hiding an axis.

Visible dimensions
Training sweep · 6 experiments0 / 6 selected

Gaps mean missing or unplottable values. Hover a trace or focus an experiment for its values.

0 selected · 6 shown
SelectExperimentLearning rateBatch sizeHidden unitsOptimizerEval score
run-a1.0e-364256AdamW84
run-b2.0e-4128512Adam93
run-c8.0e-332128SGD65
run-d4.0e-3256384AdamW78
run-e5.0e-464MissingAdam89
run-f2.0e-3128192SGD72

Synthetic data. run-e has no recorded hidden-unit value: its trace breaks at that axis. Axis visibility and table filtering preserve selection. Each row checkbox works with the keyboard.

Code ExperimentComparisonSpec.tsx

The example implements “Select top 2” and table filtering outside the chart. Reuse the reported IDs for your own table or detail view.

Data and controlled state

Define axes in display order and key each run's values by axis ID:

tsx
const axes: ParallelCoordinatesAxis[] = [
  { id: 'rate', label: 'Learning rate', type: 'continuous' },
  { id: 'optimizer', label: 'Optimizer', type: 'categorical', categories: ['SGD', 'Adam'] },
  { id: 'score', label: 'Score', type: 'continuous', domain: [0, 100] },
]
const experiments = [{
  id: 'run-a', label: 'Run A',
  values: { rate: 0.001, optimizer: 'Adam', score: 89 },
}]
const [selectedIds, setSelectedIds] = useState<string[]>([])

<ParallelCoordinates
  axes={axes} series={experiments}
  selectedIds={selectedIds} onSelectionChange={setSelectedIds}
/>

Keep axis and experiment IDs unique and stable. Continuous values must be numbers; convert numeric strings before rendering. Categorical values follow categories from bottom to top.

Axes and missing values

Continuous axes fit finite data with readable ticks. Set a finite, increasing domain for a fixed scale. Invalid domains fall back to automatic fitting; constant and empty data still receive a finite range.

Missing or non-finite values, unknown categories, and values outside a fixed domain break the trace. A lone valid value appears as a point. Experiment buttons retain the values in accessible text.

Wire both selectedIds and onSelectionChange to apply selection changes. Without the callback, selection is read-only. visibleAxisIds filters the axes without changing their declared order.

Props

PropTypeDefaultPurpose
axesreadonly ParallelCoordinatesAxis[]requiredAxes in display order.
seriesreadonly ParallelCoordinatesSeries[]requiredExperiments with stable IDs, labels, values, and optional CSS colors.
selectedIdsreadonly string[][]Selected experiment IDs.
onSelectionChange(ids: string[]) => void—Receive the requested selection.
visibleAxisIdsreadonly string[]all axesAxes to display, in axes order.
titlestring'Experiment comparison'Visible and accessible chart name.
classNamestring—Root CSS classes.

Use at least two visible axes. The plot scrolls horizontally when needed; brushing and axis-reordering controls are not included. Start with a small comparison set.