在具有插入轴的图中,我想使用mpl_toolkits.axes_grid1.inset_locator.mark_inset标记插入。但是,我在控制zorder和裁剪标记插图的结果行时遇到麻烦。插入轴设置为zorder=4
,我正在使用:
fig = plt.figure()
fig.set_tight_layout(False)
ax = fig.gca()
x = np.arange(4500.0, 10000.0)
ax.plot(x, 700-x/20.0+20*np.sin(x/8.0), label="Skylines")
from mpl_toolkits.axes_grid1.inset_locator import InsetPosition, mark_inset, inset_axes
inset_ax = fig.add_axes([0,0,1,1], zorder=4, frameon=True)
inset_ax.set_axes_locator(InsetPosition(ax, [0.1, 0.1, 0.4, 0.5]))
inset_ax.plot(x, 700-x/20.0+20*np.sin(x/8.0))
inset_ax.set_xlim(8800, 8850)
inset_ax.set_ylim(230, 285)
# inset_ax.set_ylim(100, 600)
mark_inset(ax, inset_ax, loc1=2, loc2=3, linewidth=0.7, fc="None", ec='k', alpha=0.4, clip_on=True, zorder=3)
ax.axhline(y=300, c='r', label="Test")
leg = ax.legend(ncol=1, loc='upper center', frameon=True, framealpha=1.0)
leg.set_zorder(5)
plt.show()
对于y个极限的两种不同情况,得出
此处的不良行为是,插入线跨插入轴显示(而标记为Test的线恰好位于插入轴的后面),并且分别位于主轴的外部(并穿过图例)。我本来希望
zorder
和clip_on
参数可以解决此问题,但是它们似乎没有效果。 最佳答案
情况1zorder
在每个轴上进行评估。由于连接线已添加到插入轴,因此它们将始终位于轴背景的顶部。一种选择是将它们从插入轴中删除并将其添加到原始轴中。
情况二
显然,matplotlib源代码中没有剪切连接器,因为作为插入轴的一部分,您永远不会希望它们被插入轴剪切。
但是,如果它们是原始轴的一部分,则可以再次将裁剪设置为on。
总共
ret = mark_inset(ax, inset_ax, loc1=2, loc2=3, linewidth=0.7, fc="None", ec='k', alpha=0.4)
for bc in ret[1:]:
bc.remove()
ax.add_patch(bc)
bc.set_zorder(4)
bc.set_clip_on(True)