Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Віджети Matplotlib

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

Команда matplotlib.widgets Модуль має кілька класів, у тому числі AxesWidget, з яких Buttons, CheckButtons, Sliders, TextBoxes тощо є похідними. Усі вони приймають Axes вони додаються як один і єдиний обов’язковий аргумент конструктора, і їхнє позиціонування має бути встановлено вручну. Слід зазначити, що віджет - це осі, тому ви створите Axes екземпляр для кожного віджета.

Ще одне, на що слід звернути увагу, це те, що ви повинні зберігати посилання на віджети інакше вони можуть отримати сміття.

Кожен з них також можна відключити шляхом налаштування active до False, і в цьому випадку вони не реагуватимуть на жодні події, наприклад на натискання. З огляду на це, ми можемо запровадити новий тип інтерактивності для наших сюжетів за допомогою різних елементів і компонентів GUI.

Примітка: Matplotlib не призначений для створення високоякісного графічного інтерфейсу або дружніх систем. Ці віджети є рудиментарними, не виглядають чудово та мають обмежену функціональність. Вони призначені як спосіб створення прототипів і тестування речей, а не фактичного їх відправлення.

Якщо ви раніше працювали з PyQt, ви могли помітити, що загальний синтаксис і підхід до додавання цих віджетів, а також підключення їх до обробників подій досить знайомі.

Додавання кнопок

Почнемо з Кнопки - matplotlib.widgets модуль визначає a Button клас. Щоб підключитися до нього, ми телефонуємо on_clicked() функція, яка виконує надану нами функцію. Після виявлення клацання функція виконується.

Під час створення кнопки ми призначаємо Axes до нього, використовується для позиціонування. Ми також можемо передати a label у той час, щоб додати текст і анотувати його для користувача. The 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. Вертикальний пошук. Ai.

І натиснувши кнопку пару десятків разів, наш ax буде заповнено випадковими маркерами:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

З більш практичної точки зору, ми могли б створити a цикл функцій, які відображаються при кожному натисканні кнопки. Для цього потрібно внести кілька налаштувань 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, ми скидаємо індекс до протилежного значення та моделюємо a цикл. Йду вниз 0 поверне нас до кінець списку стовпців, а перехід над останнім стовпцем поверне нас до першого.

Дізнавшись, де ми знаходимось, ми очистити Axes, оскільки ми будемо знову креслити поверх існуючої ділянки, не очищаючи її через cla() (clвухо axes). Крім того, ви також можете нагромадити зв’язки ознак, накресливши один на одного та використавши cla() оператор при скиданні індексу в кінці/початку циклу.

Після очищення Axes – у нас є очищене полотно, на якому можна малювати ax.scatter() функція. У цьому прикладі фіксована функція Алкоголь, тому він присутній завжди. Інші функції відрізняються, і до них можна отримати доступ через iloc[], передаючи індекс стовпця. Це повертає a Series які ми можемо використати в цьому сюжеті. Так само ми можемо отримати доступ імена стовпців також через їхній індекс – df.columns[index], який використовується для встановлення мітки осі Y.

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

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Як тільки ми натиснемо на Наступна функція наступна функція в списку стовпців буде нанесена на графік Алкоголь, А 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. The apply_features() функція змінює visible поле Лінійних ділянок, які ми створили раніше, на основі їхнього поточного visible статус. Якщо visible == True, ми вимикаємо лінійний графік і навпаки.

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

Запуск цього коду призводить до a Figure з двома наборами кнопок внизу. Якщо ми позначимо обидва прапорці, з’являться обидва лінійні графіки:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Ми можемо вимкнути їх окремо:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

І ми можемо змінити діапазон Axes за допомогою радіокнопок:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Додавання текстових полів

Текстові поля звикли збирати дані користувача – і ми можемо змінювати графіки на основі цих даних. Наприклад, ми можемо попросити користувача ввести назву функції або вставити функцію для візуалізації нашого графіка. Звичайно, працювати з введенням користувача може бути складно – завжди є крайні випадки, на які варто звернути увагу.

Давайте напишемо сценарій, який дозволяє користувачеві вводити a назва функції набору даних і 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, вкладаючи повідомлення про те, що функцію не знайдено, якщо її немає. Перш ніж прикріпити текст, ми повинні переконатися, що попереднє повідомлення видалено, щоб нове не накладалося на нього. The axes.texts властивість - це список усіх Text екземпляри на ан Axes. З моменту Axes вже має Text екземпляр, що належить до нашого TextBox, ми не хочемо нічого видаляти, якщо їх 2 або менше Text присутні екземпляри – повідомлення про помилку та TextBox етикетка.

Якщо вище двох, ми вже отримали повідомлення про помилку, яке слід видалити.

Якщо особливість is присутні в DataFrame, однак ми очищаємо Axes і накресліть його:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Додавання селекторів діапазону

Селектори діапазону можна використовувати, щоб дозволити користувачеві вибрати діапазон даних і зосередитися на ньому, встановлюючи межі осі на основі цього вибору. За замовчуванням багато бібліотек підтримують цю функцію, але, на жаль, Matplotlib не підтримує, і нам доведеться робити це вручну. Крім того, нам доведеться додати додатковий “Скинути” кнопку, якщо ми хочемо зменшення масштабу а.

Щоб додати a Вибір діапазону, нам не потрібно присвячувати повністю новий Axes для нього – ми можемо приєднати його до існуючого, що має великий сенс. При створенні a SpanSelector, ми поставляємо Axes він належить, а також обробник події, а потім 'horizontal' or 'vertical', який обертає Axes та Селектор діапазону обидва.

Команда useblit аргумент зазвичай має значення True тому що це підвищує продуктивність більшості серверних програм. Крім того, ми додали кілька властивостей стилю, наприклад налаштування alpha прямокутника, створеного як Span Selector для 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()

Запуск цього генерує діаграму, на якій ми можемо вибирати проміжки та збільшувати їх, встановлюючи Axes-limits на надані значення:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Додавання повзунків

Слайдери дозволяють користувачам інтуїтивно вибирати між багатьма значеннями, пересуваючи маркер і вибираючи значення. Як правило, повзунки використовуються для постійного оновлення деяких значень на графіку, наприклад його діапазону 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 через конструктор. Додатково ми можемо встановити мінімальне, максимальне та початкове значення повзунка. Зазвичай це динамічні діапазони на основі даних, які ви будуєте, але також можна вручну встановити скалярні значення.

Нарешті, Sliders можуть бути орієнтовані горизонтально або вертикально. Оскільки вони призначені для постійного оновлення за допомогою проведення пальцем миші, то on_changed() функція використовується для виклику відповіді, коли користувач вводить дані. Ми налаштували EventHandler клас з ан update() функція, яка просто регулює значення меж X і Y на основі valвідповідних повзунків.

Запуск цього коду створить діаграму з двома повзунками, за допомогою яких ми можемо змінити область дії Axes:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Часова мітка:

Більше від Stackabuse