Рубрики
Без рубрики

Виджеты Matplotlib – создание интерактивных участков со слайдами

В этой статье описывается, как генерировать интерактивные участки с помощью пакета .Widgets из библиотеки MATPLOTLIB. Как можно вывести из имени, пакет .Widgets позволяет создавать различные типы интерактивных кнопок, которые могут быть использованы для изменения того, что отображается в графике MATPLOTLIB. https://youtu.be/Hn24Q9MPAsk В частности, эта статья будет сосредоточиться на … MATPLOTLIB виджетов – создание интерактивных участков с ползуншими Подробнее »

Автор оригинала: Andrea Ridolfi.

Эта статья описывает, как генерировать интерактивные участки, используя .widgets Пакет из Библиотека Matplotlib Отказ Как можно вывести из имени, .widgets Пакет позволяет создавать различные типы интерактивных кнопок, которые могут быть использованы для изменения того, что отображается в графике MATPLOTLIB.

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

Но давайте начнем с окончания: Вот код, который вы собираетесь исследовать, а полученный участок:

import numpy as np
from scipy.interpolate import UnivariateSpline
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

# Initial x and y arrays
x = np.linspace(0, 10, 30)
y = np.sin(0.5*x)*np.sin(x*np.random.randn(30))

# Spline interpolation
spline = UnivariateSpline(x, y, s = 6)
x_spline = np.linspace(0, 10, 1000)
y_spline = spline(x_spline)

# Plotting
fig = plt.figure()
plt.subplots_adjust(bottom=0.25)
ax = fig.subplots()
p = ax.plot(x,y)
p, = ax.plot(x_spline, y_spline, 'g')

# Defining the Slider button
# xposition, yposition, width and height
ax_slide = plt.axes([0.25, 0.1, 0.65, 0.03])

# Properties of the slider
s_factor = Slider(ax_slide, 'Smoothing factor',
                  0.1, 6, valinit=6, valstep=0.2)

# Updating the plot
def update(val):
    current_v = s_factor.val
    spline = UnivariateSpline(x, y, s = current_v)
    p.set_ydata(spline(x_spline))
    #redrawing the figure
    fig.canvas.draw()
    
# Calling the function "update" when the value of the slider is changed
s_factor.on_changed(update)
plt.show()

Выходные данные – это интерактивное окно сюжет Python, которое позволяет управлять графиком со слайдером:

Вы можете попробовать запустить его в вашем браузере в следующем Интерактивный ноутбук Jupyter Я создал для вас:

Давайте погрузимся в код и исследуйте его пошаговый.

Импорт библиотек

  • Прежде всего, мы начинаем, импортируя все пакеты, которые будут использоваться в этом примере. Мы будем использовать Numpy Для определения начальной функции и UnivariateSpline , от Scipy.interpolate Пакет для создания кривой стрной линии, которая будет интерполировать начальную функцию.
  • После этого нам нужно импортировать matplotlib.pyplot для построения.
  • Наконец, мы импортируем пакет Слайдер , от matplotlib.widgets Библиотека, это позволит нам интерактивно изменить уже нанесенную кривую стрига.

Следующие строки кода описывают импорт вышеупомянутых пакетов.

import numpy as np
from scipy.interpolate import UnivariateSpline
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider 

Определение начальной функции, которая будет оснащена стр.

Чтобы определить начальную функцию, мы создаем два массива «X» и «Y», которые содержат точки данных, описывающие функцию.

Массив «X» определяется путем эксплуатации .linspace. () Функция от Numpy; В частности, мы инициализируем массив 30 номеров от 0 до 10.

Массив «Y» описывается более сложной функцией, чтобы сделать приближение сплайщиков, и, следовательно, уметь оценить эффект изменения параметров определения СПП. Как вы можете видеть в следующих строках кода, массив «Y» определяется комбинацией .sin () и .RANDOM.RANDN () Функции, оба принадлежащие numpy библиотеку.

#initial x and y arrays
x = np.linspace(0, 10, 30)
y = np.sin(0.5*x)*np.sin(x*np.random.randn(30)) 

Создание кривой СПП

Мы продолжаем дальше с генерацией кривой ствола, которая должна соответствовать начальной функции.

  • Ансамбль функций, описывающих сплайн, присваивается переменной «Сплайн».
  • Функция, которая используется для генерации интерполяции сплайна, является .Univariatespline. () , от Scipy.interpolate библиотека.

Похожие учебники: Если вы заинтересованы в кривых СПП и их реализации в Python, Здесь вы можете найти специальную статью Отказ

Обязательные входы .Univariatesplin E-Функция – это массивы «X» и «Y», мы указываем Коэффициент сглаживания , параметр, который определяет точность интерполяции сплайна; Он в основном говорит о функции, когда остановить процесс интерполяции, основанный на разнице между реальными значениями и интерполированными.

Для первого сплайна мы вставляем «6» в качестве начального значения для коэффициента сглаживания. После вызова функции SPLED мы определяем массивы X и Y, которые содержат точки, описывающие кривую СПП, называемые x_spline и y_spline , соответственно.

#Spline interpolation
spline = UnivariateSpline(x, y, s = 6)
x_spline = np.linspace(0, 10, 1000)
y_spline = spline(x_spline)

Заговор

Следующий шаг включает в себя построение начальной функции и кривой СПП, которые мы только что определены. Мы перемещаем окно, в котором будет отображаться график немного вверх, используя команду plt.subplots_adjust (dote = 0.25) в котором мы должны указать пространство, которое мы хотим продолжать пустым вдоль границ; На этот раз мы просто хотим некоторое пространство в нижней части окна, чтобы иметь возможность добавить ползунок.

Последнее важное значение относительно этого шага – добавить «», после переменной, в которой мы храним график («p»); Это позволяет нам распаковать одно значение в «P», и, следовательно, дает возможность действовать на нем.

Следующие кодовые линии объясняют, как построить начальную функцию и кривую сплайна.

#Plotting
fig = plt.figure()
plt.subplots_adjust(bottom = 0.25)
ax = fig.subplots()
p = ax.plot(x,y)
p, = ax.plot(x_spline, y_spline, 'g')

Мы не добавляем команду « PLT.Show () », поскольку мы все еще должны включать определение ползунка.

Как представить кнопку ползунка в окно сюжета

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

Для этой цели мы впервые создаем пространство, которое будет посвящено ползунку с помощью функции matlplotlib .axes () Это добавляет оси на текущую цифру ( Дополнительная документация здесь ).

В качестве ввода этой функции мы вставляем список значений, эти значения представляют горизонтальное и вертикальное положение ползунка, его ширина и высоту соответственно.

#Defining the Slider button
ax_slide = plt.axes([0.25, 0.1, 0.65, 0.03]) #xposition, yposition, width and height

После создания пространства для ползунка мы теперь должны указать характеристики кнопки. Мы делаем это, используя соответствующую функцию, Слайдер , В котором мы указываем несколько свойств, связанных с кнопкой.

Первый вход указывает местоположение, в котором будет расположен слайдер, мы добавляем « AX_SLIDE », которая является переменной, называемой, только что созданный на предыдущем шаге. После этого мы можем указать метку, которая появится рядом с ползунком (мы используем » Коэффициент сглаживания «), минимальные и максимальные значения, начальное значение и приращение устройства.

Вы можете найти всестороннее описание всех этих параметров здесь: https://matplotlib.org/3.3.3/api/widgets_api.html . Отказ

#Properties of the slider
s_factor = Slider(ax_slide, 'Smoothing factor', 0.1, 6, valinit=6, valstep=0.2)

Таблица 1 суммирует параметры, используемые при вызове функции «слайдер».

Функция ползунка
Синтаксис: Слайдер
Параметры: топор Оси, определяющие пространство, в котором будет расположен слайдер
метка Этикетка, которая появляется на кнопке слайдера
вальмин Минимальное значение слайдера
вальмакс Максимальное значение слайдера
Valinit. Начальное значение слайдера
Valstep. Шаг приращение слайдера
Возвращаемое значение Никто

Таблица 1: Определение функции ползунка и ее параметров.

Обновление графика на изменяющемся значении слайдера

На данный момент мы создали ползунок, если мы с этим построим, мы уже можем изменять его значение, но наши действия не будут генерировать никакой модификации на участке; Это потому, что мы все еще должны связать значения в ползунке к те, которые нанесены на рисунке.

Для достижения этой задачи нам нужно определить функцию, которая содержит Список действий, которые будут приняты всякий раз, когда значение слайдера изменяется. Функция будет называться «Обновление» и будет принимать в качестве входных данных только одно числовое значение, соответствующее значению, выбранному на слайдере. В этой функции мы создаем локальную переменную « leathe_v », в которой мы храним значение ползунка, применяя метод « .Val » на слайдере, который мы ранее создали ранее (« S_Factor »).

Теперь, когда мы сохранили обновленное значение ползунка, мы должны повторить шаг интерполяции сплайна, чтобы обновить кривую сплайна; В этом вызове мы вставляем « leath_v » в качестве значения для нового коэффициента сглаживания.

Таким образом, каждый раз, когда слайдер будет изменен, функция будет повторять интерполяцию сплайна с помощью нового значения, указанного на слайдере, как новый коэффициент сглаживания. Затем мы устанавливаем новые значения на графике командой .set_ydata. () Применительно к переменной, описывающему графику (« P »). Последний шаг – перерисовать текущую фигуру с обновленными данными, это выполняется функцией MATPLOTLIB .рисовать ()

Связанный : Здесь вы найдете официальную документацию: https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.draw.html.

#Updating the plot
def update(val):
    current_v = s_factor.val
    spline = UnivariateSpline(x, y, s = current_v)
    p.set_ydata(spline(x_spline))
    fig.canvas.draw()  #redrawing the figure

Самое последнее, что следует указать, – это событие, которое будет вызвать вызов функции «Обновить».

Мы хотим, чтобы сюжет был обновлен каждый раз, когда значение слайдера изменяется; Мы можем сделать это, используя метод .on_Changed () , применяется к переменной « S_Factor », который относится к слайдере.

В качестве ввода этой команды мы должны указать, что делать, когда значение слайдера изменяется; Как уже говорилось, мы хотим запустить функцию «Обновить» для запуска каждой модификации слайдера, чтобы повторить процедуру интерполяции сплайна.

После этого мы, наконец, можно ввести « PLT.Show () », чтобы построить график и начать играть с нашей кнопкой ползуна! Как вы можете заметить, тем больше мы уменьшаем коэффициент сглаживания, тем лучше интерполяция сплайна.

#calling the function "update" when the value of the slider is changed
s_factor.on_changed(update) 
plt.show() 

Следующие GIF отображают окончательный результат для этого примера.

Оригинал: “https://blog.finxter.com/matplotlib-widgets-sliders/”