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 Button
s, CheckButton
s, Slider
s, TextBox
es 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
:
Ja kun nappia on painettu parikymmentä kertaa, meidän ax
täytetään satunnaisilla merkeillä:
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
:
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:
Voimme sammuttaa ne yksitellen:
Ja voimme muuttaa aluetta Axes
radiopainikkeiden kautta:
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:
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:
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, Slider
s 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 val
vastaavien liukusäätimien käyttö.
Tämän koodin suorittaminen tuottaa kaavion, jossa on kaksi liukusäädintä, joiden avulla voimme muuttaa koodin laajuutta Axes
:
- pääsy
- Kaikki
- Salliminen
- jo
- Toinen
- api
- lähestymistapa
- perustelut
- noin
- Alku
- ovat
- Laatikko
- sisäänrakennettu
- soittaa
- joka
- tapauksissa
- muuttaa
- tarkkailun
- koodi
- Sarake
- voisi
- Pari
- Luominen
- Nykyinen
- Nykyinen tila
- tiedot
- omistautunut
- havaittu
- tusina
- dynaaminen
- helposti
- reuna
- tapahtuma
- Tapahtumat
- esimerkki
- erinomainen
- Ominaisuus
- Ominaisuudet
- Etunimi
- Keskittää
- löytyi
- toiminto
- toiminnallisuus
- general
- menee
- suuri
- Vihreä
- ottaa
- auttaa
- tätä
- Miten
- HTTPS
- ajatus
- Mukaan lukien
- indeksi
- integraatio
- IT
- tarrat
- suuri
- rajallinen
- linja
- Lista
- Matriisi
- eniten
- numerot
- Vaihtoehdot
- Muut
- muuten
- suorituskyky
- näkökulma
- esittää
- painaa
- prosessi
- tuottaa
- omaisuus
- radio
- alue
- RE
- vastaus
- tulokset
- Tuotto
- Turvallisuus
- Said
- Asteikko
- Näytön
- valittu
- tunne
- setti
- asetus
- Yksinkertainen
- pieni
- So
- Tila
- Alkaa
- Osavaltio
- Lausunto
- Valtiot
- Tila
- toimittaa
- tuki
- järjestelmät
- testi
- Kautta
- aika
- ylin
- Päivitykset
- Päivitykset
- us
- Käyttäjät
- arvo
- Näytä
- näkyvyys
- näkyvä
- onko
- ilman
- työskenteli
- työskentely
- kirjoittaminen
- X
- vuosi
- zoomaus