Maybe we can superimpose another plot on top:
fig, axes = plt.subplots(1, 4, figsize=(9, 2), subplot_kw=dict(polar=True))
for aa in axes.flat:
aa.plot(theta, r, '-sb')
aa.set_rlim(0, 1)
aa.set_yticklabels([])
box=axes[0].get_position()
axl=fig.add_axes([box.xmin/2, #put it half way between the edge of the 1st subplot and the left edge of the figure
0.5*(box.ymin+box.ymax), #put the origin at the same height of the origin of the polar plots
box.width/40, #Doesn't really matter, we will set everything invisible, except the y axis
box.height*0.4], #fig.subplots_adjust will not adjust this axis, so we will need to manually set the height to 0.4 (half of 0.9-0.1)
axisbg=None) #transparent background.
axl.spines['top'].set_visible(False)
axl.spines['right'].set_visible(False)
axl.spines['bottom'].set_visible(False)
axl.yaxis.set_ticks_position('both')
axl.xaxis.set_ticks_position('none')
axl.set_xticklabels([])
axl.set_ylim(0,1)
axl.set_ylabel('$R$\t', rotation=0)
fig.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9, wspace=0.5)

Edit
It turn out that the subplots_adjust
also affects the superimposing axis. If we check the list of axes inside fig
, the superimposing axis is right there (check site-packages\matplotlib\figure.py if you have doubt):
In [27]:
fig.axes
Out[27]:
[<matplotlib.axes.PolarAxesSubplot at 0x9714650>,
<matplotlib.axes.PolarAxesSubplot at 0x9152730>,
<matplotlib.axes.PolarAxesSubplot at 0x9195b90>,
<matplotlib.axes.PolarAxesSubplot at 0x91878b0>,
<matplotlib.axes.Axes at 0x9705a90>]
The real problem is that the wspace=0.5
not only affects the width of the polar plot, but also affect the height (so the aspect stays the same). But for the non-polar superimposing axis, it only affect the width. Therefore, an additional width modification is required, and the solution is:
fig, axes = plt.subplots(1, 4, figsize=(10, 2), subplot_kw=dict(polar=True))
for aa in axes.flat:
aa.plot(theta, r, '-sb')
aa.set_rlim(0, 1)
aa.set_yticklabels([])
#fig.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9, wspace=0.5)
box=axes[0].get_position()
axl=fig.add_axes([box.xmin/2,
0.5*(box.ymin+box.ymax),
box.width/40,
box.height*0.5],
axisbg=None)
#fig.add_axes([box.xmin, box.ymin, box.width, box.height])
axl.spines['top'].set_visible(False)
axl.spines['right'].set_visible(False)
axl.spines['bottom'].set_visible(False)
axl.yaxis.set_ticks_position('both')
axl.xaxis.set_ticks_position('none')
axl.set_xticklabels([])
axl.set_ylim(0,1)
axl.set_ylabel('$R$\t', rotation=0)
w_pre_scl=box.width
fig.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9, wspace=0.5)
ratio=axes[0].get_position().width/w_pre_scl
axlb=axl.get_position()
axl.set_position([axlb.xmin, axlb.ymin, axlb.width, axlb.height*ratio])

if there is no wspace=0.5
, the last few lines has no net affect:
fig.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9)
#ratio=axes[0].get_position().width/w_pre_scl
#axlb=axl.get_position()
#axl.set_position([axlb.xmin, axlb.ymin, axlb.width, axlb.height*ratio])
