Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Виджеты Matplotlib

Matplotlib предназначен не только для статических графиков. Хотя графические интерфейсы обычно создаются с использованием библиотек и фреймворков графического интерфейса, таких как PyQt, Ткинтер, Kivy и WxPythonи хотя Python отлично интегрируется с PyQt, Tkinter и wxPython – нет необходимости использовать какой-либо из них для некоторых базовых функций графического интерфейса, поскольку Виджеты Matplotlib.

Ассоциация matplotlib.widgets модуль имеет несколько классов, включая AxesWidget, из которых Buttons, CheckButtons, Sliders, TextBoxes и т. д. являются производными. Все они принимают Axes они добавляются в качестве единственного обязательного аргумента конструктора, и их расположение необходимо устанавливать вручную. Следует отметить, что виджет - это оси, поэтому вы создадите Axes экземпляр для каждого виджета.

Еще следует отметить, что вам нужно сохранить ссылки на виджеты в противном случае их могут вывезти за мусор.

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

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

Если вы раньше работали с PyQt, вы могли заметить, что общий синтаксис и подход к добавлению этих виджетов, а также их подключению к обработчикам событий довольно знакомы.

Добавление кнопок

Давайте начнем с кнопки - matplotlib.widgets модуль определяет Button сорт. Чтобы подключиться к нему, мы вызываем on_clicked() функция, которая выполняет предоставленную нами функцию. После обнаружения щелчка функция выполняется.

При создании кнопки мы назначаем Axes к нему, используется для позиционирования. Мы также можем передать label в это время, чтобы добавить текст и аннотировать его для пользователя. color и hovercolor аргументы определяют цвет кнопки до и после наведения на нее курсора.

Поскольку мы заботимся о расположении и пространстве для всех виджетов, давайте создадим Figure и Axes, оставьте немного места внизу для добавления кнопки и постройте пустую точечную диаграмму. Затем мы определим EventHandler класс, имеющий единственный метод add_random(). Метод генерирует два случайных числа и отображает для них маркер на Axes мы создали раньше и звонки plt.draw(), который перерисовывает Figure. При обновлении графиков нам всегда придется вызывать plt.draw() еще раз, чтобы фактически обновить его:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
plot = ax.scatter([], []) class EventHandler: def add_random(self, event): x = np.random.randint(0, 100) y = np.random.randint(0, 100) ax.scatter(x, y) plt.draw() # Axes for the Button and positioning
# xposition and yposition in percentages, width, height
button_ax = plt.axes([0.7, 0.05, 0.2, 0.07])
# Create Button and assign it to `button_ax` with label
button = Button(button_ax, 'Add Random', color='green', hovercolor='red')
# On a detected click, execute add_random()
button.on_clicked(EventHandler().add_random) plt.show()

Это приводит к Figure, с пустым Axes внутри него и отдельная кнопка в правом верхнем углу экрана. Axes:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

И после нажатия кнопки пару десятков раз наш ax будет заполнен случайными маркерами:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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

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

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

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import Button fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('winequality-red.csv')
plot = ax.scatter([], []) class EventHandler: i = 0 # Find and plot next feature, re-draw the Axes def next_feature(self, event): # If the counter is at the end of the columns # Revert it back to 0 to cycle through again if self.i >= len(df.columns): self.i = 0 # Clear Axes from last plot ax.cla() # Plot a feature against a feature located on the `i` column ax.scatter(df['alcohol'], df.iloc[:,self.i]) # Set labels ax.set_xlabel('Alcohol') ax.set_ylabel(df.columns[self.i]) # Increment i self.i += 1 # Update Figure plt.draw() def previous_feature(self, event): # If the counter is at the start of the columns # Revert it back to the last column to cycle through if self.i <= 0: self.i = len(df.columns)-1 ax.cla() ax.scatter(df['alcohol'], df.iloc[:,self.i]) ax.set_xlabel('Alcohol') ax.set_ylabel(df.columns[self.i]) self.i -= 1 plt.draw() # Add buttons
button1_ax = plt.axes([0.7, 0.02, 0.2, 0.07])
next_button = Button(button1_ax, 'Next Feature')
next_button.on_clicked(EventHandler().next_feature) button2_ax = plt.axes([0.45, 0.02, 0.2, 0.07])
previous_button = Button(button2_ax, 'Previous Feature')
previous_button.on_clicked(EventHandler().previous_feature) plt.show()

Ассоциация EventHandler класс теперь имеет два метода – next_feature() и previous_feature(). Оба они проверяют, является ли счетчик i достиг конца или начала списка столбцов – и чтобы избежать IndexError, мы сбрасываем индекс на противоположное значение и моделируем цикл. Идти ниже 0 вернет нас в конец списка столбцов, и переход выше последнего столбца вернет нас обратно к первому.

Выяснив, где мы находимся – мы очистить Axes, поскольку мы будем снова строить график поверх существующего, не очищая его с помощью cla() (clухо aхес). В качестве альтернативы вы также можете накапливать отношения объектов, накладывая друг на друга графики и используя cla() оператор при сбросе индекса в конце/начале цикла.

После очистки Axes – у нас есть чистый холст, на котором можно рисовать с помощью ax.scatter() функция. В этом примере фиксированная функция Алкоголь, поэтому он присутствует всегда. Другая функция варьируется, и доступ к ней можно получить через iloc[], передавая индекс столбца. Это возвращает Series что мы можем использовать в этом сюжете. Аналогичным образом мы можем получить доступ имена столбцов также через их индекс – df.columns[index], который используется для установки метки оси Y.

Наконец, мы увеличиваем/уменьшаем счетчик и вызываем plt.draw() обновить Figure:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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

Добавление переключателей и флажков

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

Примечание: Существует очень ограниченная возможность проверить, установлен ли флажок. on or от. На самом деле, ничего из коробки нет. Вы можете только проверить, установлен ли флажок. прессованный or не, что накладывает серьезные ограничения на его использование, поскольку мы понятия не имеем, в каком состоянии он находился до этого. Единственная альтернатива — сохранить свой собственный счетчик/проверку текущего состояния поля с помощью логического значения и изменить логику на основе этого.

Это позволит вам, например, добавить флажок для каждого аргумент настройки определенного сюжета, позволяя пользователю устанавливать их True or False (отмечено или не отмечено) или любое другое неконфликтное сопоставление, основанное на этих состояниях.

Однако, поскольку API сам по себе ограничен, мы также ограничимся предполагаемым использованием — включением и выключением функций. У нас будет две функции, которые мы сможем превратить on и от через флажок. Обратите внимание, что даже эта функциональность ограничена объектами, для которых вы можете проверить, видимы они или нет.

С другой стороны, мы не хотим позволять пользователю применять две шкалы одновременно или устанавливать два X-предела одновременно, поскольку будет применяться только оператор, называемый вторым в последовательности. Для этого мы будем использовать радиокнопки.

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

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import CheckButtons
from matplotlib.widgets import RadioButtons fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('winequality-red.csv') # Plot two line plots for two features, and turn them invisible
line1, = ax.plot(df['fixed acidity'], visible=False)
line2, = ax.plot(df['citric acid'], visible=False) class EventHandler: # set_range handler def set_range(label): if (label == 'Small Range'): ax.set_xlim(0, 1600) ax.set_ylim(0, 25) else: ax.set_xlim(0, 1600) ax.set_ylim(0, 50) plt.draw() # Turn off, if on, and on if off def apply_features(label): if (label == 'Fixed Acidity'): line1.set_visible(not line1.get_visible()) elif (label == 'Citric Acid'): line2.set_visible(not line2.get_visible()) plt.draw() # Add radio buttons and checkboxes
ranges_ax = plt.axes([0.7, 0.02, 0.2, 0.1])
range_radio_buttons = RadioButtons(ranges_ax, ('Small Range', 'Large Range'))
range_radio_buttons.on_clicked(EventHandler.set_range) checkboxes_ax = plt.axes([0.4, 0.02, 0.25, 0.1])
checkboxes = CheckButtons(checkboxes_ax, ('Fixed Acidity', 'Citric Acid'))
checkboxes.on_clicked(EventHandler.apply_features) plt.show()

Опять же, у нас есть два метода в EventHandler() учебный класс - set_range() и apply_features(), set_range() метод устанавливает диапазон на «маленький» или «большой», регулируя Axes' X и Y-пределы. apply_features() функция изменяет visible поле линейных графиков, которые мы создали ранее, на основе их текущих visible положение дел. Если visible == True, мы отключаем линейный график, и наоборот.

Нам приходится полагаться на встроенную возможность проверки видимости линейных графиков, поскольку мы не можем проверить, был ли установлен флажок ранее или нет. Эту же способность можно имитировать с помощью status логическое значение в области видимости EventHandler() класс, для которого установлено значение True и False при каждом щелчке мыши для типов графиков, которые не поддерживают проверку их видимости сразу после установки.

Запуск этого кода приводит к Figure с двумя наборами кнопок внизу. Если мы отметим оба флажка, появятся оба линейных графика:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Мы можем отключить их индивидуально:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

И мы можем изменить диапазон Axes через радиокнопки:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Добавление текстовых полей

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

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

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import TextBox fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('winequality-red.csv') class EventHandler: def submit(feature_name): if feature_name != "" or feature_name != None: if feature_name in df: ax.cla() ax.plot(df[feature_name]) else: if len(textbox_ax.texts) > 2: del textbox_ax.texts[-1] textbox_ax.text(-2, 0.4, feature_name + ' was not found.') plt.draw() textbox_ax = plt.axes([0.7, 0.02, 0.2, 0.1])
textbox = TextBox(textbox_ax, 'Feature Name')
textbox.on_submit(EventHandler.submit) plt.show()

У нас есть простая проверка, чтобы увидеть, предоставлено ли feature_name пусто или None, и в этом случае мы ничего не делаем. Если нет, мы проверяем, feature_name присутствует в DataFrame, прикрепив сообщение о том, что функция не найдена, если она отсутствует. Однако прежде чем прикреплять текст, мы должны убедиться, что предыдущее сообщение удалено, чтобы новое не пересекалось с ним. axes.texts свойство представляет собой список всех Text экземпляры на Axes, Поскольку Axes уже есть Text экземпляр, принадлежащий нашему TextBox, мы не хотим ничего удалять, если их 2 или меньше Text присутствуют экземпляры – сообщение об ошибке и TextBox этикетка.

Если выше двух, у нас уже есть сообщение об ошибке, которое следует удалить.

Если функция is присутствовать в DataFrame, тем не менее, мы очищаем Axes и постройте его:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Добавление селекторов диапазона

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

Чтобы добавить Селектор диапазона, нам не нужно посвящать совершенно новый Axes для него — мы можем прикрепить его к существующему, что имеет большой смысл. При создании SpanSelector, мы поставляем Axes он принадлежит, а также обработчику событий, за которым следует 'horizontal' or 'vertical', который вращает Axes и Селектор диапазона оба.

Ассоциация useblit аргумент обычно имеет значение True потому что это повышает производительность большинства серверов. Кроме того, мы добавили несколько свойств стиля, например настройку alpha прямоугольника, созданного в качестве селектора диапазона, для 0.5 и facecolor к хорошему tab:blue:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector
from matplotlib.widgets import Button fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('AmesHousing.csv') ax.scatter(x = df['Year Built'], y = df['Total Bsmt SF'], alpha = 0.6) class EventHandler: def select_horizontal(x, y): ax.set_xlim(x, y) plt.draw() def reset(self): ax.set_xlim(df['Year Built'].min(), df['Year Built'].max()) plt.draw span_horizontal = SpanSelector(ax, EventHandler.select_horizontal, 'horizontal', useblit=True, rectprops=dict(alpha=0.5, facecolor='tab:blue')) button_ax = plt.axes([0.7, 0.02, 0.2, 0.07])
button = Button(button_ax, 'Reset')
button.on_clicked(EventHandler.reset) plt.show()

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

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Добавление слайдеров

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

Давайте напишем скрипт, который позволит нам изменять пределы осей Y и X с помощью ползунка, который позволит нам изменить перспективу, с которой мы просматриваем наши данные:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2, left=0.2) df = pd.read_csv('winequality-red.csv')
plot, = ax.plot(df['volatile acidity']) class EventHandler: def update(val): ax.set_ylim(0, yslider.val) ax.set_xlim(0, xslider.val) plt.draw() xslider_ax = plt.axes([0.35, 0.03, 0.5, 0.07])
xslider = Slider( ax=xslider_ax, label="X-limit", valmin=0, valmax=len(df['volatile acidity']), valinit=len(df['volatile acidity']), orientation="horizontal"
) yslider_ax = plt.axes([0.03, 0.2, 0.07, 0.5])
yslider = Slider( ax=yslider_ax, label="Y-limit", valmin=0, valmax=3, valinit=1.5, orientation="vertical"
) xslider.on_changed(EventHandler.update)
yslider.on_changed(EventHandler.update) plt.show()

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

Наконец, Sliderмогут быть ориентированы горизонтально или вертикально. Поскольку они предназначены для постоянного обновления с помощью движения мыши – on_changed() Функция используется для запуска ответа, когда пользователь вводит данные. Мы подправили EventHandler класс с update() функция, которая просто корректирует значения пределов X и Y на основе value соответствующих ползунков.

Запуск этого кода создаст график с двумя ползунками, которые мы можем использовать для изменения области действия. Axes:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Отметка времени:

Больше от Стекабьюс