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 Button
s, CheckButton
s, Slider
s, TextBox
es 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
:
És miután néhány tucatszor megnyomtuk a gombot, a mi ax
véletlenszerű markerekkel lesz feltöltve:
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
:
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:
Egyenként is kikapcsolhatjuk őket:
És megváltoztathatjuk a tartományt Axes
a rádiógombokon keresztül:
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:
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:
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, Slider
s 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 val
a 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
:
- hozzáférés
- Minden termék
- lehetővé téve
- már
- Másik
- api
- megközelítés
- érvek
- körül
- Kezdet
- hogy
- Doboz
- beépített
- hívás
- ami
- esetek
- változik
- ellenőrzése
- kód
- Oszlop
- tudott
- Pár
- létrehozása
- Jelenlegi
- Jelenlegi állapot
- dátum
- elszánt
- észlelt
- tucat
- dinamikus
- könnyen
- él
- esemény
- események
- példa
- kiváló
- Funkció
- Jellemzők
- vezetéknév
- Összpontosít
- talált
- funkció
- funkcionalitás
- általános
- megy
- nagy
- Zöld
- tekintettel
- segít
- itt
- Hogyan
- HTTPS
- ötlet
- Beleértve
- index
- integráció
- IT
- Címkék
- nagy
- Korlátozott
- vonal
- Lista
- Mátrix
- a legtöbb
- számok
- Opciók
- Más
- másképp
- teljesítmény
- perspektíva
- be
- nyomja meg a
- folyamat
- gyárt
- ingatlan
- rádió
- hatótávolság
- RE
- válasz
- Eredmények
- Visszatér
- Biztonság
- Mondott
- Skála
- Képernyő
- kiválasztott
- értelemben
- készlet
- beállítás
- Egyszerű
- kicsi
- So
- Hely
- kezdet
- Állami
- nyilatkozat
- Államok
- Állapot
- kínálat
- támogatás
- Systems
- teszt
- Keresztül
- idő
- felső
- Frissítések
- Frissítés
- us
- Felhasználók
- érték
- Megnézem
- láthatóság
- látható
- vajon
- nélkül
- dolgozott
- dolgozó
- írás
- X
- év
- gyertya