How to Graph a Bell Curve in Excel, Sheets, or Python

Graphing a bell curve requires just three things: a range of x-values, a formula that calculates the height of the curve at each point, and a smooth line chart to connect them. Whether you’re working in Excel, Google Sheets, or Python, the process follows the same logic: generate evenly spaced points along your x-axis, calculate the probability density for each point, and plot the results.

The Core Idea Behind the Curve

A bell curve is a visual representation of the normal distribution. Its shape is controlled by two numbers: the mean (the center of the curve) and the standard deviation (how wide or narrow it spreads). The mean determines where the peak sits on the x-axis, while a larger standard deviation flattens and widens the curve, and a smaller one makes it tall and narrow.

The 68-95-99.7 rule gives you a quick way to understand the spread. About 68% of values fall within one standard deviation of the mean, 95% within two, and 99.7% within three. This is why, when setting up your x-axis, you should extend it at least three standard deviations in each direction from the mean. That captures virtually the entire curve and avoids cutting off the tails.

Setting Up Your X-Values

Before you open any software, decide on your mean and standard deviation. If you’re plotting a standard normal distribution, use a mean of 0 and a standard deviation of 1. If you’re working with real data, calculate both from your dataset.

Create a column of x-values that spans from three standard deviations below your mean to three standard deviations above it. For a standard normal curve, that’s -3 to 3. For a dataset with a mean of 50 and a standard deviation of 10, you’d go from 20 to 80. Space the points evenly, using increments small enough to produce a smooth curve. Around 40 to 100 points works well for most graphs. Fewer than 20 will make the curve look jagged.

How to Graph a Bell Curve in Excel

Excel has a built-in function called NORM.DIST that does the heavy lifting. Here’s how to use it step by step.

In column A, enter your x-values. If you’re using a mean of 0 and standard deviation of 1, start at -3 in cell A2 and increment by 0.1 or 0.2 down the column. You can type the first two values, select both cells, and drag the fill handle down to auto-populate.

In column B, use the formula =NORM.DIST(A2, mean, standard_deviation, FALSE). Replace “mean” and “standard_deviation” with your actual numbers or cell references. For a standard normal curve, that’s =NORM.DIST(A2, 0, 1, FALSE). The FALSE at the end is important: it tells Excel to return the probability density (the height of the curve) rather than the cumulative probability. Copy this formula down column B for every x-value.

Select both columns, go to Insert, and choose a Scatter chart. Pick the subtype labeled “Scatter with Smooth Lines” (or “Scatter with Smooth Lines without Markers” for a cleaner look). Excel will plot your bell curve immediately. Label the x-axis with your variable name and the y-axis as “Probability Density” to follow graphing conventions.

Using Your Own Dataset

If you’re overlaying a bell curve on real data, first calculate the mean and standard deviation of your dataset using =AVERAGE() and =STDEV.S(). Use those values in your NORM.DIST formula. You can plot a histogram of your raw data and add the bell curve as a second data series on the same chart, using a secondary axis so the scales align.

How to Graph a Bell Curve in Google Sheets

Google Sheets uses the same NORMDIST function with slightly different syntax. Set up column A with your x-values the same way you would in Excel. In column B, enter =NORMDIST(A2, mean, standard_deviation, FALSE) and copy it down.

Highlight both columns, click Insert, then Chart. Google Sheets will often default to a bar or line chart. In the Chart Editor panel on the right, change the Chart Type to a Smooth Line Chart. If the curve looks blocky, increase the number of x-values in your column. Around 80 evenly spaced points from -3σ to +3σ produces a clean result.

How to Graph a Bell Curve in Python

Python gives you the most control and requires the least manual setup. You need three libraries: NumPy for generating x-values, SciPy for the probability density function, and Matplotlib for plotting.

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

x = np.linspace(-4, 4, 1000)
plt.plot(x, norm.pdf(x), 'b-', label='Normal Distribution')
plt.xlabel('X')
plt.ylabel('Probability Density')
plt.legend()
plt.grid(True)
plt.show()

This code generates 1,000 evenly spaced points between -4 and 4, calculates the standard normal density at each one, and plots a smooth blue line. To use a different mean and standard deviation, pass them to norm.pdf(x, loc=mean, scale=std_dev). For example, norm.pdf(x, loc=50, scale=10) centers the curve at 50 with a spread of 10. You’ll also want to adjust the np.linspace range to match (something like 20 to 80 for that example).

To compare multiple distributions on the same plot, call plt.plot() multiple times with different parameters before calling plt.show(). This is useful for visualizing how changing the standard deviation affects the curve’s shape.

Labeling Your Graph Correctly

A well-labeled bell curve needs three things: a descriptive title, a labeled x-axis showing the variable and its units, and a y-axis labeled “Probability Density.” The y-axis does not represent percentages or counts. It represents density, which is why the peak of a standard normal curve tops out at about 0.4 rather than 1.0.

If you’re presenting the graph in a report or class, mark the mean on the x-axis and consider adding vertical reference lines at one, two, and three standard deviations. This makes the 68-95-99.7 rule visible at a glance and helps your audience interpret the spread.

Z-Scores and the Standard Normal Curve

When your x-axis shows z-scores instead of raw values, you’re plotting the standard normal distribution (mean of 0, standard deviation of 1). A z-score tells you how many standard deviations a value sits from the mean. A z-score of 1.5 means that value is 1.5 standard deviations above the mean; a z-score of -2 means two standard deviations below.

To convert raw data to z-scores, subtract the mean from each value and divide by the standard deviation. This standardization lets you compare values from completely different datasets on the same scale. Once converted, every dataset plots onto the same standard bell curve, which is what makes z-scores so useful for comparison.

When the Curve Doesn’t Look Right

If your bell curve looks lopsided, choppy, or flat-topped, the issue usually falls into one of a few categories.

  • Too few data points: Fewer than 20 x-values will make the curve look angular instead of smooth. Increase to at least 50 points for a clean shape.
  • X-axis range too narrow or too wide: If you only extend one standard deviation from the mean, you’ll cut off the tails. If you extend ten standard deviations out, the curve will appear as a tiny spike in the center with vast empty space on either side. Three standard deviations in each direction is the sweet spot.
  • Wrong chart type: A bar chart or basic line chart with straight segments won’t produce the smooth curve you expect. Use a scatter plot with smoothed lines in Excel, a smooth line chart in Google Sheets, or a standard line plot in Python (which smooths automatically with enough data points).
  • Cumulative instead of density: If your curve looks like an S-shape rising from 0 to 1, you’ve accidentally plotted the cumulative distribution function. In Excel and Google Sheets, make sure the last argument in NORM.DIST is FALSE.

Skewness and Kurtosis Change the Shape

A perfect bell curve is symmetric with a skewness of zero. Real-world data rarely hits that mark exactly. Positive skewness means the right tail stretches longer and the bulk of values cluster left of the mean. Negative skewness is the reverse, with a longer left tail. If your data is noticeably skewed, fitting a normal curve to it will misrepresent the actual distribution.

Kurtosis measures how peaked or flat the curve is. A distribution with high kurtosis has a sharper peak and heavier tails than the standard bell curve. Low kurtosis produces a flatter, more plateau-like shape. These differences matter when you’re overlaying a theoretical bell curve on real data: if the fit looks poor, your data may not follow a normal distribution, and a different type of chart (like a histogram of the raw values) might be more honest.