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

MATPLOTLIB виджеты – Как сделать ваш участок интерактивным с помощью кнопок

https://youtu.be/YmE-fL3TP64 В этой статье представлены различные типы виджетов, которые могут быть встроены в фигуру MATPLOTLIB, чтобы создать и персонализировать высоко интерактивные участки. Используя пакет MATPLOTLIB .widget (), следовательно, возможно создать персонализированные кнопки, которые позволяют управлять различными свойствами графиков, которые построены в главном окне. Это представляет … matplotlib виджеты – как сделать ваш участок интерактивным с кнопками Подробнее »

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

В этой статье представлены различные типы виджетов, которые могут быть встроены в Матплотлиб Рисунок, чтобы создать и персонализировать высоко интерактивные участки. Использование пакета MatPlotlib .widget () , Следовательно, возможно создать персонализированные кнопки, которые позволяют управлять различными свойствами графиков, которые построены в главном окне. Это представляет практическое и творческое решение для изменения некоторых свойств сюжета, пока он продолжает отображаться в окне Active MatPlotlib. Более конкретно, в этой статье будут представлены три различных типа виджетов:

  • Кнопка
  • Радио-кнопки
  • Проверьте кнопки

MATPLOTLIB виджеты – интерактивный ноутбук Jupyter

Я создал Интерактивный ноутбук Jupyter Для вас, чтобы запустить код, обсуждаемый в этой статье в интерактивном режиме:

MATPLOTLIB виджеты пример кода

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

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button, RadioButtons, CheckButtons

# x and y arrays definition
x = np.linspace(0, 10, 50)
y = np.sin(x**2)*np.exp(x)

# Plotting
fig = plt.figure()
ax = fig.subplots()
plt.subplots_adjust(left = 0.3, bottom = 0.25)
p, = ax.plot(x, y, color = 'b', label = 'Plot 1')

#---BUTTON-----

# xposition, yposition, width, height
ax_button = plt.axes([0.25, 0.1, 0.08, 0.05])

# properties of the button
grid_button = Button(ax_button, 'Grid', color='white', hovercolor='grey')

# enabling/disabling the grid
def grid(val):
    ax.grid()
    fig.canvas.draw() #redraw the figure


# triggering event is the clicking
grid_button.on_clicked(grid)


#-----RADIO BUTTONS----

ax_color = plt.axes([0.02, 0.5, 0.2, 0.3])
color_button = RadioButtons(ax_color, ['red', 'green', 'blue', 'black'],
                            [False, False, True, False], activecolor= 'r')

# function for changing the plot color
def color(labels):
    p.set_color(labels)
    fig.canvas.draw()
color_button.on_clicked(color)


#----CHECK BUTTONS----

# defining a second function
y1 = -1*np.sin(x**2)*np.exp(x)
p1, = ax.plot(x, y1, color = 'b', label = 'Plot 2', visible = False)
plots =[p, p1]
activated = [True, False]
labels = ['Plot 1', 'Plot 2']

# instance the axes
ax_check = plt.axes([0.7, 0.05, 0.08, 0.1])
plot_button = CheckButtons(ax_check,labels, activated)


# function for displaying/hiding the plots
def select_plot(label):
    
    # get the index that corresponds to the word "label"
    index = labels.index(label)
    
    # set the plot to visible
    plots[index].set_visible(not plots[index].get_visible())
    fig.canvas.draw()

    
plot_button.on_clicked(select_plot)
plt.show()

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

Как обычно, мы запускаем скрипт, импортируя различные библиотеки и пакеты, которые будут необходимы для создания наших интерактивных участков. В дополнение к классическому Numpy и matplotlib.pyplot, Мы также имеем также импортировать функции, которые приходится на кнопки, которые будут затем созданы. Как ожидалось в предыдущей части, функции являются Кнопка, радиобуттоны и контрольные буквы; Все они принадлежат к пакету Matplotlib .widgets.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button, RadioButtons, CheckButtons

Создание функции

Начнем с определения математической функции, которая будет построена в окне MatPlotlib; Он описывается массивами «X» и «Y». Для определения массива «X» .linspace () Функция, из Numpy , используется для получения массива 50 одинаково расположенных номеров от 0 до 10. Массив «Y» содержит значения функции:

Y (X. 2 )e x

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

# x and y arrays for function definition
x = np.linspace(0, 10,50)
y = np.sin(x**2) * np.exp(x)

Определение начального сюжета

Как только мы определили функцию, мы продолжаем дальше, создавая окно MATPLOTLIB, в котором мы создадим наш сюжет; Для этого мы используем классические функции MATPLOTLIB .figure () и .subplots () Отказ Для того, чтобы иметь достаточное пространство для вставки различных кнопок, размер и положение графика регулируются путем эксплуатации функции. subplots_adjust () и указание (в входных параметрах) пространство, которое необходимо вдоль каждой границы сюжета. В этом случае достаточно создать некоторое пространство слева и на нижней сторонах графика. В конце массива «X» и «Y» нанесены в виде непрерывной синей линии; Этикетка «Участок 1» также назначается на этот первый график. Важно помнить, чтобы помнить запятую после имени переменной, которая относится к сюжету («P»), чтобы иметь возможность изменять свои свойства во второй раз.

#Definition of the initial plot
fig = plt.figure()
ax = fig.subplots()
plt.subplots_adjust(left = 0.3, bottom = 0.25)
p, = ax.plot(x,y, color = 'b', label = 'Plot 1')

Кнопка виджет

Кнопка
Синтаксис: Кнопка()
Параметры: топор (переменная) Оси, определяющие пространство, в котором кнопка будет расположена
Метка (ул) Этикетка, которая появляется на кнопке
Цвет (ул или поплавок) Цвет кнопки
HoverColor (ул. или поплавок) Цвет кнопки, когда он нажал
Возвращаемое значение Никто

Таблица 1: Функция Кнопка () и параметры, определенные в этом скрипте.

Первый виджет, который будет реализован на участке, является простым кнопкой. Этот тип кнопок обеспечивает возможность переключения от включения и наоборот, одно свойство сюжета. Это означает, что эта кнопка может быть ответственна за только одно свойство. Если мы хотим контролировать еще одно свойство сюжета, мы должны создать вторую кнопку. В этом примере кнопка виджета создается для того, чтобы иметь возможность отображать/скрыть сетку графика. Начнем с определения позиции и размера нашей кнопки, это делается путем создания так называемых «осей», которые в Python представляют собой пространство, которое может быть заполнено другой информацией (свойства кнопки). Функция MATPLOTLIB, которая эксплуатируется для этой цели, называется .axes () и принимает в качестве ввода, список значений, соответствующих горизонтальному, вертикальному положению, ширину и высоту кнопки.

#---BUTTON----
#Buttons
ax_button = plt.axes([0.25, 0.1, 0.08,0.05]) #xposition, yposition, width and height

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

#Properties of the button
grid_button = Button(ax_button, 'Grid', color = 'white', hovercolor = 'grey')

На данный момент мы должны указать, какая задача должна выполняться каждый раз, когда мы нажимаем на кнопку. Как уже говорилось, мы хотим использовать эту кнопку для отображения/скрыть сетку; Для достижения этой задачи. Мы определяем функцию под названием Сетка (), в котором мы определяем команду AX.GRID () Для отображения сетки в окне построения. В конце мы перерезаем рисунку, используя команду .canvas.draw. ().

#enabling/disabling the grid
def grid(val):
    ax.grid()
    fig.canvas.draw() #redraw the figure

Чтобы заключить эту первую часть, мы должны указать событие, которое будет вызвать выполнение Сетка () функция. Мы применяем метод .on_clicked () К переменной «GRID_BUTTON», указав в качестве ввода функции сетка; Таким образом, каждый раз, когда мы нажимаем на кнопку, скрипт запускает функцию сетка.

#calling the function "grid" when the button gets clicked
grid_button.on_clicked(grid)

На рисунке 1 отображается окончательный выход этого первого скрипта (если вы хотите получить результат, показанный на рисунке 1, просто добавьте другую строку в свой код, запись «PLT.Show ()», чтобы отобразить сюжет, который вы только что создали; я буду Отображение графика в конце, чтобы все были включены виджеты).

Рисунок 1: Окно Matplotlib, которое появляется как результат первой части сценария. Сюжет был сдвинут вверх и к левой границе, чтобы создать некоторое пространство для виджетов. В нижней левой части рисунка виджет Кнопка был включен; Его функция – отображение/скрыть сетку каждый раз, когда он нажал.

Виджет радиобаттонов

Радио-кнопки
Синтаксис: Радио-кнопки
Параметры: топор (переменная) Оси, определяющие пространство, в котором будут расположены радиопередачи
Метки (список) Метки каждой кнопки
Активный (список) Список логиров, описывающих состояние каждой кнопки
ActiveceColor (str или float) Цвет активной кнопки
Возвращаемое значение Никто

Таблица 2: Функция Радиообуттон и параметры, определенные в этом скрипте.

Второй виджет, который будет реализован на нашем сюжете, является так называемый Радио-кнопки . Он состоит из серии круглых кнопок, которые могут быть использованы для включения/отключения одного среди различных свойств нашего сюжета. В этом случае три кнопки переключателя будут использоваться для предоставления пользователю возможность выбрать среди четырех разных цветов для отображаемого графика. Каждый раз, когда нажат один из кнопок радиопередачи, график изменит свой цвет в соответствии с выбранным. Как и в первой части, первое, что нужно сделать, это определить местоположение и размер нашего виджета, установив так называемые «оси»; После этого мы определяем свойства этих кнопок с помощью выделенной функции Радиообуттон, И мы назначаем их переменной «Color_Button». Как видно из строк кодовых линий, функция Радиообуттон принимает в качестве ввода осей, в которых мы хотим разместить кнопки, этикетки каждой кнопки и их состояние активации (данные логическими операторами True или false). Также возможно указать опцию «ActiveColor», что указывает цвет текущей активной радиоприемки; Все эти варианты суммированы в таблице 2.

#---RADIO BUTTONS----
ax_color = plt.axes([0.02, 0.5, 0.2,0.3]) #xposition, yposition, width and height
#Properties of the Radio buttons
color_button = RadioButtons(ax_color, ['red', 'green', 'blue', 'black'], active = [True, False, False, False], activecolor = 'r')

После того, как переключатели будут правильно определены, они должны быть связаны с функцией, описывающей задачу, которая будет выполняться на каждом клике. Для этого примера функция должна изменить цвет графика в соответствии с параметрами, отображаемыми в виджете. Для этого метод .et_color. () применяется к переменной «P», которая учитывает сюжет; Этот метод принимает в качестве ввода Имя цвета (строка), который должен быть применен к графику. Входная переменная функции – «метки» и содержит метку кнопки нажатой; Мы, отсюда пройдем эту переменную к .et_color. () также. Чтобы завершить определение функции, мы перерезаем рисунок и указываем, когда она должна быть запущена, то есть каждый раз, когда нажата кнопка «Color_Button». Следующие строки кода описывают эти процедуры.

#function for changing the color of the plot
def color(labels):
    p.set_color(labels)
    fig.canvas.draw ()
#calling the function "color" when the radio button gets clicked
color_button.on_clicked(color) 

Результаты этой второй части отображаются на рисунке 2 вместе с виджетом «кнопки», указанного в первой части.

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

Виджет CheckButtons

CheckButtons.
Синтаксис: CheckButtons.
Параметры: топор (переменная) Оси, определяющие пространство, в котором будут расположены кнопки проверки
Метки (список) Метки каждой кнопки
Активы (список) Список логиров, описывающих состояние каждой кнопки
Возвращаемое значение Никто

Таблица 3: Функция CheckButtons и параметры, определенные в этом скрипте.

Третий виджет, который будет реализован на сюжете, является так называемый CheckButtons. Этот виджет аналогичен предыдущему, но он имеет некоторые важные различия. Помимо визуального внешнего вида, здесь у нас есть, что кнопки прямоугольные, и они пересекаются при активации; Наиболее существенным отличием в отношении принципа работы: с радиообуттонами можно было выбрать только один вариант за раз, включение опции автоматически отключит в текущую активную; Вместо этого с CheckButtons можно активировать несколько кнопок за раз. Эта функция может быть полезна всякой, когда мы хотим контролировать два или более свойств нашего сюжета, который может быть активен в то же время. В следующем примере CheckButtons Виджет будет использоваться для включения визуализации второго графа на нашем участке. Эта задача не может быть достигнута Радиообуттон , поскольку он позволяет только активировать один из его вариантов одновременно. Перед определением виджета должен быть определен второй график (функция называется Y1); Он будет назначен переменной «P1». Как вы можете видеть в следующих строках кода, мы также указываем начальную видимость сюжета, устанавливая его на false, чтобы не показывать его автоматически. Затем мы определяем три списка «участки», «активированные» и «этикетки», которые содержат два участка, их состояние видимости и их метки соответственно.

#-----CHECK BUTTON------
#defining a second plot
y1 = -1*np.sin(x**2)*np.exp(x)
p1, = ax.plot(x,y1, color = 'b', label = 'Plot 2', visible = False)
plots = [p, p1]
activated = [True, False]
labels = ['Plot 1', 'Plot 2']

После этого мы определяем местоположение, размер и свойства радиопередач. Это очень похоже на то, что уже было показано на двух предыдущих частях. Свойства виджета определяются через соответствующую функцию CheckButtons () который принимает в качестве ввода оси (пространство, в котором будет создана кнопка), список, содержащий метки различных кнопок и списком, учитывая их состояние активации, связано (в этом примере) к видимости участков; Все эти функции суммированы в таблице 3.

#Properties of the Check buttons
ax_check = plt.axes([0.7, 0.05, 0.08,0.1]) #xposition, yposition, width and height
plot_button = CheckButtons(ax_check, labels , activated)

На данный момент мы должны определить функцию, которая выполнит желаемую задачу, то есть включение/отключение графов. Функция определяется названием select_plot () и принимает в качестве входной метки, которая соответствует опции нажатой. После получения этикетки выбранной кнопки мы должны определить индекс элемента в списке «Метки», оно соответствует. Для этого мы применяем метод .index () в список «Ярлыки», и мы храним это значение в переменной индексе. Теперь, когда мы знаем, какие из двух участков мы хотим включить/отключить, мы изменяем его видимость, набрав следующую команду: Сюжеты [индекс] .set_visible (не сюжеты [индекс] .get_visible ()) ; где мы впервые обращаемся к желаемую графику через участки [индекс], а затем мы применяем метод .set_visible. () Для доступа к недвижимости «Видимый» (подробнее документация здесь: https://www.geeksforgeeks.org/matplotlib-axs-axes-set_visible-in-python/ ); Чтобы изменить его значение, мы сначала получим текущее состояние, используя метод .get_fisible. () И затем возьмите его наоборот (дополнительная документация здесь: https://www.geeksforgeks.org/matplotlib-axes-axes-get_visible-in-python/ ). Все процедуры описаны в следующих строках кода.

#function for displaying the plots
def select_plot(label):
    #get the index that corresponds to the word "label" within the list labels
    index = labels.index(label)
    #set the selected plot to visible
    plots[index].set_visible(not plots[index].get_visible()) 
    fig.canvas.draw()   

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

plot_button.on_clicked(select_plot)
plt.show() 

На рисунке 3 описываются окончательный выход этого скрипта, также включающий в себя предыдущие две виджеты.

Рисунок 3: Окно Final MatPlotlib с участием всех трех виджетов. Обе участки устанавливаются для видимы, как видно в CheckButtons Виджет, а также сетка. Цвет первого участка установлен на зеленый через Радиообуттон виджет.

Выводы

В этой статье мы видели, как реализовать три различных типа виджета в окне MATPLOTLIB. Все виджеты имеют отчетливые свойства, что делает их более подходящими для конкретных задач. Они представляют собой практическое решение для изменения некоторых свойств в рамках сюжета, без необходимости закрывать окно, изменяя сценарий и снова компилируйте. Конечно, существуют много разных задач, которые могут быть назначены каждой из этих кнопок, это просто зависит от ваших потребностей; Если вы хотите узнать больше о matplotlib.widget Пакет, вы можете найти дополнительную информацию по этой ссылке: https://matplotlib.org/3.3.3/api/widgets_api.html . Отказ

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