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
- Provide one more edge than values: edges = np.arange(len(values) + 1) or edges = np.concatenate([[x[0] - 0.5], x + 0.5]).
- Reuse histogram machinery: _, edges = np.histogram(values_sample, bins=...) then pass those edges.
- If your x really are point positions, use ax.step(x, y) instead of StepPatch.
- 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
- Remember StepPatch uses histogram semantics: N values need N+1 edges.
- Prefer generating edges from values than passing paired x arrays from line plots.
- Add an assert at the boundary so mismatches surface with your own message.
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
- Nan values in "edges" are disallowed
- Invalid `baseline` specified
- Must set *values*, *edges* or *baseline*.
- {key} must not be an empty sequence
- lineoffsets and positions are unequal sized sequences
AI-assisted analysis of matplotlib/matplotlib@b379c1b69e (2026-08-21).
Data as JSON: /api/errors/71d560851584e891.
Report an issue: GitHub.