jjv
jjv

Reputation: 187

subplots with different colorbars

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

Answers (1)

ImportanceOfBeingErnest
ImportanceOfBeingErnest

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)

enter image description here

Upvotes: 5

Related Questions