Matplotlibs:避免使用注释来调整图

时间:2017-06-10 19:19:56

标签: python matplotlib

我想让matplotlib中的tight_layout()函数忽略注释。例如,这是一张tight_layout

的情节
fig = plt.figure()
fig.patch.set_facecolor('grey')

ax1 = plt.subplot(221)
ax2 = plt.subplot(223)
ax3 = plt.subplot(122)

def example_plot(ax, fontsize=12):
     ax.plot([1, 2])
     ax.locator_params(nbins=3)
     ax.set_xlabel('x-label', fontsize=fontsize)
     ax.set_ylabel('y-label', fontsize=fontsize)
     ax.set_title('Title', fontsize=fontsize)

example_plot(ax1)
example_plot(ax2)
example_plot(ax3)

plt.tight_layout()

plt.annotate('a)', xy=(0, 1), xycoords='figure fraction', ha='left', va='top')
plt.annotate('b)', xy=(0, 0.5), xycoords='figure fraction', ha='left', va='top')
plt.annotate('c)', xy=(0.5, 1), xycoords='figure fraction', ha='left', va='top')

enter image description here

enter image description here

这个数字似乎在尺寸上增加(向左和向上),以便为注释腾出空间(ylabels不会一直走到边缘)。但是,我希望在没有任何重新排列的情况下将注释添加到图的顶部。我可以以某种方式让tight_layout忽略这些注释吗?

编辑:事实证明tight_layout实际上不是问题。即使没有调用tight_layout,也会调整剧情的大小:

enter image description here

enter image description here

但是,如果我在另一台计算机上尝试相同的操作,则会发生预期的行为(不调整大小)。两个系统都运行matplotlib 2.0.0和ipython。

2 个答案:

答案 0 :(得分:1)

我认为你是从错误的方向看这个。首先,没有“问题”。一切都按预期工作。

tight_layout不会更改数字大小。它所做的就是重新排列图中的元素,以更好地利用可用空间。

由于设置bbox_inches="tight",您看到的是已保存的数字裁剪的效果。发生这种情况是因为%matplotlib inline后端显示了该图的已保存版本。从原始图形中剪切图像,使得保存的图像包含画布中的所有元素 因此,所示图像通常小于原始图像。

如果您将一些标签贴在图形边缘附近,则无法裁剪图形,因为这样会切割标签。与没有标签的情况相比,这可能看起来好像数字已经增长。然而,正如所解释的那样,实际上这个数字并没有被裁剪。

如果需要,解决方案当然是将标签放置在远离图形边缘的位置,这样bbox_inches="tight"算法可以裁剪更多的图形。

答案 1 :(得分:0)

如果使用%matplotlib inline,显然这是一个特定问题。如果我切换到%matplotlib notebook,一切都很好。