несколько интерактивных клеток графиков в Jupyter Notebook

Вопрос или проблема

Задача: Я провожу анализ, для которого необходимо несколько графиков. Первый график должен быть изменяемым и масштабируемым. Основываясь на том, что я вижу на первом графике, я создаю другие графики в новых ячейках. Эти графики не обязательно должны быть интерактивными. Важно следующее:
1- иметь возможность видеть и работать с первым графиком в любое время,
2- визуализировать другие графики в их ячейках и
3- иметь возможность выполнить “перезапуск и выполнить все”

Я пробовал %matplotlib nbagg для первого графика. Таким образом, первый график действительно будет интерактивным, когда я запускаю код по ячейкам. Однако когда я запускаю следующие ячейки с графиками, другие графики отображаются в первой ячейке, перезаписывая её, и графики не могут быть исследованы одновременно. Действительно, “перезапуск и выполнить все” затем отобразит только последний график.

Я пытался остановить интерактивное отображение после первой ячейки, используя %matplotlib inline, %matplotlib auto или plt.ioff(), но ничего из этого не сработало.

Мне интересно, может ли кто-то помочь мне с этим.
Спасибо заранее

Вот минимальный воспроизводимый пример

Первая ячейка блокнота считывает изображение и производит преобразование Фурье (ft), которое я хочу иметь возможность масштабировать в любое время

%matplotlib nbagg
from skimage import data, io
from skimage.draw import disk
import numpy as np
import matplotlib.pyplot as plt
img = data.checkerboard()
ft = np.abs(np.fft.fftshift(np.fft.fft2(np.fft.ifftshift(img))))
ft[ft.shape[0]//2,ft.shape[1]//2]=np.mean(ft)
plt.imshow(ft)

Вторая ячейка накладывает маску на один из пиков в ft и отображает выходное изображение. Это изображение должно отображаться в своей ячейке и не должно перезаписывать предыдущее изображение. Однако оно не обязательно должно быть интерактивным

%matplotlib inline
row, col = 96,104
rr, cc = disk((row, col), 7)
mask=np.zeros_like(img)
mask[rr, cc] = 1
plt.imshow(ft*mask)

Я использую виджет (требуется пакет ipympl) для интерактивных графиков.

Но я думаю, что ключ к получению отдельных фигур заключается в том, чтобы явно создавать новую фигуру для каждого графика:

%matplotlib widget
from skimage import data, io
from skimage.draw import disk
import numpy as np
import matplotlib.pyplot as plt
img = data.checkerboard()
ft = np.abs(np.fft.fftshift(np.fft.fft2(np.fft.ifftshift(img))))
ft[ft.shape[0]//2,ft.shape[1]//2]=np.mean(ft)
plt.figure()
plt.imshow(ft)
plt.show()

Ответ или решение

Для решения вашей задачи в Jupyter Notebook, в которой требуется создать несколько графиков, из которых первый должен быть интерактивным, а остальные — статичными, необходимо учитывать несколько важных аспектов работы с бэкендами Matplotlib.

Шаги для реализации

  1. Использование подходящего бэкенда:
    Для интерактивных графиков рекомендуется использовать ipympl, который предоставляет возможность zoom и resize. Вам нужно установить этот пакет:

    pip install ipympl
  2. Первый график:
    Для первого графика вы должны использовать бэкенд %matplotlib widget. Это позволит вам создать интерактивный график, который будет доступен для исследования:

    %matplotlib widget
    from skimage import data
    import numpy as np
    import matplotlib.pyplot as plt
    
    img = data.checkerboard()
    ft = np.abs(np.fft.fftshift(np.fft.fft2(np.fft.ifftshift(img))))
    ft[ft.shape[0]//2, ft.shape[1]//2] = np.mean(ft)
    
    plt.figure()
    plt.imshow(ft)
    plt.colorbar()
    plt.title("Fourier Transform")
    plt.show()
  3. Создание новых неперекрывающихся графиков:
    Для последующих графиков в других ячейках используйте бэкенд %matplotlib inline. Это предотвратит перекрытие графиков:

    %matplotlib inline
    from skimage.draw import disk
    
    row, col = 96, 104
    rr, cc = disk((row, col), 7)
    mask = np.zeros_like(img)
    mask[rr, cc] = 1
    
    plt.figure()
    plt.imshow(ft * mask)
    plt.colorbar()
    plt.title("Masked Fourier Transform")
    plt.show()
  4. Возможности и ограничения:

    • Убедитесь, что первая ячейка с интерактивным графиком выполнена первой и что вы переходите к следующим ячейкам только после того, как она будет завершена.
    • Если вы хотите запустить все ячейки одновременно, убедитесь, что каждая ячейка создает новые фигуры (с использованием plt.figure()), чтобы они не затирали друг друга.

Полезные советы

  • Экспорт графиков: Если вам нужно сохранить графики для дальнейшего анализа, можно использовать plt.savefig('filename.png') в ячейках, где generate статические графики.
  • Управление памятью: После демонстрации, например, больших массивов, важно очищать фигуры, чтобы избежать утечек памяти, используя plt.close('all').

Заключение

Следуя данным рекомендациям, вы сможете создать интерактивный график, который будет доступен для работы, и статические графики, которые можно будет просматривать в отдельных ячейках Jupyter Notebook.

Если у вас возникнут дополнительные вопросы или потребуется помощь с другим аспектом вашего анализа данных, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...