Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Matplotlib-widgetit

Matplotlib ei ole vain staattisia juonia varten. Vaikka graafiset käyttöliittymät luodaan yleensä GUI-kirjastojen ja -kehysten, kuten esim PyQt, Tkinter, Pettynyt ja wxPython, ja vaikka Pythonilla on erinomainen integraatio PyQtin, Tkinterin kanssa ja wxPython – näitä ei tarvitse käyttää joihinkin perusgraafisiin käyttöliittymätoimintoihin Matplotlib-widgetit.

- matplotlib.widgets moduulissa on useita luokkia, mukaan lukien AxesWidget, joista Buttons, CheckButtons, Sliders, TextBoxes jne. johdetaan. Nämä kaikki hyväksyvät Axes ne lisätään yhdeksi ja ainoaksi pakolliseksi konstruktoriargumentiksi, ja niiden sijainti on asetettava manuaalisesti. Huomionarvoinen asia on, että widget on akselit, joten luot Axes esimerkki jokaiselle widgetille.

Toinen asia on huomata, että sinun on säilytettävä viittaukset widgeteihin muuten he saattavat kerätä roskat.

Jokainen niistä voidaan myös poistaa käytöstä asettamalla active että False, jolloin he eivät reagoi tapahtumiin, kuten napsautukseen. Tästä huolimatta voimme tuoda juoneihimme uudenlaisen interaktiivisuuden erilaisten GUI-elementtien ja komponenttien avulla.

Huomautus: Matplotlibiä ei ole tarkoitettu käytettäväksi korkealaatuisen graafisen käyttöliittymän luomiseen eikä käyttäjäystävällisiin järjestelmiin. Nämä widgetit ovat alkeellisia, eivät todellakaan näytä hyvältä ja niiden toimivuus on rajallinen. Ne on tarkoitettu tapa prototyyppien tekemiseen ja testaamiseen sen sijaan, että niitä lähetettäisiin.

Jos olet työskennellyt PyQtin kanssa aiemmin – saatat huomata, että yleinen syntaksi ja lähestymistapa näiden widgetien lisäämiseen sekä niiden liittämiseen tapahtumakäsittelijöihin on melko tuttua.

Painikkeiden lisääminen

Aloitetaan siitä painikkeet - matplotlib.widgets moduuli määrittelee a Button luokkaa. Yhteyden muodostamiseksi siihen soitamme on_clicked() funktio, joka suorittaa toimittamamme toiminnon. Kun klikkaus on havaittu, toiminto suoritetaan.

Kun luomme painiketta, määritämme an Axes siihen, käytetään paikannukseen. Voimme myös kulkea a label tuolloin lisätäksesi tekstiä ja kommentoidaksesi sitä käyttäjälle. The color ja hovercolor argumentit määrittävät painikkeen värin ennen ja jälkeen, kun osoitin viedään sen päälle.

Koska me huolehdimme kaikkien widgetien sijainnista ja tilasta – luodaan a Figure ja Axes, jätä alareunaan välilyöntejä painikkeen lisäämiseksi ja piirrä tyhjä sirontakuvaaja. Sitten määrittelemme an EventHandler luokka, jolla on yksi menetelmä add_random(). Menetelmä luo kaksi satunnaislukua ja piirtää niille merkin Axes olemme luoneet ennen ja puheluita plt.draw(), joka piirtää uudelleen Figure. Kun päivitämme tontteja, meidän on aina soitettava plt.draw() uudelleen päivittääkseni sen:

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

Tämä johtaa Figure, tyhjällä Axes sen sisällä ja painike näytön oikeassa yläkulmassa, omana Axes:

Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Ja kun nappia on painettu parikymmentä kertaa, meidän ax täytetään satunnaisilla merkeillä:

Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Käytännöllisemmin voisimme luoda a sykli ominaisuuksia, jotka näkyvät jokaisella painikkeen painalluksella. Tämä vaatii muutaman korjauksen EventHandler, sekä toinen painike palataksesi syklin läpi.

Käytetään Punaviinin laatu tietojoukko uudelleen ja visualisoi useita ominaisuuksia vastaan Alkoholi ominaisuus. Koska emme voi vaivautua piirtämään näitä yksitellen kirjoittamalla koodin piirtämään yksi piirre toista vastaan ​​ja sitten muokkaamalla tätä koodia piirtämään toinen ominaisuus toista vastaan.

Scatter Matrixin luominen saattaa auttaa meitä tässä, mutta jos tietojoukossa on paljon ominaisuuksia, se on melko lukukelvoton, emmekä pääse pitkälle. Jos haluat saada sekä suuret juonet, joita voit helposti tarkastella ja tulkita, yhtä hyvin koska useat ominaisuudet käyvät läpi ilman ylimääräistä vaivaa – voit automatisoida tämän prosessin painikkeilla:

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 luokassa on nyt kaksi menetelmää - next_feature() ja previous_feature(). Molemmat tarkistavat, onko laskuri i on saavuttanut sarakeluettelon lopun tai alun – ja välttääksesi IndexError, nollaamme indeksin vastakkaiseen arvoon ja simuloimme a sykli. Menee alle 0 saa meidät takaisin loppu sarakeluettelosta ja viimeisen sarakkeen yläpuolelle siirtyminen palauttaa meidät ensimmäiseen.

Kun olemme selvittäneet sijaintimme – me tyhjennä Axes, koska piirtäisimme uudelleen olemassa olevan juonen päälle tyhjentämättä sitä kautta cla() (clkorva axes). Vaihtoehtoisesti voit myös kasata piirresuhteita piirtämällä toistensa päälle ja käyttämällä cla() lauseke nollattaessa indeksi syklin lopussa/alkussa.

Tyhjentämisen jälkeen Axes – Meillä on puhdistettu kangas maalattavaksi ax.scatter() toiminto. Tässä esimerkissä kiinteä ominaisuus on Alkoholi, joten se on aina läsnä. Toinen ominaisuus vaihtelee, ja siihen pääsee käsiksi iloc[], ohittaa sarakkeen hakemiston. Tämä palauttaa a Series joita voimme käyttää tässä juonessa. Samalla tavalla voimme käyttää sarakkeiden nimet myös heidän hakemistonsa kautta - df.columns[index], jota käytetään Y-akselin otsikon asettamiseen.

Lopuksi lisäämme/vähennämme laskuria ja soitamme plt.draw() päivittää Figure:

Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Kun napsautamme Seuraava ominaisuus -painiketta, sarakeluettelon seuraava ominaisuus piirretään vastaan Alkoholi, ja Figure päivitetään asianmukaisesti – tarrat, merkit ja asteikko. Sama pätee toisinkin päin - Edellinen ominaisuus kulkee listan läpi vastakkaiseen suuntaan, jolloin voimme pyöräillä edestakaisin turvamekanismin avulla, joka nollaa laskurimme aina, kun pääsemme syklin loppuun tai alkuun.

Radiopainikkeiden ja valintaruutujen lisääminen

Radiopainikkeet käytetään antamaan käyttäjälle mahdollisuus valita yksi arvo ulos useita arvoja. Vain yksi valintanappi voidaan valita kerrallaan, ja ne edustavat yleensä valintaa. Valintaruudut voidaan käyttää, jos haluat antaa käyttäjän valita useita vaihtoehtoja kerralla.

Huomautus: On hyvin rajoitettu mahdollisuus tarkistaa, onko valintaruutu on or pois. Itse asiassa, ei ole yhtään ulos laatikosta. Voit vain tarkistaa, onko laatikko puristettu or emme, mikä asettaa vakavan rajoituksen sen käytölle, koska meillä ei ole aavistustakaan, missä tilassa se oli ennen sitä. Ainoa vaihtoehto on pitää oma laskuri/tarkistus laatikon nykytilasta boolen avulla ja muuttaa logiikkaa sen perusteella.

Näin voit esimerkiksi lisätä valintaruudun jokaiselle mukauttamisargumentti tietyn juonen, jolloin käyttäjä voi asettaa ne True or False (valittu tai valitsematon) tai mikä tahansa muu näihin tiloihin perustuva ristiriitainen kartoitus.

Koska API on kuitenkin rajoitettu itsessään, rajoitamme myös aiottuun käyttöön – kytkemme asiat päälle ja pois. Meillä on kaksi ominaisuutta, joita voimme kääntää on ja pois valintaruudun kautta. Huomaa, että tämäkin toiminto on rajoitettu objekteihin, joiden kohdalla voit tarkistaa, ovatko ne näkyvissä vai eivät.

Toisaalta emme halua sallia käyttäjän soveltaa kahta asteikkoa kerralla tai asettaa kahta X-rajaa kerralla, koska vain toiseksi kutsuttu lause sovellettaisiin. Näihin - käyttäisimme radiopainikkeita.

Lisätään pari valintanappia, jotta käyttäjä voi valita akselialueen muutaman valintanäppäimen kautta, mutta myös toimintojen visualisointeja. on ja pois:

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

Jälleen kerran, meillä on kaksi menetelmää EventHandler() luokka - set_range() ja apply_features(). set_range() menetelmä asettaa alueen joko "pieneksi" tai "suuriksi" säätämällä Axes' X- ja Y-rajat. The apply_features() toiminto muuttaa visible aiemmin tekemiemme Line Plots -kenttään niiden nykyisen perusteella visible Tila. Jos visible == True, kytkemme Line Plotin pois päältä ja päinvastoin.

Meidän täytyy luottaa sisäänrakennettuun kykyyn tarkistaa Line Plots -näkyvyys, koska emme voi tarkistaa, onko valintaruutu valittu vai ei ennen. Tätä samaa kykyä voidaan jäljitellä a status boolean laajuudessa EventHandler() luokka, joka on asetettu True ja False jokaisesta napsautuksesta, juonityypeille, jotka eivät tue sen tarkistamista, ovatko ne näkyvissä valmiina.

Tämän koodin suorittaminen johtaa a Figure kahdella painikkeella alareunassa. Jos valitsemme molemmat valintaruudut, molemmat viivapiirrokset tulevat näkyviin:

Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Voimme sammuttaa ne yksitellen:

Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Ja voimme muuttaa aluetta Axes radiopainikkeiden kautta:

Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Tekstilaatikoiden lisääminen

Tekstilaatikot ovat tottuneet kerätä käyttäjältä saadut tiedot – ja voimme muuttaa kaavioita näiden tietojen perusteella. Voimme esimerkiksi pyytää käyttäjää syöttämään ominaisuuden nimen tai lisäämään funktion juonimme visualisointia varten. Tietysti työskentely käyttäjän syötteen kanssa voi olla hankalaa – aina löytyy reunatapauksia, joihin kannattaa kiinnittää huomiota.

Kirjoitetaan komentosarja, jonka avulla käyttäjä voi syöttää a ominaisuuden nimi tietojoukosta ja Axes päivitykset jokaiseen lähetykseen vastaamaan panosta. Käyttäjän mukavuuden vuoksi ilmoitamme heille, jos syötettä ei voitu yhdistää sarakkeen nimeen:

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

Meillä on yksinkertainen tarkistus nähdäksemme, onko toimitettu feature_name on tyhjä tai None, jolloin emme tee mitään. Jos ei, tarkistamme, onko feature_name on läsnä DataFrame, liittämällä viestin, että ominaisuutta ei löydy, jos sitä ei ole. Ennen tekstin liittämistä meidän on kuitenkin varmistettava, että edellinen viesti poistetaan, jotta uusi ei mene päällekkäin sen kanssa. The axes.texts omaisuus on luettelo kaikista Text tapauksia an Axes. Koska Axes on jo a Text esimerkiksi kuuluvat meidän TextBox, emme halua poistaa mitään, jos niitä on 2 tai vähemmän Text esiintyvät esiintymät – virheilmoitus ja TextBox etiketti.

Jos yli kaksi, olemme jo saaneet virheilmoituksen, joka pitäisi poistaa.

Jos ominaisuus is Läsnä DataFrame, kuitenkin tyhjennämme Axes ja piirrä se:

Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Lisää jännevalitsimia

Span valitsimet voidaan käyttää antamaan käyttäjälle mahdollisuus valita data-alue ja keskittyä siihen asettamalla akselin rajat valinnan perusteella. Oletuksena monet kirjastot tukevat tätä toimintoa, vaikka valitettavasti Matplotlib ei tue, ja meidän on tehtävä tämä manuaalisesti. Lisäksi meidän on lisättävä ylimääräinen "Reset" painiketta, jos haluamme loitontaa samoin.

Lisää a Alueen valitsin, meidän ei tarvitse omistaa kokonaan uutta Axes sitä varten – voimme liittää sen olemassa olevaan, mikä on hyvin järkevää. Kun luodaan a SpanSelector, toimitamme Axes se kuuluu sekä tapahtumakäsittelijälle, jota seuraa 'horizontal' or 'vertical', joka pyörittää Axes ja Span Selector molemmat.

- useblit argumentti on yleensä asetettu arvoon True koska se parantaa suorituskykyä useimmissa taustajärjestelmissä. Lisäksi olemme lisänneet muutamia tyyliominaisuuksia, kuten asettamisen alpha suorakulmion aluevalitsimeksi luodusta 0.5 ja facecolor mukavaksi 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()

Tämän suorittaminen luo kaavion, jolta voimme valita jännevälit ja lähentää niitä asettamalla Axes-rajat annettuihin arvoihin:

Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Liukusäätimien lisääminen

Sliders avulla käyttäjät voivat valita useiden arvojen välillä intuitiivisesti liu'uttamalla merkkiä ja valitsemalla arvon. Tyypillisesti liukusäätimiä käytetään jatkuvasti päivittämään jonkin kaavion arvoa, kuten sen vaihteluväliä or jopa ominaisuus. Voit esimerkiksi säätää vakion arvoa liukusäätimellä, mikä puolestaan ​​vaikuttaa funktioon, joka perustuu kyseiseen vakioon.

Kirjoitetaan skripti, jonka avulla voimme muuttaa Y- ja X-akselin rajoja liukusäätimen avulla, jonka avulla voimme muuttaa näkökulmaa, josta tarkastelemme tietojamme:

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

Olemme säätäneet pehmustetta sallimaan liukusäätimen vasemmalla ja alareunalla Axes, ja piirsi yksinkertaisen viivakaavion. Liukusäätimen lisääminen edellyttää, että teemme an Axes sitä varten, kuten useimpien muidenkin widgetien kanssa, ja määritä se ax väite Slider rakentajan kautta. Lisäksi voimme asettaa liukusäätimen minimi-, maksimi- ja alkuarvot. Nämä ovat yleensä dynaamisia alueita, jotka perustuvat piirtämiisi tietoihin, mutta ne voidaan myös asettaa manuaalisesti skalaariarvoja.

Lopuksi, Sliders voidaan suunnata vaaka- tai pystysuunnassa. Koska niitä on tarkoitus päivittää jatkuvasti hiiren pyyhkäisyllä - on_changed() -toimintoa käytetään laukaisemaan vastaus, kun käyttäjä antaa syötteen. Olemme säätäneet EventHandler luokka an update() toiminto, joka yksinkertaisesti säätää X- ja Y-rajojen arvoja valvastaavien liukusäätimien käyttö.

Tämän koodin suorittaminen tuottaa kaavion, jossa on kaksi liukusäädintä, joiden avulla voimme muuttaa koodin laajuutta Axes:

Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Matplotlib-widgetit PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Aikaleima:

Lisää aiheesta Stackabus