Reputation: 187
I have a 2x3 subplot of contour maps. I want to have two horizontal colorbars, one for the first 2 columns and one for the third column. I can only do it for each column (thus, 3 colorbars), but I need a shared colorbar for the first two columns.
Here is my sample code:
import numpy as np
import matplotlib.pyplot as plt
v = np.arange(-180,181,15)
y,x = np.meshgrid(v,v)
p1 = 100*np.sin(x+y)
p2 = 100*np.sin(2*x+y)
p3 = 100*np.sin(3*x+y)
p4 = 100*np.sin(4*x+y)
p5 = 5*np.cos(x+5*y)
p6 = 5*np.cos(x+6*y)
f, ax = plt.subplots(2,3,sharex='row',sharey='col',figsize=(4,6))
mina = min(min(p1.reshape(625,)),min(p2.reshape(625,)),min(p3.reshape(625,)),min(p4.reshape(625,)))
maxa = max(max(p1.reshape(625,)),max(p2.reshape(625,)),max(p3.reshape(625,)),max(p4.reshape(625,)))
minb = min(min(p5.reshape(625,)),min(p6.reshape(625,)))
maxb = max(max(p5.reshape(625,)),max(p6.reshape(625,)))
ax[0,0].contourf(x,y,p1,20,vmin=mina,vmax=maxa)
ax[0,0].set(adjustable='box-forced', aspect='equal')
l0 = ax[1,0].contourf(x,y,p2,20,vmin=mina,vmax=maxa)
ax[1,0].set(adjustable='box-forced', aspect='equal')
ax[0,1].contourf(x,y,p3,20,vmin=mina,vmax=maxa)
ax[0,1].set(adjustable='box-forced', aspect='equal')
l1 = ax[1,1].contourf(x,y,p4,20,vmin=mina,vmax=maxa)
ax[1,1].set(adjustable='box-forced', aspect='equal')
ax[0,2].contourf(x,y,p5,20,vmin=minb,vmax=maxb)
ax[0,2].set(adjustable='box-forced', aspect='equal')
l2 = ax[1,2].contourf(x,y,p6,20,vmin=minb,vmax=maxb)
ax[1,2].set(adjustable='box-forced', aspect='equal')
f.colorbar(l0, ax=list(ax[:,0]),orientation='horizontal')
f.colorbar(l1, ax=list(ax[:,1]),orientation='horizontal')
f.colorbar(l2, ax=list(ax[:,2]),orientation='horizontal')
plt.setp([a.get_xticklabels() for a in ax[0,:]], visible=False)
plt.setp([a.get_yticklabels() for a in ax[:,1]], visible=False)
plt.setp([a.get_yticklabels() for a in ax[:,2]], visible=False)
plt.show()
Upvotes: 1
Views: 2823
Reputation: 339765
The ax
argument of colorbar allows to specify the axes along which the colorbar is created. If for the first colorbar you specify the axes of the first two columns, it will extend along both.
f.colorbar(l0, ax=list(ax[1,0:2]),orientation='horizontal', pad=0.2)
f.colorbar(l2, ax=ax[1,2],orientation='horizontal', aspect=10, pad=0.2)
Upvotes: 5