简体   繁体   中英

adjust matplotlib subplot spacing after tight_layout

I would like to minimize white space in my figure. I have a row of sub plots where four plots share their y-axis and the last plot has a separate axis. There are no ylabels or ticklabels for the shared axis middle panels.

tight_layout creates a lot of white space between the the middle plots as if leaving space for tick labels and ylabels but I would rather stretch the sub plots. Is this possible?

import matplotlib.gridspec as gridspec
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

fig = plt.figure()
gs = gridspec.GridSpec(1, 5, width_ratios=[4,1,4,1,2]) 

ax = fig.add_subplot(gs[0])
axes = [ax] + [fig.add_subplot(gs[i], sharey=ax) for i in range(1, 4)]

axes[0].plot(np.random.randint(0,100,100))
barlist=axes[1].bar([1,2],[1,20])

axes[2].plot(np.random.randint(0,100,100))
barlist=axes[3].bar([1,2],[1,20])

axes[0].set_ylabel('data')

axes.append(fig.add_subplot(gs[4]))
axes[4].plot(np.random.randint(0,5,100))
axes[4].set_ylabel('other data')


for ax in axes[1:4]:
    plt.setp(ax.get_yticklabels(), visible=False)


sns.despine();
plt.tight_layout(pad=0, w_pad=0, h_pad=0);

在此处输入图片说明

Setting w_pad = 0 is not changing the default settings of tight_layout . You need to set something like w_pad = -2 . Which produces the following figure:

在此处输入图片说明

You could go further, to say -3 but then you would start to get some overlap with your last plot.

Another way could be to remove plt.tight_layout() and set the boundaries yourself using

plt.subplots_adjust(left=0.065, right=0.97, top=0.96, bottom=0.065, wspace=0.14)

Though this can be a bit of a trial and error process.

Edit

A nice looking graph can be achieved by moving the ticks and the labels of the last plot to the right hand side. This answer shows you can do this by using:

ax.yaxis.tick_right()
ax.yaxis.set_label_position("right") 

So for your example:

axes[4].yaxis.tick_right()
axes[4].yaxis.set_label_position("right")

In addition, you need to remove sns.despine() . Finally, there is now no need to set w_pad = -2 , just use plt.tight_layout(pad=0, w_pad=0, h_pad=0)

Using this creates the following figure:

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM