在ipython笔记本中使用matplotlib内联后端时,默认行为是使用bbox_inches =' tight'通过savefig()在内部生成嵌入的png图像。这消除了轴周围的空白,在大多数情况下都很好。
然而,有时人们可能想要(暂时)禁用此功能,例如,当他想手动保持两个数字垂直对齐时(假设我们不想在这里使用子图):< / p>
%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触发自动布局调整后,左边距会更大(右边距更小) =&#39;紧&#39; savefig()中的选项,由notebook在内部调用以生成嵌入式png输出。它会有效地截断我故意用subplots_adjust()创建的任何额外空间,这样第二个数字似乎会向右移动,而不是垂直移动&#34;对齐&#34;第一个数字。
很容易看出我的意思 - 只需尝试上面的代码片段:)
我在这里不使用子图/子图的原因(参见Anzel的回答)是在这个特殊情况下,这两个数字实际上是由数十个小子图组成的,加上一些额外的格式/标签。将它们合并为一个更大的子图阵列并非易事......
答案 0 :(得分:5)
这里有一个更全面的答案:Matplotlib and Ipython-notebook: Displaying exactly the figure that will be saved
诀窍是关闭ipython中的bbox_inches='tight'
设置。临时做有点尴尬,但只是在一个块中运行IPython魔术:%config InlineBackend.print_figure_kwargs = {'bbox_inches':None}
如果要切换回正常方式,轴标签自动永不切割,您可以运行%config InlineBackend.print_figure_kwargs = {'bbox_inches':'tight'}
,但必须在执行需要精确边界框的绘图的块之后。< / p>
答案 1 :(得分:0)
您可以使用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解决方案。这适用于我的笔记本,可以找到有关自定义的更多详细信息HERE。
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.
不是最优雅的方式,但它可以按要求运作。