Я хотел бы использовать виджеты ipython для добавления некоторой степени интерактивности к строкам matplotlib.
В целом сюжет может быть довольно тяжелым, и я хочу только обновить конкретный элемент сюжета. Я понимаю, что у виджета есть встроенная встроенная функция дросселирования, которая помогает не заливать ядро, но когда график берется, пусть говорят 30 секунд, я не хочу так долго ждать, чтобы обновить строку.
Прочитав ноутбуки с примерами, я смог создать базовый пример, в котором я добавляю перекрестный курсор (управляемый двумя ползунками) к оси mpl.
Проблема заключается в том, что рисунок отображается дважды. Вот код (ячейка 1):
fig, ax = plt.subplots()
ax.plot([3,1,2,4,0,5,3,2,0,2,4])
... фигура отображается..., ячейка 2 (редактирование: спасибо Thomas K за улучшение):
vline = ax.axvline(1)
hline = ax.axhline(0.5)
def set_cursor(x, y):
vline.set_xdata((x, x))
hline.set_ydata((y, y))
display(fig)
и, наконец, (ячейка 3):
interact(set_cursor, x=(1, 9, 0.01), y=(0, 5, 0.01))
снова показывает фигуру с виджетами.
Итак, вопрос:
- Как я могу запретить отображение первой фигуры?
- - это правильный способ сделать это или есть лучший подход?
ИЗМЕНИТЬ
Я нашел ручку конфигурации ipython, которая, согласно этому ноутбуку, позволяет запретить отображение фигур
%config InlineBackend.close_figures = False
В то время как пример ноутбука работает, я не могу понять, как использовать этот параметр сам по себе (без класса контекстного менеджера, представленного в связанном примере), чтобы скрыть отображение фигур.
РЕДАКТИРОВАТЬ 2
Я нашел некоторую документацию настраиваемого InlineBackend.close_figures
.
РЕДАКТИРОВАТЬ 3
Запущен на ответ @shadanan, я хочу уточнить, что моя цель - добавить курсор к существующей фигуре, не перерисовывая график с нуля при каждом перемещении курсора. Объединение трех ячеек в одной ячейке:
fig, ax = plt.subplots()
ax.plot([3,1,2,4,0,5,3,2,0,2,4])
vline = ax.axvline(1)
hline = ax.axhline(0.5)
def set_cursor(x, y):
vline.set_xdata((x, x))
hline.set_ydata((y, y))
display(fig)
interact(set_cursor, x=(1, 9, 0.01), y=(0, 5, 0.01))
он должен "работать", но это не так. При первом запуске ячейки отображаются две цифры. После взаимодействия с виджетами отображается только одна цифра. Это "странное поведение", которое требует обходного пути, как показано в ответе @shadanan. Может ли ipython dev прокомментировать это? Это ошибка?