Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

Matplotlib widgetek

A Matplotlib nem csak statikus ábrázolásokhoz használható. Míg a grafikus felhasználói felületek általában GUI-könyvtárakkal és keretrendszerekkel jönnek létre, mint pl PyQt, Tkinter, Kétségbeesett és a wxPython, és bár a Python kiválóan integrálja a PyQt-t, a Tkintert és a wxPython – ezek egyikét sem kell használni néhány alapvető grafikus felület funkcióhoz Matplotlib widgetek.

A matplotlib.widgets modulnak több osztálya van, köztük a AxesWidget, melyek közül Buttons, CheckButtons, Sliders, TextBoxes stb. származnak. Ezek mind elfogadják a Axes ezek hozzáadódnak az egyetlen kötelező konstruktor argumentumhoz, és a pozicionálásukat kézzel kell beállítani. Meg kell jegyezni, hogy a widget a tengelyek, így létrehoz egy Axes példány minden widgethez.

Egy másik dolog, amit meg kell jegyezni, az meg kell őriznie a widgetekre vonatkozó hivatkozásokat különben összegyűjtik a szemetet.

Mindegyik beállítással letiltható active nak nek False, ebben az esetben nem reagálnak semmilyen eseményre, például rákattintásra. Ennek ellenére egy új típusú interaktivitást vezethetünk be a cselekményeinkbe, különféle GUI-elemeken és komponenseken keresztül.

Jegyzet: A Matplotlib nem alkalmas jó minőségű grafikus felület létrehozására, sem felhasználóbarát rendszerekre. Ezek a widgetek kezdetlegesek, nem igazán néznek ki jól, és korlátozott a funkcionalitásuk. Arra szánják őket, hogy prototípust készítsenek és teszteljenek, ahelyett, hogy ténylegesen szállítanák őket.

Ha már dolgozott PyQt-tal, akkor észreveheti, hogy ezeknek a widgeteknek az általános szintaxisa és megközelítése, valamint az eseménykezelőkkel való összekapcsolása meglehetősen ismerős.

Gombok hozzáadása

Kezdjük azzal gombok - A matplotlib.widgets modul meghatározza a Button osztály. A csatlakozáshoz hívjuk a on_clicked() függvény, amely végrehajtja az általunk megadott függvényt. Amint egy kattintást észlel, a funkció végrehajtódik.

A gomb létrehozása közben hozzárendelünk egy Axes hozzá, pozicionáláshoz használják. Be is léphetünk a label abban az időben, hogy hozzáadjon egy kis szöveget és megjegyzéseket fűzzen hozzá a felhasználó számára. A color és a hovercolor argumentumok határozzák meg a gomb színét az egérrel való ráhelyezés előtt és után.

Mivel mi gondoskodunk az összes widget elhelyezéséről és helyéről – hozzunk létre a Figure és a Axes, hagyjon egy kis szóközt alul egy gomb hozzáadásához, és ábrázoljon egy üres szórási diagramot. Ezután meghatározunk egy EventHandler osztály, amelynek egyetlen metódusa van add_random(). A metódus két véletlen számot generál, és ezekhez jelölőt ábrázol a Axes korábban létrehoztunk és hívásokat plt.draw(), amely újra megrajzolja a Figure. A telek frissítésekor mindig fel kell hívnunk plt.draw() még egyszer, hogy valóban frissítse:

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

Ennek eredményeként a Figure, egy üres Axes belül, és egy gomb a képernyő jobb felső sarkában, a sajátjában Axes:

Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

És miután néhány tucatszor megnyomtuk a gombot, a mi ax véletlenszerű markerekkel lesz feltöltve:

Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

Gyakorlatiasabban fogalmazva létrehozhatnánk a ciklus funkciókat, amelyek minden gombnyomásra megjelennek. Ez néhány módosítást igényel a EventHandler, valamint egy másik gomb a cikluson való visszalépéshez.

Használjuk a Vörösbor minőség adatkészletet újra, és vizualizáljon több funkciót a Alkohol funkció. Mivel nem zavarhatjuk, hogy ezeket egyenként ábrázoljuk, ha megírjuk a kódot, hogy az egyik jellemzőt a másikhoz képest ábrázoljuk, majd módosítjuk a kódot, hogy egy másik jellemzőt ábrázoljunk a másikhoz.

A Scatter Matrix létrehozása itt segíthet nekünk, de ha az adatkészlet sok funkcióval rendelkezik, akkor eléggé olvashatatlan lesz, és nem jutunk messzire. Ha szeretnéd mindkét nagyméretű cselekmények, amelyeket könnyen megtekinthet és értelmezhet, is mivel több funkcióval rendelkezik minden extra erőfeszítés nélkül – ezt a folyamatot a gombokkal automatizálhatja:

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

A EventHandler Az osztálynak most két metódusa van - next_feature() és a previous_feature(). Mindkettő ellenőrzi, hogy a számláló i elérte az oszloplista végét vagy elejét – és hogy elkerülje a IndexError, visszaállítjuk az indexet az ellenkező értékre, és szimuláljuk a ciklus. Lefelé haladva 0 visszavezet minket a végén az oszloplistából, és az utolsó oszlop fölé lépve visszatérünk az elsőhöz.

Miután megállapítottuk, hol vagyunk – mi törölje a Axes, mivel újra ábrázolnánk egy meglévő telek tetején anélkül, hogy törölnénk a következőn keresztül cla() (clfül axes). Alternatív megoldásként a jellemzőkapcsolatokat is felhalmozhatja úgy, hogy egymásra ábrázolja és használja a cla() utasítást az index alaphelyzetbe állításakor a ciklus végén/elején.

Miután törölte a Axes – van egy letisztított vásznunk, amire festhetünk vele ax.scatter() funkció. Ebben a példában a rögzített szolgáltatás az Alkohol, tehát mindig jelen van. A másik funkció változó, és ezen keresztül érhető el iloc[], áthaladva az oszlop indexében. Ez visszaadja a Series amit felhasználhatunk ebben a cselekményben. Hasonlóképpen hozzáférhetünk oszlopnevek indexükön keresztül is – df.columns[index], amely az Y tengely címkéjének beállítására szolgál.

Végül növeljük/csökkentjük a számlálót és hívjuk plt.draw() hogy frissítse a Figure:

Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

Miután rákattintunk a Következő funkció gombot, az oszlopok listájának következő jellemzője lesz ábrázolva Alkohol, És a Figure megfelelően frissíteni kell – a címkéket, jelzőket és a skála. Ugyanez fordítva is igaz – Előző funkció ellentétes irányban halad át a listán, lehetővé téve az oda-vissza biciklizést egy biztonsági mechanizmussal, amely minden alkalommal alaphelyzetbe állítja a számlálót, amikor a ciklus végére vagy elejére érünk.

Rádiógombok és jelölőnégyzetek hozzáadása

Rádió gombok arra szolgálnak, hogy a felhasználó kiválaszthassa egy érték kívül több értéket. Egyszerre csak egy választógomb választható ki, és ezek általában egy választást jelentenek. Jelölőnégyzetek akkor használható, ha több lehetőséget szeretne egyszerre kiválasztani a felhasználónak.

Jegyzet: Nagyon korlátozott a lehetőség annak ellenőrzésére, hogy a jelölőnégyzet be van-e kapcsolva on or kedvezmény. Valójában egyik sem került ki a dobozból. Mindig csak azt ellenőrizheti, hogy a doboz megvan-e sajtolt or nem, ami komoly korlátot szab a használatának, hiszen fogalmunk sincs, hogy ez előtt milyen állapotban volt. Az egyetlen alternatíva, hogy megtartja a saját számlálóját/ellenőrzését a doboz aktuális állapotára vonatkozóan egy logikai értékkel, és ennek alapján módosítja a logikát.

Ez lehetővé tenné például, hogy mindegyikhez jelölőnégyzetet adjon testreszabási argumentum egy bizonyos telek, lehetővé téve a felhasználó számára, hogy beállítsa azokat True or False (bejelölve vagy nem bejelölve), vagy bármilyen más, nem ütköző leképezés ezeken az állapotokon alapul.

Mivel azonban maga az API is korlátozott, a tervezett felhasználásra is korlátozzuk magunkat – a dolgok be- és kikapcsolására. Két funkciónk lesz, amelyeket meg tudunk változtatni on és a kedvezmény egy Checkboxon keresztül. Vegye figyelembe, hogy még ez a funkció is azokra az objektumokra korlátozódik, amelyeknél ellenőrizheti, hogy láthatóak-e vagy sem.

Másrészt nem szeretnénk megengedni, hogy a felhasználó egyszerre két skálát alkalmazzon, vagy egyszerre két X-határt állítson be, mivel csak a sorrendben másodikként nevezett utasítás kerül alkalmazásra. Ezekhez rádiógombokat használnánk.

Adjunk hozzá néhány választógombot, amelyek lehetővé teszik a felhasználó számára, hogy néhány rádiógomb segítségével válassza ki a tengelytartományt, de lehetővé teszi számukra a funkciók megjelenítését is. on és a kedvezmény:

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

Ismét két módszerünk van a EventHandler() osztály - set_range() és a apply_features() Az set_range() módszer a tartományt „kicsi” vagy „nagy” értékre állítja a Axes' X és Y határértékek. A apply_features() funkció megváltoztatja a visible A korábban elkészített Vonalrajzok mezője aktuális állapotuk alapján visible állapot. Ha visible == True, kikapcsoljuk a Vonalrajzot, és fordítva.

A Line Plots láthatóságának ellenőrzésére a beépített képességre kell támaszkodnunk, mivel nem tudjuk ellenőrizni, hogy a checkbox korábban be volt-e jelölve vagy sem. Ugyanez a képesség emulálható a status logikai értékét a EventHandler() osztályba van beállítva True és a False minden kattintásnál, olyan telektípusoknál, amelyek nem támogatják annak ellenőrzését, hogy láthatóak-e a dobozon kívül.

Ennek a kódnak a futtatása a Figure alján két gombkészlettel. Ha mindkét jelölőnégyzetet bejelöljük, mindkét vonalrajz megjelenik:

Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

Egyenként is kikapcsolhatjuk őket:

Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

És megváltoztathatjuk a tartományt Axes a rádiógombokon keresztül:

Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

Szövegdobozok hozzáadása

Szövegdobozok arra használják, hogy gyűjt adatokat a felhasználótól – és ezen adatok alapján módosíthatjuk a diagramokat. Például megkérhetjük a felhasználót, hogy adja meg egy tereptárgy nevét, vagy szúrjon be egy függvényt a cselekményünk vizualizálásához. Természetesen a felhasználói bevitellel dolgozni bonyolult lehet – mindig vannak szélsőséges esetek, amelyekre figyelni kell.

Írjunk egy szkriptet, amely lehetővé teszi a felhasználó számára a bevitelt jellemző neve egy adatkészletből, és a Axes frissítéseket minden egyes benyújtásnál, hogy tükrözze a bemenetet. A felhasználó kényelme érdekében értesítjük őket, ha a bemenet nem illeszthető oszlopnévvel:

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

Van egy egyszerű ellenőrzésünk, hogy megnézzük, hogy biztosított-e feature_name üres vagy None, ebben az esetben nem teszünk semmit. Ha nem, akkor ellenőrizzük, hogy a feature_name jelen van a DataFrame, egy üzenetet csatolva arról, hogy a funkció nem található, ha nincs jelen. A szöveg csatolása előtt azonban meg kell győződnünk arról, hogy az előző üzenetet eltávolítottuk, hogy az új ne kerüljön átfedésbe vele. A axes.texts tulajdonság listája az összes Text példányok egy Axes. Óta Axes már rendelkezik a Text például a miénk TextBox, nem akarunk eltávolítani semmit, ha 2 vagy kevesebb van Text jelenlévő példányok – a hibaüzenet és a TextBox címke.

Ha kettő felett van, akkor már kaptunk egy hibaüzenetet, amelyet el kell távolítani.

Ha a funkció is jelen van a DataFrame, mégis töröljük a Axes és ábrázolja:

Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

Span Selectorok hozzáadása

Span Selectors használható arra, hogy a felhasználó kiválasszon egy adattartományt, és rá fókuszáljon, és ennek alapján állítsa be a tengelykorlátokat. Alapértelmezés szerint sok könyvtár támogatja ezt a funkciót, bár sajnos a Matplotlib nem, és ezt manuálisan kell megtennünk. Ezen kívül még egy pluszt kell hozzáadnunk "Visszaállítás" gombot, ha akarjuk kicsinyítéshez is.

Hozzáadni a Span Selector, nem kell egy teljesen újat szentelnünk Axes hozzá – csatolhatjuk egy meglévőhöz, aminek nagyon is van értelme. Amikor generál a SpanSelector, szállítjuk a Axes tartozik, valamint az eseménykezelő, majd ezt követi 'horizontal' or 'vertical', amely forgatja a Axes és a Span Selector mindkettő.

A useblit argumentum általában a következőre van állítva True mert a legtöbb háttérrendszeren javítja a teljesítményt. Ezenkívül hozzáadtunk néhány stílustulajdonságot, mint például a alpha a téglalap kiterjedésválasztójaként létrehozott téglalapból 0.5 és a facecolor egy szépre 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()

Ennek futtatása egy diagramot generál, amelyen a tengelyhatárok megadott értékekre állításával kijelölhetjük a fesztávokat és ráközelíthetünk:

Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

Csúszkák hozzáadása

Sliders lehetővé teszi a felhasználók számára, hogy intuitív módon válogassanak számos érték között a marker elcsúsztatásával és egy érték kiválasztásával. Általában a csúszkákat arra használják, hogy folyamatosan frissítsenek bizonyos értékeket a diagramon, például annak tartományát or akár egy tulajdonság. Például beállíthatja egy konstans értékét egy csúszkával, ami viszont hatással van az arra a konstansra támaszkodó függvényre.

Írjunk egy szkriptet, amely lehetővé teszi az Y és X tengely határainak megváltoztatását egy csúszkán keresztül, amely lehetővé teszi, hogy megváltoztassuk azt a perspektívát, amelyből az adatainkat nézzük:

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

A párnázást úgy állítottuk be, hogy a bal és az alsó csúszka legyen Axes, és felrajzolt egy egyszerű vonalrajzot. A csúszka hozzáadásához el kell készítenünk egy Axes hozzá, mint a legtöbb egyéb widgethez, és rendelje hozzá a ax érve a Slider a kivitelezőn keresztül. Ezenkívül beállíthatjuk a csúszka minimális, maximális és kezdeti értékét. Ezek általában dinamikus tartományok, amelyek az ábrázolt adatokon alapulnak, de kézzel is beállíthatók skaláris értékek.

Végül, Sliders tájolható vízszintesen vagy függőlegesen. Mivel folyamatosan frissíteni kell őket egy egérhúzással – a on_changed() A funkció válasz indítására szolgál, amikor a felhasználó bevitelt ad. Javítottuk a EventHandler osztály egy update() függvény, amely egyszerűen beállítja az X és Y határértékek értékét a vala megfelelő csúszkák használatával.

Ennek a kódnak a futtatása két csúszkával egy plot-ot fog készíteni, amelyek segítségével megváltoztathatjuk a hatókörét Axes:

Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

Matplotlib Widgetek PlatoBlockchain Data Intelligence. Függőleges keresés. Ai.

Időbélyeg:

Még több Stackabus