Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Widżety Matplotlib

Matplotlib nie służy tylko do statycznych wykresów. Chociaż GUI są zwykle tworzone przy użyciu bibliotek i frameworków GUI, takich jak PyQt .Name, Tkinter, Zdesperowany i wxPythoni chociaż Python ma doskonałą integrację z PyQt, Tkinter i wxPython – nie ma potrzeby używania żadnego z nich do obsługi niektórych podstawowych funkcji GUI Widżety Matplotlib.

Połączenia matplotlib.widgets moduł ma kilka klas, w tym AxesWidget, z ktorych Buttons, CheckButtons, Sliders, TextBoxes, itp. są pochodne. Wszystkie one akceptują Axes są dodawane jako jedyny obowiązkowy argument konstruktora, a ich położenie należy ustawić ręcznie. Warto zauważyć, że widget to osie, więc utworzysz plik Axes instancję dla każdego widgetu.

Kolejną rzeczą, na którą należy zwrócić uwagę, jest to, że musisz zachować odniesienia do widżetów w przeciwnym razie mogą zostać odebrane śmieci.

Każdy z nich można również wyłączyć poprzez ustawienie active do FalseW takim przypadku nie będą reagować na żadne zdarzenia, takie jak kliknięcie. Biorąc to pod uwagę, możemy wprowadzić nowy rodzaj interaktywności do naszych wykresów, poprzez różne elementy i komponenty GUI.

Uwaga: Matplotlib nie jest przeznaczony do tworzenia wysokiej jakości GUI ani systemów przyjaznych dla użytkownika. Te widżety są proste, nie wyglądają świetnie i mają ograniczoną funkcjonalność. Mają służyć do tworzenia prototypów i testowania rzeczy, a nie do ich faktycznej wysyłki.

Jeśli pracowałeś wcześniej z PyQt – możesz zauważyć, że ogólna składnia i podejście do dodawania tych widżetów, a także łączenia ich z procedurami obsługi zdarzeń są dość znajome.

Dodawanie przycisków

Zacznijmy od guziki - matplotlib.widgets moduł definiuje a Button klasa. Aby się z nim połączyć, wywołujemy on_clicked() funkcja, która wykonuje dostarczoną przez nas funkcję. Po wykryciu kliknięcia funkcja zostaje wykonana.

Tworząc przycisk, przypisujemy Axes do niego, używany do pozycjonowania. Możemy także przekazać a label w tym czasie dodać tekst i opatrzyć go adnotacją dla użytkownika. The color i hovercolor argumenty definiują kolor przycisku przed i po najechaniu myszką.

Ponieważ dbamy o pozycjonowanie i miejsce na wszystkie widżety – stwórzmy Figure i Axes, pozostaw trochę odstępów na dole, aby dodać przycisk, i narysuj pusty wykres punktowy. Następnie zdefiniujemy EventHandler klasa, która ma jedną metodę add_random(). Metoda generuje dwie liczby losowe i umieszcza na nich znacznik Axes stworzyliśmy wcześniej i wywołuje plt.draw(), który ponownie rysuje Figure. Przy aktualizacji działek zawsze będziemy musieli zadzwonić plt.draw() ponownie, aby go zaktualizować:

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()

Powoduje to Figure, z pustym Axes wewnątrz niego i osobny przycisk w prawym górnym rogu ekranu Axes:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

A po naciśnięciu przycisku kilkadziesiąt razy, nasz ax zostanie wypełniony losowymi znacznikami:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Mówiąc bardziej praktycznie, moglibyśmy stworzyć plik cykl funkcji, które mają zostać wykreślone po każdym naciśnięciu przycisku. Wymaga to kilku poprawek w pliku EventHandler, a także inny przycisk umożliwiający powrót do tego cyklu.

Użyjmy Jakość czerwonego wina ponownie zestaw danych i zwizualizuj kilka funkcji względem Alkohol funkcja. Ponieważ nie możemy zawracać sobie głowy wykreślaniem ich indywidualnie, pisząc kod, aby wykreślić jedną cechę względem drugiej, a następnie zmodyfikować ten kod, aby wykreślić inną cechę względem drugiej.

Utworzenie macierzy punktowej może nam w tym pomóc, ale jeśli zbiór danych ma wiele funkcji, będzie dość nieczytelny i nie zajdziemy daleko. Jeśli chcesz mieć obie działki o dużej skali, które można łatwo przeglądać i interpretować, także jako możliwość przełączania wielu funkcji bez dodatkowego wysiłku – możesz zautomatyzować ten proces za pomocą przycisków:

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()

Połączenia EventHandler klasa ma teraz dwie metody – next_feature() i previous_feature(). Obydwa sprawdzają, czy licznik i osiągnął koniec lub początek listy kolumn – i aby uniknąć IndexError, resetujemy indeks do przeciwnej wartości i symulujemy a cykl. Idę poniżej 0 zabierze nas z powrotem do zakończenia listy kolumn, a przejście powyżej ostatniej kolumny spowoduje powrót do pierwszej.

Po ustaleniu, gdzie się znajdujemy – my Wyczyść Axes, ponieważ ponownie kreślilibyśmy powierzchnię istniejącej działki bez jej oczyszczania cla() (clucho axes). Alternatywnie możesz także ułożyć relacje między obiektami, nakładając je na siebie i używając opcji cla() instrukcja przy resetowaniu indeksu na koniec/początek cyklu.

Po wyczyszczeniu Axes – mamy oczyszczone płótno, na którym możemy malować ax.scatter() funkcjonować. W tym przykładzie stałą cechą jest Alkohol, więc jest obecny przez cały czas. Druga funkcja jest różna i można uzyskać do niej dostęp iloc[], przekazując indeks kolumny. To zwraca a Series które możemy wykorzystać w tej fabule. Podobnie możemy uzyskać dostęp nazwy kolumn również poprzez ich indeks – df.columns[index], który służy do ustawiania etykiety osi Y.

Na koniec zwiększamy/zmniejszamy licznik i sprawdzamy plt.draw() zaktualizować Figure:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Po kliknięciu pliku Następna funkcja przycisk, następna cecha na liście kolumn zostanie wykreślona względem Alkoholi Figure zostaną odpowiednio zaktualizowane – etykiety, znaczniki i skala. To samo dzieje się w drugą stronę – Poprzednia funkcja przejedzie listę w przeciwnym kierunku, umożliwiając nam poruszanie się tam i z powrotem, z mechanizmem zabezpieczającym, który resetuje nasz licznik za każdym razem, gdy dotrzemy do końca lub początku cyklu.

Dodawanie przycisków opcji i pól wyboru

Przyciski Radio służą do umożliwienia użytkownikowi wyboru jedna wartość na kilka wartości. Jednocześnie można wybrać tylko jeden przycisk opcji i zazwyczaj reprezentuje on wybór. Pola wyboru można użyć, jeśli chcesz pozwolić użytkownikowi wybrać wiele opcji jednocześnie.

Uwaga: Możliwość sprawdzenia, czy pole wyboru jest zaznaczone, jest bardzo ograniczona on or poza. W rzeczywistości nie ma żadnego gotowego do użycia. Możesz tylko sprawdzić, czy pole jest prasowany or nie, co stanowi poważne ograniczenie sposobu jego wykorzystania, ponieważ nie mamy pojęcia, w jakim stanie znajdował się wcześniej. Jedyną alternatywą jest utrzymanie własnego licznika/sprawdzenie bieżącego stanu pola za pomocą wartości logicznej i na tej podstawie zmiana logiki.

Umożliwiłoby to na przykład dodanie pola wyboru dla każdego z nich argument dostosowywania określonej działki, z możliwością ich ustawienia przez użytkownika True or False (zaznaczone lub niezaznaczone) lub dowolne inne mapowanie nie powodujące konfliktu w oparciu o te stany.

Ponieważ jednak interfejs API sam w sobie jest ograniczony, ograniczymy się również do zamierzonego użycia – włączania i wyłączania różnych rzeczy. Będziemy mieli dwie funkcje, które możemy obrócić on i poza poprzez pole wyboru. Pamiętaj, że nawet ta funkcjonalność ogranicza się do obiektów, dla których możesz sprawdzić, czy są widoczne, czy nie.

Z drugiej strony nie chcemy pozwolić użytkownikowi na zastosowanie dwóch skal na raz, ani na ustawienie dwóch limitów X na raz, ponieważ zastosowane zostanie tylko stwierdzenie zwane drugim w sekwencji. W tym przypadku użylibyśmy przycisków radiowych.

Dodajmy kilka przycisków radiowych, aby umożliwić użytkownikowi wybór zakresu osi za pomocą kilku przycisków radiowych, ale także umożliwić im włączanie wizualizacji funkcji on i poza:

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()

Ponownie mamy dwie metody w pliku EventHandler() klasa - set_range() i apply_features(), set_range() Metoda ustawia zakres na „mały” lub „duży”, dostosowując AxesLimity X i Y. The apply_features() funkcja zmienia visible pole Wykresów Liniowych, które wykonaliśmy wcześniej, w oparciu o ich prąd visible status. Jeśli visible == True, wyłączamy Wykres liniowy i odwrotnie.

Musimy polegać na wbudowanej możliwości sprawdzania widoczności wykresów liniowych, ponieważ nie możemy sprawdzić, czy pole wyboru było wcześniej zaznaczone, czy nie. Tę samą zdolność można emulować za pomocą a status wartość logiczna w zakresie EventHandler() class, która jest ustawiona na True i False przy każdym kliknięciu w przypadku typów wykresów, które nie obsługują sprawdzania, czy są widoczne po wyjęciu z pudełka.

Uruchomienie tego kodu powoduje, że: Figure z dwoma kompletami guzików u dołu. Jeśli zaznaczymy oba pola wyboru, pojawią się oba wykresy liniowe:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Możemy je wyłączyć indywidualnie:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

I możemy zmienić zakres Axes za pomocą przycisków opcji:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Dodawanie pól tekstowych

pola tekstowe są używane do zbierać dane od użytkownika – i na podstawie tych danych możemy modyfikować wykresy. Na przykład możemy poprosić użytkownika o wprowadzenie nazwy obiektu lub o wstawienie funkcji, którą nasz wykres będzie wizualizowany. Oczywiście praca z danymi wprowadzanymi przez użytkownika może być trudna – zawsze należy zwrócić uwagę na przypadki brzegowe.

Napiszmy skrypt, który umożliwi użytkownikowi wprowadzenie a nazwa funkcji zbioru danych oraz Axes aktualizacje każdego zgłoszenia, aby odzwierciedlić wprowadzone dane. Dla wygody użytkownika poinformujemy go, jeśli danych wejściowych nie można dopasować do nazwy kolumny:

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()

Mamy proste sprawdzenie, czy zostało dostarczone feature_name jest puste lub None, w takim przypadku nic nie robimy. Jeśli nie, sprawdzamy, czy feature_name jest obecny w DataFrame, załączając wiadomość, że funkcja nie została znaleziona, jeśli jej nie ma. Zanim jednak dołączymy tekst, musimy upewnić się, że poprzednia wiadomość została usunięta, tak aby nowa nie nachodziła na nią. The axes.texts właściwość jest listą wszystkich Text przypadki na Axes. Od czasu Axes już ma Text przykład, należący do naszego TextBox, nie chcemy niczego usuwać, jeśli jest ich 2 lub mniej Text obecne instancje – komunikat o błędzie i plik TextBox etykieta.

Jeśli powyżej dwóch, mamy już komunikat o błędzie, który należy usunąć.

Jeśli funkcja is obecny w DataFrame, jednak usuwamy Axes i narysuj to:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Dodawanie selektorów zakresu

Selektory zakresu można wykorzystać, aby umożliwić użytkownikowi wybranie zakresu danych i skupienie się na nim, ustawiając ograniczenia osi w oparciu o ten wybór. Domyślnie wiele bibliotek obsługuje tę funkcjonalność, choć niestety Matplotlib tego nie robi i będziemy musieli to zrobić ręcznie. Dodatkowo będziemy musieli dodać coś ekstra „Reset” przycisk, jeśli chcemy Pomniejsz , jak również.

Aby dodać Selektor zakresu, nie musimy poświęcać zupełnie nowego Axes za to – możemy go podpiąć do już istniejącego, co ma duży sens. Podczas generowania a SpanSelector, dostarczamy Axes należy do, a także do procedury obsługi zdarzeń, po której następuje 'horizontal' or 'vertical', który obraca Axes i Obydwa selektory zakresu.

Połączenia useblit argument jest zazwyczaj ustawiony na True ponieważ zwiększa wydajność większości backendów. Dodatkowo dodaliśmy kilka właściwości stylizacji, takich jak ustawienie alpha prostokąta utworzonego jako Selektor zakresu 0.5 oraz facecolor do miłego 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()

Uruchomienie tego generuje wykres, na którym możemy wybrać rozpiętości i powiększyć je, ustawiając Axes-limits na podane wartości:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Dodawanie suwaków

Sliders pozwalają użytkownikom intuicyjnie wybierać pomiędzy wieloma wartościami, przesuwając znacznik i wybierając wartość. Zwykle suwaki służą do ciągłego aktualizowania niektórych wartości na wykresie, np. ich zakresu or nawet cecha. Na przykład można dostosować wartość stałej za pomocą suwaka, co z kolei wpływa na funkcję bazującą na tej stałej.

Napiszmy skrypt, który pozwoli nam zmienić limity osi Y i X za pomocą suwaka, co pozwoli nam zmienić perspektywę, z której oglądamy nasze dane:

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()

Dostosowaliśmy wyściółkę, aby umożliwić suwak po lewej stronie i na dole Axesi narysował prosty wykres liniowy. Dodanie suwaka wymaga od nas wykonania pliku Axes dla niego, podobnie jak w przypadku większości innych widżetów, i przypisz go do ax argument Slider poprzez konstruktora. Dodatkowo możemy ustawić wartość minimalną, maksymalną i początkową suwaka. Będą to zazwyczaj zakresy dynamiczne oparte na wykreślanych danych, ale można je również ustawić ręcznie jako wartości skalarne.

Wreszcie, Slidermogą być zorientowane poziomo lub pionowo. Ponieważ mają one być stale aktualizowane poprzez machnięcie myszką – plik on_changed() Funkcja służy do wyzwalania odpowiedzi, gdy użytkownik wprowadza dane wejściowe. Poprawiliśmy EventHandler klasa z update() funkcja, która po prostu dostosowuje wartości limitów X i Y w oparciu o valza pomocą odpowiednich suwaków.

Uruchomienie tego kodu spowoduje wyświetlenie wykresu z dwoma suwakami, których możemy użyć do zmiany zakresu pliku Axes:

Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Matplotlib Widgets PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Znak czasu:

Więcej z Nadużycie stosu