{"record":{"id":"f658884c941cab8f","repo":"matplotlib/matplotlib","slug":"axis-limits-cannot-be-nan-or-inf","errorCode":null,"errorMessage":"Axis limits cannot be NaN or Inf","messagePattern":"Axis limits cannot be NaN or Inf","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"lib/matplotlib/axes/_base.py","lineNumber":3844,"sourceCode":"        return tuple(self.viewLim.intervalx)\n\n    def _validate_converted_limits(self, limit, convert):\n        \"\"\"\n        Raise ValueError if converted limits are non-finite.\n\n        Note that this function also accepts None as a limit argument.\n\n        Returns\n        -------\n        The limit value after call to convert(), or None if limit is None.\n        \"\"\"\n        if limit is not None:\n            converted_limit = convert(limit)\n            if isinstance(converted_limit, np.ndarray):\n                converted_limit = converted_limit.squeeze()\n            if (isinstance(converted_limit, Real)\n                    and not np.isfinite(converted_limit)):\n                raise ValueError(\"Axis limits cannot be NaN or Inf\")\n            return converted_limit\n\n    def set_xlim(self, left=None, right=None, *, emit=True, auto=False,\n                 xmin=None, xmax=None):\n        \"\"\"\n        Set the x-axis view limits.\n\n        Parameters\n        ----------\n        left : float, optional\n            The left xlim in data coordinates. Passing *None* leaves the\n            limit unchanged.\n\n            The left and right xlims may also be passed as the tuple\n            (*left*, *right*) as the first positional argument (or as\n            the *left* keyword argument).\n\n            .. ACCEPTS: (left: float, right: float)","sourceCodeStart":3826,"sourceCodeEnd":3862,"githubUrl":"https://github.com/matplotlib/matplotlib/blob/b379c1b69e012b142c0f496a52bcb30513802d72/lib/matplotlib/axes/_base.py#L3826-L3862","documentation":"When view limits are set, matplotlib converts each limit to a number and rejects non-finite Real values (NaN, +Inf, -Inf), because such limits cannot define a usable view interval. Conversion (e.g. datetime to float) happens first, so only numeric results that are NaN or Inf after conversion raise this ValueError.","triggerScenarios":"ax.set_xlim(float('nan'), 1) or ax.set_ylim(np.inf, 5); most commonly limits computed from data: d.min()/d.max() on arrays containing NaN; 0/0 or x/0 producing inf/nan in limit arithmetic; limits taken from empty aggregates (np.min([]) -> nan with warning).","commonSituations":"Real-world datasets with missing values fed straight into limit computation; empty slices after filtering returning nan; unit conversions or scalings introducing inf; interactive apps computing limits from unvalidated user ranges.","solutions":["Use NaN-aware aggregates: ax.set_xlim(np.nanmin(d), np.nanmax(d)).","Filter invalid values before plotting: d = d[np.isfinite(d)].","Validate computed limits: if not np.isfinite(lo) or not np.isfinite(hi), fall back to ax.relim(); ax.autoscale_view() or sensible defaults."],"exampleFix":"# before\nax.set_xlim(d.min(), d.max())  # d contains NaN\n\n# after\nax.set_xlim(np.nanmin(d), np.nanmax(d))","handlingStrategy":"validation","validationCode":"import numpy as np\n\nlo, hi = compute_limits(data)\nif not (np.isfinite(lo) and np.isfinite(hi)):\n    lo, hi = np.nanmin(data), np.nanmax(data)  # or sensible defaults\nax.set_xlim(lo, hi)","typeGuard":null,"tryCatchPattern":"try:\n    ax.set_xlim(lo, hi)\nexcept ValueError as e:\n    if 'NaN or Inf' in str(e):\n        finite = values[np.isfinite(values)]\n        ax.set_xlim(finite.min(), finite.max())\n    else:\n        raise","preventionTips":["Use np.nanmin/np.nanmax instead of min/max on possibly-NaN data.","Filter arrays once: d = d[np.isfinite(d)] before plotting and computing limits.","Guard divisions used in limit math to avoid producing inf."],"tags":["matplotlib","limits","nan","inf","data-cleaning"],"backgroundTag":"nan-in-axis-limits","analyzedSha":"b379c1b69e012b142c0f496a52bcb30513802d72","analyzedAt":"2026-08-21T23:31:55.468Z","schemaVersion":2},"datasetVersion":"2026-08-22T04:17:13.399Z"}