> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trainy.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Bar Charts

> Roll up sibling scalars into categorical {bars} distributions.

Categorical **`{bars}`** rollups let you compare many related scalars — per-class accuracy, per-shard throughput, per-expert load — as a single distribution instead of dozens of overlapping line charts.

## Producing bar charts

Log **three or more sibling scalars under a common prefix** and Pluto automatically offers that prefix as a `{bars}` rollup — no special SDK call needed:

```python theme={null}
# Per-class accuracy under the "eval/per_class" prefix
pluto.log({
    "eval/per_class/cat":  0.91,
    "eval/per_class/dog":  0.88,
    "eval/per_class/bird": 0.79,
}, step=epoch)
```

Pluto detects the `eval/per_class` prefix and surfaces it as `eval/per_class/{bars}`. If you control the SDK and want true binned distributions, [`pluto.Histogram`](/pluto/visualizations/histograms) is the richer option.

## Viewing

Bar charts live in the **Distributions** widget alongside numeric [histograms](/pluto/visualizations/histograms). To add one, open **Add Widget**, choose the **Distributions** tab, and search for your `<prefix>/{bars}` group.

<img src="https://mintcdn.com/trainy/ck7WI5896eYTYADa/images/pluto/distributions-add-widget.png?fit=max&auto=format&n=ck7WI5896eYTYADa&q=85&s=905eb4f6cc0d751b1e97ba726d9aca6c" alt="Adding a Distributions widget from the Add Widget modal" width="1352" height="1656" data-path="images/pluto/distributions-add-widget.png" />

### View modes

Each widget renders in one of three modes.

**Step** — a bar chart at the scrubbed step, bars sorted by global max value. Use the step slider below the widget to scrub through training.

<img src="https://mintcdn.com/trainy/ck7WI5896eYTYADa/images/pluto/bars-step.png?fit=max&auto=format&n=ck7WI5896eYTYADa&q=85&s=7ef6fcd72489aa8fd408a7dffbdf165f" alt="Bar chart in Step mode — one bar per category at a single step" width="2090" height="736" data-path="images/pluto/bars-step.png" />

**Ridgeline** — TensorBoard-style joyplots, one ridge per step, so you can watch each category's value evolve over training.

<img src="https://mintcdn.com/trainy/ck7WI5896eYTYADa/images/pluto/bars-ridgeline.png?fit=max&auto=format&n=ck7WI5896eYTYADa&q=85&s=6f7d42267a8e00ba75e7317e54b3b08b" alt="Bar chart in Ridgeline mode — one ridge per step" width="2090" height="736" data-path="images/pluto/bars-ridgeline.png" />

**Heatmap** — a density grid: value as color, category on the X axis and step on the Y axis.

<img src="https://mintcdn.com/trainy/ck7WI5896eYTYADa/images/pluto/bars-heatmap.png?fit=max&auto=format&n=ck7WI5896eYTYADa&q=85&s=1081fea4198eb0f04c7323989b3e197b" alt="Bar chart in Heatmap mode — value as color" width="2090" height="736" data-path="images/pluto/bars-heatmap.png" />

A **`Y: step` / `Y: run`** toggle switches whether ridges and heatmap rows are stacked by step or by run.

### Steps on X

In Ridgeline and Heatmap modes, the **Steps on X** toggle transposes the chart so training steps run along the X axis and categories stack down the Y axis. A `{bars}` heatmap aligns its X range with the line chart above it, so a metric and its distribution read as one coordinated view across time.

<img src="https://mintcdn.com/trainy/ck7WI5896eYTYADa/images/pluto/bars-ridgeline-stepsx.png?fit=max&auto=format&n=ck7WI5896eYTYADa&q=85&s=ceb593dcb97e78fa0f992110da8fbf3d" alt="Bar-chart ridgeline with Steps on X — steps run along the X axis" width="2090" height="736" data-path="images/pluto/bars-ridgeline-stepsx.png" />

The same transpose applies in Heatmap mode:

<img src="https://mintcdn.com/trainy/ck7WI5896eYTYADa/images/pluto/bars-heatmap-stepsx.png?fit=max&auto=format&n=ck7WI5896eYTYADa&q=85&s=ad2f50dbf61f4538112a802986b5e798" alt="Bar-chart heatmap with Steps on X" width="2090" height="736" data-path="images/pluto/bars-heatmap-stepsx.png" />

### Settings

The settings popover has an **Ignore outliers** toggle (on by default) that clamps the shared frequency scale so one extreme step doesn't flatten the rest into a baseline. It's inert in **Step** mode, where the axis auto-scales to the current snapshot.
