How to Interpret a Residuals vs. Fitted Plot

A residuals vs. fitted plot is the single most useful diagnostic chart for checking whether your regression model is working properly. It plots your model’s prediction errors (residuals) on the vertical axis against the predicted values (fitted values) on the horizontal axis, and it can reveal three major problems at a glance: non-linearity, unequal variance, and outliers. Learning to read this plot takes about five minutes and will save you from trusting a model that quietly violates its own assumptions.

What the Plot Actually Shows

Every time your regression model makes a prediction, the residual is the gap between that prediction and the actual observed value. A positive residual means the model undershot; a negative one means it overshot. The residuals vs. fitted plot takes every one of these errors and graphs them against the corresponding predicted value, with a horizontal reference line at zero. Points sitting on that zero line are predictions your model nailed exactly.

The key insight is that if your model is correctly specified, these errors should look like random noise. There should be no relationship between how large the prediction is and how wrong it is. Any visible pattern in this plot is a signal that your model is missing something.

What a Healthy Plot Looks Like

A well-behaved residuals vs. fitted plot has three characteristics. First, the points bounce randomly above and below the zero line with no discernible shape. Second, the vertical spread of points stays roughly constant from left to right, forming a horizontal band. Third, no single point sits dramatically far from the rest of the cluster.

If your plot looks like a shapeless cloud of points centered on zero, roughly the same width everywhere, that’s exactly what you want. It means the linearity assumption holds, the error variance is stable, and there are no extreme outliers distorting your model. Many software tools also overlay a smooth curve (often colored red) that traces the average trend of the residuals. In a healthy plot, this curve hugs the zero line closely. Any bending or wandering away from zero is worth investigating.

Curved Patterns Signal Non-Linearity

The most common red flag is a U-shape or an inverted U-shape in the residuals. If you see the points dip below zero on the left, rise above zero in the middle, and dip again on the right (or the reverse), your model is trying to fit a straight line through a curved relationship. The residuals are systematically positive in some ranges and negative in others, which means the model is consistently over-predicting in one region and under-predicting in another.

This happens when the true relationship between your variables is curved but you’ve only included linear terms. The fix is usually straightforward: add a polynomial term (like a squared version of your predictor), use a different functional form, or apply a transformation to your predictor or outcome variable. A log transformation often works well when the relationship curves in a way that compresses at higher values. After making the change, re-check the plot. The curve should flatten out into the random scatter you’re looking for.

A Funnel Shape Means Unequal Variance

If the spread of residuals gets wider (or narrower) as the fitted values increase, you’re looking at unequal error variance, technically called heteroscedasticity. The classic version looks like a funnel or megaphone: residuals are tightly clustered on the left side of the plot and fan out on the right, or vice versa. This is especially common in data where the outcome variable naturally scales with its size, like income, sales revenue, or population counts. The bigger the value, the bigger the potential error.

This matters because standard regression assumes constant variance across all predictions. When that assumption breaks, your model’s coefficient estimates are still unbiased, but the standard errors become unreliable. That means your p-values and confidence intervals can’t be trusted, which is a serious problem if you’re using them to make decisions.

Common fixes include transforming the outcome variable (a log or square root transformation often stabilizes the variance) or using a technique called weighted least squares, which gives less influence to observations in the high-variance region. In some cases, particularly with count data or proportions, switching to a generalized linear model is the better approach. The right transformation depends on your data. A log transform tends to help when variance increases proportionally with the mean. A square root transform can work better for count data. Sometimes one transformation improves one problem while worsening another, so always re-check the diagnostic plot after making changes.

Outliers That Stand Apart

If one or a few points sit far away from the main cloud of residuals, they’re potential outliers. These are observations where the model’s prediction error is much larger than for the rest of the data. On the plot, they appear as isolated dots well above or below the horizontal band formed by the other residuals.

Not every outlier is a problem. A point might be far from the pack simply because of natural variability, especially in small datasets. But outliers can also signal data entry errors, measurement problems, or cases that genuinely don’t belong in the same model as the rest of your data. The concern grows when an outlier is also influential, meaning it’s pulling the entire regression line toward itself. You can investigate further with leverage and influence statistics (Cook’s distance is the standard tool), but the residuals vs. fitted plot is usually where you first spot that something looks off.

What This Plot Cannot Tell You

The residuals vs. fitted plot checks linearity, constant variance, and outliers, but it has a blind spot: it cannot reliably detect whether your errors are independent of each other. If your data has a time component (measurements taken in sequence) or a spatial component (measurements from nearby locations), correlated errors are a real risk. To check for that, you need to plot residuals against the time or spatial variable directly. A wave-like pattern or consistent runs of positive and negative residuals in that plot suggest your errors are correlated.

It also doesn’t directly assess whether your residuals follow a normal distribution. That’s the job of a Q-Q plot, which compares the distribution of your residuals to a theoretical normal distribution. In practice, the residuals vs. fitted plot and the Q-Q plot together cover the most important regression assumptions.

Reading the Plot in R and Python

In R, calling plot(model) on a linear model object produces four diagnostic plots, and the first one is the residuals vs. fitted plot. It labels the axes “Fitted values” and “Residuals” and overlays a red smoothed curve. If that curve bends noticeably away from the dashed zero line, investigate further.

In Python, the statsmodels library provides similar diagnostics. You can generate the plot using the plot_regress_exog function or by manually plotting model.resid against model.fittedvalues with matplotlib or seaborn. Seaborn’s residplot function is a quick alternative that includes an optional LOWESS smoother, which serves the same purpose as R’s red curve. Regardless of which tool you use, you’re looking for the same three things: random scatter, constant spread, and no extreme points.

A Quick Checklist for Your Plot

  • Random scatter around zero: Points should bounce above and below the zero line with no curve, wave, or trend. If you see a pattern, your model is missing a structural relationship in the data.
  • Constant vertical spread: The band of residuals should stay roughly the same width across all fitted values. A widening or narrowing funnel means the variance isn’t stable.
  • No extreme isolated points: Look for dots that sit far from the rest of the cloud. Investigate these individually to determine if they’re data errors, special cases, or genuinely influential observations.
  • Smoother line near zero: If your software overlays a trend curve, it should track close to the horizontal zero line. Deviations indicate systematic patterns the model isn’t capturing.