如何禁用bbox_英寸=';紧密的';在ipython笔记本中使用matplotlib内联时

如何禁用bbox_英寸=';紧密的';在ipython笔记本中使用matplotlib内联时,python,matplotlib,ipython,ipython-notebook,Python,Matplotlib,Ipython,Ipython Notebook,在ipython笔记本中使用matplotlib内联后端时,默认行为是使用bbox_inches='tight'通过savefig()在内部生成嵌入的png图像。这消除了轴周围的空白,在大多数情况下非常有用 但是,有时可能需要(暂时)禁用此功能,例如,当他想要手动保持两个图形垂直对齐时(假设我们不想在此处使用子图): 那么如何禁用这种行为呢?谢谢~ 编辑 为了使此处涉及的问题更加明确(感谢Anzel),由于yticklabels中要显示更多的数字,在savefig()中的bbox_inches=

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

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

那么如何禁用这种行为呢?谢谢~

编辑 为了使此处涉及的问题更加明确(感谢Anzel),由于yticklabels中要显示更多的数字,在savefig()中的bbox_inches='tight'选项触发自动布局调整后,第二个图形将具有更大的左边距(和更小的右边距),笔记本电脑内部调用它来生成嵌入式png输出。它将有效地截断我有意使用subplot_adjust()创建的任何额外空间,这样第二个图形似乎会向右移动,而不是与第一个图形垂直“对齐”

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


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

您可以使用
pyplot.subplot
以网格顺序对齐图,以便在笔记本中直观地对齐图形(如果您需要的话?)

大概是这样的:

%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要求使用单独的绘图而不是子绘图,这里有一个黑客解决方案。这是我的笔记本上的工作,更多关于定制的细节可以找到


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

这里有一个更完整的答案:

诀窍是关闭ipython中的
bbox\u inches='tight'
设置。暂时这样做有点尴尬,但只需在块中运行IPython魔术:
%config InlineBackend.print\u figure\u kwargs={'bbox\u inches':None}


如果要切换回正常方式,即轴标签不会自动剪切,可以运行
%config InlineBackend.print\u figure\u kwargs={'bbox\u inches':'tight'}
但它必须位于需要精确边界框的绘图块之后。

为什么不使用
matplotlib.pyplot
?只是为了方便起见。我认为matplotlib.pyplot.plot和pylab.plot是等效的。Pylplot是matplotlib内置的,你不一定需要导入pylab,这就是我的意思。更重要的是,我不认为我完全达到了你想要的效果,你想在笔记本电脑中动态地将轴标签设置得更窄更宽吗?本质上,我想更改轴的左边距(从默认的0.1更改为0.2),以便在笔记本中两个图形的轴框/框在视觉上对齐。谢谢,Anzel~子图/子图确实是显而易见的方法。然而,正如我在问题中提到的,有时我们不想使用这个选项。在我的例子中,这两个图本身由几十个小的子图组成,再加上一些附加的格式/标签。将它们合并到一个更大的子地块数组中并非易事,因此最好在图形级别进行操作。唯一需要做的是调整轴的左边距,这很容易在qt后端调整子批次。但对于内联后端,内部使用的bbox_inches='tight'选项会干扰这一点。@herrlich10,我终于找到了一个相当粗糙的解决方案。查看我的更新
%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.