matplotlib/matplotlib · error · ValueError

Size mismatch between "values" and "edges". Expected `len(va

Error message

Size mismatch between "values" and "edges". Expected `len(values) + 1 == len(edges)`, but `len(values) = {self._values.size}` and `len(edges) = {self._edges.size}`.

What it means

StepPatch models values as bin heights and edges as bin boundaries (histogram semantics): it requires len(values) + 1 == len(edges), checked as _edges.size - 1 != _values.size. Passing edge counts that don't satisfy this raises the 'Size mismatch between "values" and "edges"' ValueError, both in the constructor and after set_data.

Source

Thrown at lib/matplotlib/patches.py:1149

            path is drawn.

        **kwargs
            `Patch` properties:

            %(Patch:kwdoc)s
        """
        self.orientation = orientation
        self._edges = np.asarray(edges)
        self._values = np.asarray(values)
        self._baseline = np.asarray(baseline) if baseline is not None else None
        self._update_path()
        super().__init__(self._path, **kwargs)

    def _update_path(self):
        if np.isnan(np.sum(self._edges)):
            raise ValueError('Nan values in "edges" are disallowed')
        if self._edges.size - 1 != self._values.size:
            raise ValueError('Size mismatch between "values" and "edges". '
                             "Expected `len(values) + 1 == len(edges)`, but "
                             f"`len(values) = {self._values.size}` and "
                             f"`len(edges) = {self._edges.size}`.")
        # Initializing with empty arrays allows supporting empty stairs.
        verts, codes = [np.empty((0, 2))], [np.empty(0, dtype=Path.code_type)]

        _nan_mask = np.isnan(self._values)
        if self._baseline is not None:
            _nan_mask |= np.isnan(self._baseline)
        for idx0, idx1 in cbook.contiguous_regions(~_nan_mask):
            x = np.repeat(self._edges[idx0:idx1+1], 2)
            y = np.repeat(self._values[idx0:idx1], 2)
            if self._baseline is None:
                y = np.concatenate([y[:1], y, y[-1:]])
            elif self._baseline.ndim == 0:  # single baseline value
                y = np.concatenate([[self._baseline], y, [self._baseline]])
            elif self._baseline.ndim == 1:  # baseline array
                base = np.repeat(self._baseline[idx0:idx1], 2)[::-1]

View on GitHub (pinned to b379c1b69e)

Solutions

  1. Provide one more edge than values: edges = np.arange(len(values) + 1) or edges = np.concatenate([[x[0] - 0.5], x + 0.5]).
  2. Reuse histogram machinery: _, edges = np.histogram(values_sample, bins=...) then pass those edges.
  3. If your x really are point positions, use ax.step(x, y) instead of StepPatch.
  4. Add an assertion before constructing: assert len(edges) == len(values) + 1.

Example fix

# before
sp = StepPatch(values=y, edges=x)  # len(x) == len(y) -> ValueError

# after
edges = np.concatenate([[x[0] - 0.5], x[:-1] + 0.5, [x[-1] + 0.5]])
sp = StepPatch(values=y, edges=edges)  # len(edges) == len(y) + 1
Defensive patterns

Strategy: validation

Validate before calling

import numpy as np

values = np.asarray(values)
edges = np.asarray(edges)
assert edges.size == values.size + 1, (
    f'need len(edges) == len(values) + 1, got {edges.size} vs {values.size}')
sp = patches.StepPatch(values, edges)

Prevention

When it happens

Trigger: StepPatch(y, edges=x) where x has the same length as y (point coordinates, not boundaries); using ax.plot(x, y)-style inputs; passing np.arange(len(y)) instead of np.arange(len(y) + 1); mixing up conventions with ax.step(x, y, where='pre') which uses equal-length arrays.

Common situations: Porting line/stair plots from ax.step (N edges) to StepPatch (N+1 edges); converting from plt.hist outputs (which already give N+1 bins — correct) versus hand-built arrays; half-open interval confusion when generating time-period boundaries.

Related errors


AI-assisted analysis of matplotlib/matplotlib@b379c1b69e (2026-08-21). Data as JSON: /api/errors/71d560851584e891. Report an issue: GitHub.