Как контролировать zorder и отсечение с помощью mpl_toolkits.axes_grid1.inset_locator.mark_inset? - PullRequest
1 голос
/ 08 июля 2019

На графике с осями вставки я хочу отметить эту вставку, используя 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 приводит к

enter image description here

enter image description here

Нежелательное поведение в данном случае заключается в том, что линии вставки появляются поперек осей вставки (в то время как линия, помеченная как «Тест», располагается точно за осями вставки), и за пределами главных осей (и через условные обозначения) соответственно. Я ожидал, что аргументы zorder и clip_on исправят это, но, похоже, они не дают эффекта.

1 Ответ

2 голосов
/ 08 июля 2019

Случай 1

zorder оценивается для каждой оси.Поскольку соединительные линии добавляются к осям вставки, они всегда будут сверху фона осей.Можно удалить их из осей вставки и добавить к исходной.

Случай 2

Разъемы явно не обрезаны в исходном коде matplotlib,потому что, как часть осей вставки, вы никогда не захотите, чтобы они были ограничены осями вставки.

Однако, если они являются частью исходных осей, вы можете снова включить отсечение.

Всего

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)

enter image description here enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...