如何在ipython notebook中禁用matplotlib inline的bbox_inches='tight

7 投票
2 回答
2565 浏览
提问于 2025-05-01 07:23

在使用ipython notebook中的matplotlib内联后端时,默认情况下,它会通过savefig()生成嵌入的png图像,并使用bbox_inches='tight'选项。这种方式可以消除坐标轴周围的空白,在大多数情况下效果很好。

不过,有时候我们可能想要(暂时)关闭这个功能,比如当我们想手动让两个图形在垂直方向上对齐时(假设我们不想使用子图subplot):

%matplotlib inline
from pylab import *
plot(rand(100))
subplots_adjust(left=0.2) # Has no effect with inline, but works as expected with qt
figure()
plot(rand(100)*10000) # Will result in a larger left margin for this figure...
subplots_adjust(left=0.2)

那么,怎么才能关闭这个功能呢?谢谢~

编辑

为了让这里的问题更清楚(感谢Anzel),第二个图形因为y轴标签显示的数字更多,所以在使用bbox_inches='tight'选项自动调整布局后,会有更大的左边距(和更小的右边距)。这个选项是notebook内部调用的,用来生成嵌入的png输出。这样会有效地截断我用subplots_adjust()故意留出的额外空间,导致第二个图形看起来向右偏移,无法与第一个图形在垂直方向上“对齐”。

很容易理解我的意思——只需尝试上面的代码片段就可以了:)

我之所以不使用subplot/subplots(见对Anzel回答的评论),是因为在这个特定情况下,这两个图形实际上都是由几十个小子图组成的,还有一些额外的格式和标签。把它们合并成一个更大的子图数组并不是一件简单的事……

暂无标签

2 个回答

1

你可以使用 pyplot.subplots 来把图表排成网格,这样在笔记本里看起来就会整齐对齐(如果你想要这样的话)。

大概是这样的:

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

d1 = np.random.rand(100)
d2 = np.random.rand(100)*10000

fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1)
plt.subplots_adjust(left=0.2)
ax1.plot(d1)
ax2.plot(d2)

更新

由于提问者需要使用单独的图表而不是子图,这里有一个比较简单的解决办法。这在我的笔记本上是有效的,关于如何自定义的更多细节可以在 这里 找到。

import matplotlib.pyplot as plt
import numpy as np

%matplotlib inline

# to override ytick.major.width before any plot
plt.rcParams['ytick.major.pad'] = 20
plt.plot(np.random.rand(100))

# another override to set alignment for the plot 
plt.rcParams['ytick.major.pad'] = 5
plt.figure()
plt.plot(np.random.rand(100)*10000)

图表

# plt.rcdefaults() will reset everything to defaults as the doc says.

虽然不是最优雅的方式,但它能满足需求。

7

这里有个更详细的回答:Matplotlib和Ipython-notebook:显示将要保存的确切图形

诀窍是要关闭ipython中的bbox_inches='tight'设置。虽然这样做有点麻烦,但只需在一个代码块中运行这个IPython魔法命令:%config InlineBackend.print_figure_kwargs = {'bbox_inches':None}

如果你想恢复到正常的方式,也就是坐标轴标签不会被切掉,你可以运行%config InlineBackend.print_figure_kwargs = {'bbox_inches':'tight'},但这个命令必须在你绘制需要精确边界框的图形之后运行。

撰写回答