I have a problematic subplot that has two scales of data. Instead of using a log scale, I want to break the axis, so that half of the subplot y axis runs from 0 to 10 and the other half from 10 to 100.
import numpy as np
import matplotlib.pyplot as plt
x = np.random.uniform(0, 10, 40)
y = np.concatenate([np.random.uniform(0, 1, 30), np.random.uniform(0, 100, 10)])
y2 = np.random.uniform(0, 1, 40)
fig, ax = plt.subplots(2, sharex=True)
ax[0].scatter(x, y) # problematic subplot
ax[1].scatter(x, y2)
plt.show()
I tried following pyplot's broken axis demo, though this seems wrong. Do I need to create a total of four subplots to do this? This is just a dummy example, my real problem has several subplots, many of which need these broken axis.
import numpy as np
import matplotlib.pyplot as plt
x = np.random.uniform(0, 10, 40)
y = np.concatenate([np.random.uniform(0, 1, 30), np.random.uniform(0, 100, 10)])
y2 = np.random.uniform(0, 1, 40)
fig, ax = plt.subplots(4, sharex=True)
# Create broken axis with first two subplots
ax[0].scatter(x, y)
ax[1].scatter(x, y)
ax[0].set_ylim(1, 100)
ax[1].set_ylim(0, 1)
ax[0].spines['bottom'].set_visible(False)
ax[1].spines['top'].set_visible(False)
# From https://matplotlib.org/examples/pylab_examples/broken_axis.html
d = .015 # how big to make the diagonal lines in axes coordinates
# arguments to pass to plot, just so we don't keep repeating them
kwargs = dict(transform=ax[0].transAxes, color='k', clip_on=False)
ax[0].plot((-d, +d), (-d, +d), **kwargs) # top-left diagonal
ax[0].plot((1 - d, 1 + d), (-d, +d), **kwargs) # top-right diagonal
kwargs.update(transform=ax[1].transAxes) # switch to the bottom axes
ax[0].plot((-d, +d), (1 - d, 1 + d), **kwargs) # bottom-left diagonal
ax[0].plot((1 - d, 1 + d), (1 - d, 1 + d), **kwargs) # bottom-right diagonal
# Try my best to fix bottom two plots so they look like one plot
ax[2].scatter(x, y2)
ax[3].scatter(x, y2)
ax[2].set_ylim(.5, 1.0)
ax[3].set_ylim(0, .5)
ax[2].spines['bottom'].set_visible(False)
ax[3].spines['top'].set_visible(False)
plt.savefig('ex.pdf')


