在 ipython 笔记本中使用 matplotlib 内联时如何禁用 bbox_inches='tight'

问题描述 投票:0回答:2

在 ipython Notebook 中使用 matplotlib 内联后端时,默认行为是使用 bbox_inches='tight' 通过 savefig() 在内部生成嵌入的 png 图像。这消除了轴周围的空白,在大多数情况下都很好。

但是,有时人们可能想(暂时)禁用此功能,例如,当他想要手动保持两个图形垂直对齐时(假设我们不想在此处使用子图):

%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),第二张图,由于yticklabels中要显示的数字更多,在bbox_inches='触发自动布局调整后,左边距会更大(右边距更小) savefig() 中的“tight”选项,由笔记本内部调用以生成嵌入的 png 输出。它将有效地截断我故意使用 subplots_adjust() 制作的任何额外空间,以便第二个图看起来会向右移动,而不是与第一个图垂直“对齐”。

很容易明白我的意思——只需尝试上面的代码片段:)

我在这里不使用子图的原因(请参阅对 Anzel 答案的评论)是,在这种特殊情况下,这两个数字实际上本身由数十个小子图组成,加上一些额外的格式/标签。将它们合并到一个更大的子图数组中并不是一件容易的事......

python matplotlib ipython jupyter-notebook
2个回答
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'}
,但它必须在您进行需要精确边界框的绘图的块之后。


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)

更新

由于OP要求使用单独的图而不是子图,这里有一个hacky解决方案。这适用于我的笔记本,有关定制的更多详细信息可以在此处找到。

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)

The Plots

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

不是最优雅的方式,但它可以按要求工作。

© www.soinside.com 2019 - 2024. All rights reserved.