Fundamentals 11 min read

Common Probability Distributions and Their Visualization in Python

This article introduces several common probability distributions—including uniform, normal, lognormal, Poisson, exponential, binomial, Student's t, and chi‑squared—explains their properties, and provides Python code using NumPy, SciPy, and Matplotlib to visualize each distribution.

Python Programming Learning Circle
Python Programming Learning Circle
Python Programming Learning Circle
Common Probability Distributions and Their Visualization in Python

In this article we introduce a range of common probability distributions and show how to visualize them using Python libraries such as NumPy, SciPy, Matplotlib, and Seaborn.

Uniform Distribution : The uniform distribution can be discrete (e.g., a fair die) or continuous over an interval. The following code generates and plots both forms.

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

# continuous uniform
a = 0
b = 50
size = 5000
X_continuous = np.linspace(a, b, size)
continuous_uniform = stats.uniform(loc=a, scale=b)
continuous_uniform_pdf = continuous_uniform.pdf(X_continuous)

# discrete uniform
X_discrete = np.arange(1, 7)
discrete_uniform = stats.randint(1, 7)
discrete_uniform_pmf = discrete_uniform.pmf(X_discrete)

# plot both
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(15,5))
ax[0].bar(X_discrete, discrete_uniform_pmf)
ax[0].set_xlabel("X")
ax[0].set_ylabel("Probability")
ax[0].set_title("Discrete Uniform Distribution")
ax[1].plot(X_continuous, continuous_uniform_pdf)
ax[1].set_xlabel("X")
ax[1].set_ylabel("Probability")
ax[1].set_title("Continuous Uniform Distribution")
plt.show()

Normal (Gaussian) Distribution : The most familiar distribution, symmetric around its mean. The code below plots its probability density function.

mu = 0
variance = 1
sigma = np.sqrt(variance)
x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)

plt.subplots(figsize=(8,5))
plt.plot(x, stats.norm.pdf(x, mu, sigma))
plt.title("Normal Distribution")
plt.show()

Lognormal Distribution : A continuous distribution whose logarithm is normally distributed. The script visualizes three parameter settings.

X = np.linspace(0, 6, 500)

std = 1
mean = 0
lognorm_distribution = stats.lognorm([std], loc=mean)
lognorm_distribution_pdf = lognorm_distribution.pdf(X)
fig, ax = plt.subplots(figsize=(8,5))
plt.plot(X, lognorm_distribution_pdf, label="μ=0, σ=1")
ax.set_xticks(np.arange(min(X), max(X)))

std = 0.5
mean = 0
lognorm_distribution = stats.lognorm([std], loc=mean)
lognorm_distribution_pdf = lognorm_distribution.pdf(X)
plt.plot(X, lognorm_distribution_pdf, label="μ=0, σ=0.5")

std = 1.5
mean = 1
lognorm_distribution = stats.lognorm([std], loc=mean)
lognorm_distribution_pdf = lognorm_distribution.pdf(X)
plt.plot(X, lognorm_distribution_pdf, label="μ=1, σ=1.5")

plt.title("Lognormal Distribution")
plt.legend()
plt.show()

Poisson Distribution : Models the count of events occurring in a fixed interval. The first snippet computes a probability mass, and the second visualizes a sample.

from scipy import stats
print(stats.poisson.pmf(k=9, mu=3))
X = stats.poisson.rvs(mu=3, size=500)
plt.subplots(figsize=(8,5))
plt.hist(X, density=True, edgecolor="black")
plt.title("Poisson Distribution")
plt.show()

Exponential Distribution : Describes the time between events in a Poisson process. The code plots its PDF.

X = np.linspace(0, 5, 5000)
exponential_distribution = stats.expon.pdf(X, loc=0, scale=1)
plt.subplots(figsize=(8,5))
plt.plot(X, exponential_distribution)
plt.title("Exponential Distribution")
plt.show()

Binomial Distribution : Represents the number of successes in a fixed number of independent Bernoulli trials. The snippet generates a sample and plots a histogram.

X = np.random.binomial(n=1, p=0.5, size=1000)
plt.subplots(figsize=(8,5))
plt.hist(X)
plt.title("Binomial Distribution")
plt.show()

Student's t Distribution : Used when estimating the mean of a normally distributed population with unknown variance. The following code visualizes t‑distributions with different degrees of freedom.

import seaborn as sns
from scipy import stats

X1 = stats.t.rvs(df=1, size=4)
X2 = stats.t.rvs(df=3, size=4)
X3 = stats.t.rvs(df=9, size=4)

plt.subplots(figsize=(8,5))
sns.kdeplot(X1, label="1 d.o.f")
sns.kdeplot(X2, label="3 d.o.f")
sns.kdeplot(X3, label="6 d.o.f")
plt.title("Student's t distribution")
plt.legend()
plt.show()

Chi‑squared Distribution : A special case of the gamma distribution, often used in hypothesis testing. The code below plots PDFs for 1, 2, and 3 degrees of freedom.

X = np.arange(0, 6, 0.25)
plt.subplots(figsize=(8,5))
plt.plot(X, stats.chi2.pdf(X, df=1), label="1 d.o.f")
plt.plot(X, stats.chi2.pdf(X, df=2), label="2 d.o.f")
plt.plot(X, stats.chi2.pdf(X, df=3), label="3 d.o.f")
plt.title("Chi-squared Distribution")
plt.legend()
plt.show()

Understanding these distributions and being able to visualize them is essential for data science, statistical analysis, and machine‑learning tasks.

PythonstatisticsprobabilityVisualizationMatplotlibdistributionSciPy
Python Programming Learning Circle
Written by

Python Programming Learning Circle

A global community of Chinese Python developers offering technical articles, columns, original video tutorials, and problem sets. Topics include web full‑stack development, web scraping, data analysis, natural language processing, image processing, machine learning, automated testing, DevOps automation, and big data.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.