使用zoomed_inset_axes截断框

时间:2018-07-07 00:17:03

标签: python matplotlib

我想使用zoomed_inset_axes,但是一旦它通过主要图形的框,该框就会被截断。我再也无法得到

  • f.tight_layout()
  • f.subplots_adjust(bottom=...)
  • 'figure.autolayout': True
  • 即使在外面的某个地方使用f.text也不会隐藏(白色)文本。

有人知道如何正确执行此操作吗?

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes, mark_inset

X = np.random.normal(.5,10,1000)
Y = np.random.normal(.5,10,1000)

f, ax = plt.subplots(1, figsize=(10,6))

ax.scatter(X,Y)

# # Setup zoom window
axins = zoomed_inset_axes(ax, 2, loc="center", bbox_to_anchor=(0,0))
mark_inset(ax, axins, loc1=2, loc2=4, fc="none", ec="0.5")
axins.set_xlim([-15,0])
axins.set_ylim([-12,-3])

# # Plot zoom window
axins.scatter(X,Y)

f.tight_layout()
f.savefig('test.png', dpi=70)

inset truncated

1 个答案:

答案 0 :(得分:2)

使用subplots_adjust朝正确的方向发展。此后请勿使用tight_layout,因为这将覆盖通过subplots_adjust完成的所有设置。

您可能决定选择类似的东西

fig.subplots_adjust(left=0.2, bottom=0.2)

在图的左下角为插图留出一些空间。

然后您需要定位插图。由于您是在左下角工作,因此这相对容易。 loc参数需要设置在左下角,您可能会停留在bbox_to_anchor=(0,0)位置。然后只需通过borderpad=3添加一些填充(以字体大小为单位),以使插入轴的标签仍然可见,

zoomed_inset_axes(ax, 2, loc='lower left', bbox_to_anchor=(0,0), borderpad=3)

完整代码:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes, mark_inset

X = np.random.normal(.5,10,1000)
Y = np.random.normal(.5,10,1000)

fig, ax = plt.subplots(1, figsize=(10,6))
fig.subplots_adjust(left=0.2, bottom=0.2)
ax.scatter(X,Y)

# # Setup zoom window
axins = zoomed_inset_axes(ax, 2, loc='lower left', bbox_to_anchor=(0,0), borderpad=3)
mark_inset(ax, axins, loc1=2, loc2=4, fc="none", ec="0.5")
axins.set_xlim([-15,0])
axins.set_ylim([-12,-3])

# # Plot zoom window
axins.scatter(X,Y)


#fig.savefig('test.png', dpi=70)

plt.show()

enter image description here

通常,您有很多选择来定位和调整插图的大小。我最近在matplotlib页面上创建了一个新示例:Inset Locator Demo,该示例当前仅在devdocs中可用,以显示不同参数之间的相互作用(在这种情况下,inset_axes –但完全适用于zoomed_inset_axes)。