11

I try to generate 3 subplots for my figure. It seems work but it is not perfectly aligned. How to have the same width between the figure at the bottom et the figures at below?

plt.close()
fig = plt.figure()

ax1 = plt.subplot(211)
ax1.plot(cycles,np.asarray(df_int),'wo',label='')
ax1.plot(cycles,np.asarray(df_proj),'k+',label='')
ax1.legend(loc=2)
#ax1.subplots_adjust(left=0.15)
ax1.set_ylim(0.001,0.004)

ax2 = plt.subplot(223)
i2=ax2.imshow(c,cmap=plt.cm.hot, vmin=-5, vmax=5);#plt.colorbar();plt.clim(-5,5)
cb2=plt.colorbar(i2,ax=ax2,ticks=[-5,0,5],fraction=0.046, pad=0.04,format='%.2f')
cb2.ax.tick_params(labelsize=12)



ax3 = plt.subplot(224)
i3=ax3.imshow(residue_proj,cmap=plt.cm.hot, vmin=-5, vmax=5);#plt.colorbar();plt.clim(-5,5);
cb3=plt.colorbar(i3,ax=ax3,ticks=[-5,0,5],fraction=0.046, pad=0.04,format='%.2f')
cb3.ax.tick_params(labelsize=12)

plt.savefig('test.png', dpi=500,  bbox_inches='tight', pad_inches=0.1)
#plt.show()

enter image description here

2 Answers 2

26

This is probably a lot easier if you use GridSpec:

import numpy as np
import matplotlib.pylab as pl
import matplotlib.gridspec as gridspec

# Create 2x2 sub plots
gs = gridspec.GridSpec(2, 2)

pl.figure()
ax = pl.subplot(gs[0, 0]) # row 0, col 0
pl.plot([0,1])

ax = pl.subplot(gs[0, 1]) # row 0, col 1
pl.plot([0,1])

ax = pl.subplot(gs[1, :]) # row 1, span all columns
pl.plot([0,1])

See: http://matplotlib.org/users/gridspec.html

enter image description here

4
  • 1
    is it at all possible to get the third figure the same size as the other two and centered alone in the second row instead?
    – dezdichado
    Commented Oct 26, 2021 at 1:46
  • I'm sure that's possible, but not something I (or anyone) can easily answer here in a comment. So perhaps ask a question about this instead?
    – Bart
    Commented Oct 26, 2021 at 9:59
  • Has this been deprecated now? I get MatplotlibDeprecationWarning: Auto-removal of overlapping axes is deprecated since 3.6 and will be removed two minor releases later; explicitly call ax.remove() as needed.
    – Bill
    Commented Dec 9, 2022 at 21:39
  • Do you get that warning with this exact example? I just checked with matplotlib 3.6.2, but don't get any warnings...
    – Bart
    Commented Dec 10, 2022 at 9:07
13

The same as the above answer can be done with a figure object like so:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

# Create 2x2 sub plots
gs = gridspec.GridSpec(2, 2)

fig = plt.figure()
ax1 = fig.add_subplot(gs[0, 0]) # row 0, col 0
ax1.plot([0,1])

ax2 = fig.add_subplot(gs[0, 1]) # row 0, col 1
ax2.plot([0,1])

ax3 = fig.add_subplot(gs[1, :]) # row 1, span all columns
ax3.plot([0,1])

Not the answer you're looking for? Browse other questions tagged or ask your own question.