Вопрос или проблема
Задача: Я провожу анализ, для которого необходимо несколько графиков. Первый график должен быть изменяемым и масштабируемым. Основываясь на том, что я вижу на первом графике, я создаю другие графики в новых ячейках. Эти графики не обязательно должны быть интерактивными. Важно следующее:
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.
Шаги для реализации
-
Использование подходящего бэкенда:
Для интерактивных графиков рекомендуется использоватьipympl
, который предоставляет возможность zoom и resize. Вам нужно установить этот пакет:pip install ipympl
-
Первый график:
Для первого графика вы должны использовать бэкенд%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()
-
Создание новых неперекрывающихся графиков:
Для последующих графиков в других ячейках используйте бэкенд%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()
-
Возможности и ограничения:
- Убедитесь, что первая ячейка с интерактивным графиком выполнена первой и что вы переходите к следующим ячейкам только после того, как она будет завершена.
- Если вы хотите запустить все ячейки одновременно, убедитесь, что каждая ячейка создает новые фигуры (с использованием
plt.figure()
), чтобы они не затирали друг друга.
Полезные советы
- Экспорт графиков: Если вам нужно сохранить графики для дальнейшего анализа, можно использовать
plt.savefig('filename.png')
в ячейках, где generate статические графики. - Управление памятью: После демонстрации, например, больших массивов, важно очищать фигуры, чтобы избежать утечек памяти, используя
plt.close('all')
.
Заключение
Следуя данным рекомендациям, вы сможете создать интерактивный график, который будет доступен для работы, и статические графики, которые можно будет просматривать в отдельных ячейках Jupyter Notebook.
Если у вас возникнут дополнительные вопросы или потребуется помощь с другим аспектом вашего анализа данных, не стесняйтесь спрашивать!