Sure, it's possible!
What's happening is that a new axes is being created for the colorbar, and the space is being taken from the axes that pcolormesh
is plotted in. If you don't want this to happen, you can specify an axes object for the colorbar to go in. Alternately, you could just use a horizontal colorbar.
At any rate, let's reproduce your problem with stand-alone data:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1977)
# Generate some interesting-looking random data...
num = 200
grid = np.random.normal(0, 1, (20, num)).cumsum(axis=1).cumsum(axis=0)
x = np.linspace(0, 360, num)
y1 = np.random.normal(0, 1, num).cumsum()
y2 = np.random.normal(0, 1, num).cumsum()
# Plot on three seperate axes
fig, axes = plt.subplots(nrows=3, sharex=True)
axes[0].plot(x, y1)
axes[1].plot(x, y2)
im = axes[2].imshow(grid, extent=[0, 360, 0, 20], aspect='auto')
fig.colorbar(im)
plt.show()
A quick fix is to just use a horizontal colorbar:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1977)
# Generate some interesting-looking random data...
num = 200
grid = np.random.normal(0, 1, (20, num)).cumsum(axis=1).cumsum(axis=0)
x = np.linspace(0, 360, num)
y1 = np.random.normal(0, 1, num).cumsum()
y2 = np.random.normal(0, 1, num).cumsum()
# Plot on three seperate axes
fig, axes = plt.subplots(nrows=3, sharex=True)
axes[0].plot(x, y1)
axes[1].plot(x, y2)
im = axes[2].imshow(grid, extent=[0, 360, 0, 20], aspect='auto')
fig.colorbar(im, orientation='horizontal')
plt.show()
Alternately, you can manually add another axes for the colorbar. We'll also adjust things a bit to make more room.
(Side note: Don't use tight_layout
after making the extra axes. We're no longer working with a nice grid of subplots once we add the additional one, so tight_layout
will not work correctly. It's safe to use it before, though you may want to modify the call to subplots_adjust
in that case.)
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1977)
# Generate some interesting-looking random data...
num = 200
grid = np.random.normal(0, 1, (20, num)).cumsum(axis=1).cumsum(axis=0)
x = np.linspace(0, 360, num)
y1 = np.random.normal(0, 1, num).cumsum()
y2 = np.random.normal(0, 1, num).cumsum()
# Plot on three seperate axes
fig, axes = plt.subplots(nrows=3, sharex=True)
axes[0].plot(x, y1)
axes[1].plot(x, y2)
im = axes[2].imshow(grid, extent=[0, 360, 0, 20], aspect='auto')
# Make some room for the colorbar
fig.subplots_adjust(left=0.07, right=0.87)
# Add the colorbar outside...
box = axes[2].get_position()
pad, width = 0.02, 0.02
cax = fig.add_axes([box.xmax + pad, box.ymin, width, box.height])
fig.colorbar(im, cax=cax)
plt.show()