• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar

Data Viz with Python and R

Learn to Make Plots in Python and R

  • Home
  • Seaborn
  • Matplotlib
  • ggplot2
  • Altair
  • About
    • Privacy Policy
  • Visualizing Activation Functions in Neural Networks
  • Confusion Matrix Calculator
  • Visualizing Dropout Rate in Neural Network
  • Visualizing Loss Functions in Neural Networks
  • Show Search
Hide Search

Matplotlib Guide & Cookbook (Python)

Matplotlib Cookbook & Tutorial Hub

A practical, copy-ready guide to Matplotlib with examples you actually use at work. Organized by chart family, with code snippets, formatting tips, and pitfalls—plus deep-dive links to full tutorials on datavizpyr.com.

Why Matplotlib? It’s the foundational plotting library in Python; Seaborn and pandas plotting build on it. When you need pixel-level control—custom annotations, shapes, and tick formats—Matplotlib is your best friend.

What this hub covers: Scatter/line, bars with labels, histograms, heatmaps, time series, and styling (ticks, labels, rectangles). Each section starts with a short explanation, a minimal code example, and curated links to go deeper.

How to use it: Skim the examples, then jump to the specific tutorial that matches your task. Code tested with Matplotlib 3.7+.

On this page
  • Scatter & Line
  • Bars with Labels (Grouped & Simple)
  • Histograms & Overlays
  • Heatmaps
  • Time Series (Rolling, Highlights)
  • Styling & Formatting (Ticks, Labels, Shapes)
  • General Recipes

Matplotlib Scatter & Line Plots

Start simple with ax.plot or ax.scatter; add label/legend for groups and use alpha to handle overlap, looping per group for multi-category data.


import matplotlib.pyplot as plt
import numpy as np

rng = np.random.default_rng(2)
x = rng.normal(size=60)
y = 0.6*x + rng.normal(scale=0.7, size=60)
g = np.where(x > 0, "A", "B")

fig, ax = plt.subplots(figsize=(6,4))
for grp in ["A","B"]:
    m = g == grp
    ax.scatter(x[m], 
               y[m], 
               alpha=0.85, 
               label=f"Group {grp}")
ax.legend(frameon=False, title="Group")
ax.set(title="Scatter by group", 
       xlabel="X", 
       ylabel="Y")
plt.tight_layout()
plt.savefig("Matplotlib_scatter_plot.png")
plt.show()
Matplotlib: Scatter plot example
Matplotlib: Scatter plot example
  • Color scatterplot by a variable (Matplotlib)

    Shows how to map a categorical or numeric variable to point colors and keep the palette consistent across groups.

  • Legend for color-mapped scatter

    Walks through creating a clean, informative legend tied to your color mapping with frame and placement tweaks.

  • Connect paired points with lines

    Demonstrates linking matched observations with line segments to emphasize change or before–after relationships.

Matplotlib Bar Charts with Direct Labels

For few categories, bars are efficient; label bars with ax.bar_label so values are readable without scanning tables or tooltips.


import matplotlib.pyplot as plt
import numpy as np

# Define the category labels for the x-axis
cats = ["A", "B", "C"]
# Create numeric positions for each category (0, 1, 2)
x = np.arange(len(cats))
# Set the bar width (controls spacing between grouped bars)
w = 0.38
# Define values for the first group (e.g., year 2024)
v1 = [5, 7, 3]
# Define values for the second group (e.g., year 2025)
v2 = [4, 6, 6]
# Create a figure and axis object
fig, ax = plt.subplots(figsize=(6, 4))
# Plot the first group of bars, shifted left by half the bar width
r1 = ax.bar(x - w/2, v1, width=w, label="2024")
# Plot the second group of bars, shifted right by half the bar width
r2 = ax.bar(x + w/2, v2, width=w, label="2025")
# Add numeric labels on top of each bar for both groups
for r in (r1, r2):
    ax.bar_label(r, fmt="%.0f", padding=2)
# Set x-axis ticks to the numeric positions
ax.set_xticks(x)
# Replace numeric ticks with category labels
ax.set_xticklabels(cats)
# Add a label for the y-axis
ax.set_ylabel("Value")
# Add a title to the chart
ax.set_title("Grouped bars with labels")
# Add a legend showing group labels (without a border box)
ax.legend(frameon=False)
# Adjust layout so labels/titles don’t overlap with figure edges
plt.tight_layout()
plt.savefig("Matplotlib_grouped_barplot_with_annotation.png")
# Display the chart
plt.show()
Matplotlib: Grouped Barplot with Annotation
Matplotlib: Grouped Barplot with Annotation
  • Bar plots with Matplotlib

    Covers the essentials for single-series bar charts including orientation, colors, and axis tick formatting tips.

  • Grouped barplots with Matplotlib

    Explains how to position groups with width offsets and align category labels cleanly on the x-axis.

  • Annotate bars with bar_label

    Shows practical patterns to place and format bar value labels for better readability on dense charts.

  • Annotate grouped barplot

    Provides concise loops to label each bar across multiple series without misalignment or overlaps.

Matplotlib Histograms (with Overlays)

Use consistent bins to compare distributions; add transparency for overlays and consider density scaling when shapes matter more than counts.




rng = np.random.default_rng(0)
a = rng.normal(0, 1.0, 600)
b = rng.normal(0.8, 1.2, 600)

fig, ax = plt.subplots(figsize=(6,4))
ax.hist(a,
        bins=30, 
        alpha=0.6, 
        density=True, 
        label="A")
ax.hist(b, 
        bins=30,
        alpha=0.6, 
        density=True, 
        label="B")
ax.legend(frameon=False); 
ax.set(title="Overlapping histograms")
plt.tight_layout(); 
plt.savefig("Overlapping_histogram_Matplotlib.png")
plt.show()
Matplotlib: Overlapping Histogram Example
Matplotlib: Overlapping Histogram Example
  • Histograms with Matplotlib

    Details bin count/width choices, density versus frequency, and layout tweaks for intuitive comparisons.

  • Overlapping histograms in Matplotlib

    Explains how to layer multiple histograms with transparency and consistent binning for fair side-by-side reading.

Matplotlib Heatmaps

Correlation matrices and data-quality scans are fast with ax.imshow; add a colorbar and set tick labels for orientation.


import matplotlib.pyplot as plt
import numpy as np

# Generate a random dataset with 5 variables and 200 observations
mat = np.corrcoef(np.random.randn(200, 5), rowvar=False)

# Create labels for variables (Var1, Var2, …)
labels = [f"Var{i+1}" for i in range(mat.shape[0])]

# Create a figure and axis
fig, ax = plt.subplots(figsize=(6, 5))

# Display correlation heatmap with a diverging palette
# RdBu_r: blue for negative, red for positive, white ~ 0
im = ax.imshow(mat, cmap="Spectral_r", vmin=-1, vmax=1)

# Add colorbar with label
cbar = fig.colorbar(im, ax=ax, shrink=0.85)
cbar.set_label("Correlation", rotation=270, labelpad=15)

# Set ticks to match variables
ax.set_xticks(np.arange(len(labels)))
ax.set_yticks(np.arange(len(labels)))
ax.set_xticklabels(labels)
ax.set_yticklabels(labels)

# Rotate x-axis labels for readability
plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor")

# Add a descriptive title
ax.set_title("Correlation Heatmap with Improved Color Palette")

# Adjust layout so everything fits
plt.tight_layout()
plt.savefig("Matplotlib_heatmap.png")
plt.show()
Matplotlib: Simple Heatmap Example
Matplotlib: Simple Heatmap Example
  • Heatmap with Matplotlib

    Walks from basic imshow heatmaps to annotated matrices and includes colorbar and layout adjustments.

  • Visualize DataFrame NAs as heatmap

    Shows how to map missing values across a DataFrame to quickly spot patterns and data integrity issues.

Matplotlib Time Series (Rolling & Highlights)

Blend raw series with a rolling mean for context and use axvspan to highlight regimes such as events, seasons, or outages.


import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# Create a daily date range starting from Jan 1, 2023 with 240 days
idx = pd.date_range("2023-01-01", periods=240, freq="D")

# Generate a random cumulative sum series to simulate a time series
s = pd.Series(np.random.randn(240).cumsum(), index=idx)

# Compute a 14-day rolling mean (moving average), allowing shorter windows at the start
roll = s.rolling(14, min_periods=1).mean()

# Create a figure and axis with custom size
fig, ax = plt.subplots(figsize=(7, 4))

# Plot the raw daily time series with transparency
ax.plot(s.index, s.values, alpha=0.35, label="daily")

# Plot the 14-day rolling mean with a thicker line
ax.plot(roll.index, roll.values, linewidth=2, label="14-day mean")

# Highlight a specific time window (May 1 to June 15) with a shaded background
ax.axvspan("2023-05-01", "2023-06-15", alpha=0.15)

# Add a legend without a frame box
ax.legend(frameon=False)

# Set a title for the plot
ax.set(title="Time series with rolling mean & highlight")

# Adjust layout so labels and title fit neatly in the figure
plt.tight_layout()
plt.savefig("Matplotlib_time_series_rolling_mean_plot.png")
# Display the plot
plt.show()
Matplotlib: Time Series Plot with Rolling Mean
Matplotlib: Time Series Plot with Rolling Mean
  • Time series with pandas

    Introduces datetime indexes, resampling, and base line plots for time-stamped data using pandas+Matplotlib.

  • Rolling average in Python

    Explains window choices, centered vs trailing means, and min_periods with clear Matplotlib overlays.

  • Highlight a time range

    Shows axvspan techniques to shade intervals and annotate events without hiding the main signal.

Styling & Formatting (Ticks, Labels, Shapes)

Use formatters to speak users’ language (currency/percent), give labels breathing room, and add rectangles for contextual focus.

import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter

def dollars(v, _): return f"${v:,.0f}"

fig, ax = plt.subplots(figsize=(6,4))
ax.plot([1,2,3,4], [2000, 3500, 2600, 4200], marker="o")
ax.yaxis.set_major_formatter(FuncFormatter(dollars))
ax.set_xlabel("Quarter", labelpad=8)
ax.set_title("Revenue trend")
plt.tight_layout(); plt.show()
  • Add dollar sign to axis ticks

    Covers currency tick formatters with thousands separators and sensible rounding for dashboards and reports.

  • Adjust axis label positions

    Shows label padding, rotation, and placement tweaks that prevent collisions and improve legibility.

  • Draw rectangle for highlights

    Uses patches to call attention to important time windows or value regions without overwhelming the plot.

  • Change Matplotlib plot style

    Explains using built-in and custom style sheets to create a consistent visual identity across charts.

General Matplotlib Recipes

Quick patterns you’ll reach for often—legends that don’t obscure data, text annotations, bubble plots, and stacked areas.

  • Legend for color-mapped scatter

    Covers practical legend placement and styling so labels aid interpretation instead of hiding data.

  • Text annotations for points

    Shows safe label placement and simple offsets to avoid overlaps while calling out notable points.

  • Bubble plot in Matplotlib

    Explains using marker size to encode a third variable and how to scale and label bubbles clearly.

  • Stacked area plot

    Shows layering multiple series to emphasize cumulative totals and long-term shifts in composition.

You may also like

Explore more topic hubs across datavizpyr.

R • ggplot2

ggplot2 Hub

Curated grammar-of-graphics recipes, from basic geoms to polished themes and annotations.


Python • Seaborn

Seaborn Hub

Statistical plotting patterns with elegant defaults, facets, and regression overlays.

Matplotlib FAQs

What is Matplotlib best used for?
Matplotlib is the “Swiss Army knife” of Python visualization. Whether you need a quick scatter plot or a fully customized figure, it gives you pixel-level control that no other library matches. Start with our Matplotlib examples collection for inspiration.
How do I label bars so my charts are easier to read?
Use ax.bar_label() to print values directly on top of bars. This small change makes charts instantly clearer. See our guide on annotating bars with bar_label() for code examples.
What’s the cleanest way to compare two histograms?
Overlay histograms with the same bin edges and use transparency. This lets readers compare distributions side by side. Check our tutorial on overlapping histograms in Matplotlib for practical tips.
How can I highlight a time period in my chart?
The secret weapon is axvspan(). With one line you can shade campaigns, outages, or seasons to direct attention. Try our guide on highlighting time ranges in time series plots.
Can I make Matplotlib plots look modern and stylish?
Absolutely. Use plt.style.use() with built-in or custom themes to unify fonts, colors, and grids. Our tutorial on changing Matplotlib plot styles shows how to upgrade your visuals quickly.



Primary Sidebar

Python & R Viz Hubs

  • Seaborn Guide & Cookbook
  • ggplot2 Guide & Cookbook
  • Matplotlib Guide & Cookbook
  • Confusion Matrix Calculator
  • Visualizing Activation Functions
  • Visualizing Dropout
  • Visualizing Loss Functions

Buy Me a Coffee

Copyright © 2026 · Daily Dish Pro on Genesis Framework · WordPress · Log in

Go to mobile version