0
0
Matplotlibdata~5 mins

Broken axes concept in Matplotlib

Choose your learning style9 modes available
Introduction

Sometimes data has gaps or large jumps that make it hard to see details on a plot. Broken axes let you skip these gaps to focus on important parts.

You want to show two separate ranges of data on the same plot without the empty space in between.
Your data has a big jump or gap that hides smaller details.
You want to compare two different value ranges clearly in one figure.
You want to save space by not showing unimportant empty parts of the axis.
Syntax
Matplotlib
import matplotlib.pyplot as plt
from matplotlib import gridspec

fig = plt.figure()
gs = gridspec.GridSpec(2, 1, height_ratios=[1, 1], hspace=0.05)

ax1 = fig.add_subplot(gs[0])  # Top plot
ax2 = fig.add_subplot(gs[1], sharex=ax1)  # Bottom plot

# Hide x-axis labels on top plot
plt.setp(ax1.get_xticklabels(), visible=False)

# Plot data on ax1 and ax2

# Add diagonal lines to show break
kwargs = dict(transform=ax1.transAxes, color='k', clip_on=False)
ax1.plot((-0.015, +0.015), (-0.02, +0.02), **kwargs)
ax1.plot((1 - 0.015, 1 + 0.015), (-0.02, +0.02), **kwargs)

kwargs.update(transform=ax2.transAxes)
ax2.plot((-0.015, +0.015), (1 - 0.02, 1 + 0.02), **kwargs)
ax2.plot((1 - 0.015, 1 + 0.015), (1 - 0.02, 1 + 0.02), **kwargs)

plt.show()

This example uses gridspec to create two stacked plots sharing the x-axis.

Diagonal lines show the axis break visually.

Examples
This example shows two plots stacked vertically with a break in the y-axis to skip the gap between 40 and 100.
Matplotlib
import matplotlib.pyplot as plt
from matplotlib import gridspec

fig = plt.figure()
gs = gridspec.GridSpec(2, 1, height_ratios=[1, 1], hspace=0.05)

ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1], sharex=ax1)

ax1.plot([0, 1, 2, 3, 4], [0, 10, 20, 30, 40])
ax2.plot([0, 1, 2, 3, 4], [100, 110, 120, 130, 140])

plt.setp(ax1.get_xticklabels(), visible=False)

kwargs = dict(transform=ax1.transAxes, color='k', clip_on=False)
ax1.plot((-0.015, +0.015), (-0.02, +0.02), **kwargs)
ax1.plot((1 - 0.015, 1 + 0.015), (-0.02, +0.02), **kwargs)

kwargs.update(transform=ax2.transAxes)
ax2.plot((-0.015, +0.015), (1 - 0.02, 1 + 0.02), **kwargs)
ax2.plot((1 - 0.015, 1 + 0.015), (1 - 0.02, 1 + 0.02), **kwargs)

plt.show()
This example uses different height ratios to give more space to the top plot, useful when one range is more important.
Matplotlib
import matplotlib.pyplot as plt
from matplotlib import gridspec

fig = plt.figure(figsize=(6, 4))
gs = gridspec.GridSpec(2, 1, height_ratios=[2, 1], hspace=0.1)

ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1], sharex=ax1)

x = [1, 2, 3, 4, 5]
y1 = [10, 15, 20, 25, 30]
y2 = [100, 110, 120, 130, 140]

ax1.plot(x, y2, 'r-')
ax2.plot(x, y1, 'b-')

plt.setp(ax1.get_xticklabels(), visible=False)

kwargs = dict(transform=ax1.transAxes, color='k', clip_on=False)
ax1.plot((-0.01, +0.01), (-0.02, +0.02), **kwargs)
ax1.plot((1 - 0.01, 1 + 0.01), (-0.02, +0.02), **kwargs)

kwargs.update(transform=ax2.transAxes)
ax2.plot((-0.01, +0.01), (1 - 0.02, 1 + 0.02), **kwargs)
ax2.plot((1 - 0.01, 1 + 0.01), (1 - 0.02, 1 + 0.02), **kwargs)

plt.show()
Sample Program

This program creates a plot with two y-axis ranges separated by a break. It shows data points from 0 to 40 on the bottom plot and 100 to 140 on the top plot. The diagonal lines show where the axis is broken.

Matplotlib
import matplotlib.pyplot as plt
from matplotlib import gridspec

# Create figure and gridspec with two rows
fig = plt.figure(figsize=(6, 5))
gs = gridspec.GridSpec(2, 1, height_ratios=[1, 1], hspace=0.05)

# Create two subplots sharing x-axis
ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1], sharex=ax1)

# Data with a big gap between 40 and 100
x = [0, 1, 2, 3, 4]
y_top = [100, 110, 120, 130, 140]
y_bottom = [0, 10, 20, 30, 40]

# Plot top data on ax1
ax1.plot(x, y_top, marker='o', color='red')
ax1.set_ylim(90, 150)  # Limit y-axis to top range

# Plot bottom data on ax2
ax2.plot(x, y_bottom, marker='o', color='blue')
ax2.set_ylim(-5, 45)  # Limit y-axis to bottom range

# Hide x tick labels on top plot
plt.setp(ax1.get_xticklabels(), visible=False)

# Add diagonal lines to indicate broken axis
kwargs = dict(transform=ax1.transAxes, color='k', clip_on=False)
ax1.plot((-0.015, +0.015), (-0.02, +0.02), **kwargs)  # left diagonal
ax1.plot((1 - 0.015, 1 + 0.015), (-0.02, +0.02), **kwargs)  # right diagonal

kwargs.update(transform=ax2.transAxes)
ax2.plot((-0.015, +0.015), (1 - 0.02, 1 + 0.02), **kwargs)  # left diagonal
ax2.plot((1 - 0.015, 1 + 0.015), (1 - 0.02, 1 + 0.02), **kwargs)  # right diagonal

plt.xlabel('X axis')
ax2.set_ylabel('Value')
ax1.set_ylabel('Value')
plt.suptitle('Example of Broken Axes to Skip Gap in Data')

plt.show()
OutputSuccess
Important Notes

Broken axes help focus on important data ranges by skipping large gaps.

Make sure to add visual cues like diagonal lines so viewers understand the axis is broken.

Sharing the x-axis keeps the plot aligned and easier to read.

Summary

Broken axes let you show separate data ranges in one figure by skipping gaps.

Use stacked subplots with shared axes and add diagonal lines to indicate breaks.

This technique helps reveal details hidden by large jumps in data.