Matplotlib eignet sich nicht nur für statische Plots. Während GUIs typischerweise mit GUI-Bibliotheken und Frameworks wie erstellt werden PyQt, Tkinter, Kivy und wxPython, und während Python eine hervorragende Integration mit PyQt, Tkinter hat und wxPython – für einige grundlegende GUI-Funktionen ist es nicht erforderlich, eines davon zu verwenden Matplotlib-Widgets.
Das matplotlib.widgets
Das Modul verfügt über mehrere Klassen, darunter die AxesWidget
, aus welchen Button
s, CheckButton
s, Slider
s, TextBox
es usw. werden abgeleitet. Diese akzeptieren alle das Axes
Sie werden als einziges obligatorisches Konstruktorargument hinzugefügt und ihre Positionierung muss manuell festgelegt werden. Zu beachten ist, dass die Widget sind die Achsen, also erstellen Sie eine Axes
Instanz für jedes Widget.
Eine andere Sache zu beachten ist, dass Sie müssen Verweise auf die Widgets beibehalten andernfalls könnte der Müll eingesammelt werden.
Jeder von ihnen kann auch per Einstellung deaktiviert werden active
zu False
In diesem Fall reagieren sie nicht auf Ereignisse, z. B. darauf, darauf geklickt zu werden. Abgesehen davon können wir durch verschiedene GUI-Elemente und -Komponenten eine neue Art von Interaktivität in unsere Plots einführen.
Hinweis: Matplotlib ist nicht für die Erstellung hochwertiger GUIs oder benutzerfreundlicher Systeme gedacht. Diese Widgets sind rudimentär, sehen nicht wirklich gut aus und haben eine eingeschränkte Funktionalität. Sie sind dazu gedacht, Prototypen zu erstellen und Dinge zu testen, anstatt sie tatsächlich auszuliefern.
Wenn Sie schon einmal mit PyQt gearbeitet haben, stellen Sie möglicherweise fest, dass die allgemeine Syntax und der Ansatz zum Hinzufügen dieser Widgets sowie zum Verbinden dieser Widgets mit Ereignishandlern ziemlich vertraut sind.
Schaltflächen hinzufügen
Beginnen wir mit Tasten - Die matplotlib.widgets
Modul definiert a Button
Klasse. Um eine Verbindung herzustellen, rufen wir das auf on_clicked()
Funktion, die die von uns bereitgestellte Funktion ausführt. Sobald ein Klick erkannt wurde, wird die Funktion ausgeführt.
Beim Erstellen der Schaltfläche weisen wir eine zu Axes
dazu dient zur Positionierung. Wir können auch a übergeben label
zu diesem Zeitpunkt, um etwas Text hinzuzufügen und ihn für einen Benutzer zu kommentieren. Der color
und hovercolor
Argumente definieren die Farbe der Schaltfläche, bevor und nachdem der Mauszeiger darüber gehalten wird.
Da wir uns um die Positionierung und den Platz für alle Widgets kümmern, erstellen wir ein Figure
und Axes
, lassen Sie unten etwas Abstand, um eine Schaltfläche hinzuzufügen, und zeichnen Sie ein leeres Streudiagramm. Dann definieren wir eine EventHandler
Klasse, die eine einzelne Methode hat add_random()
. Die Methode generiert zwei Zufallszahlen und zeichnet dafür einen Marker auf Axes
Wir haben bereits zuvor Anrufe erstellt plt.draw()
, wodurch die neu gezeichnet wird Figure
. Bei der Aktualisierung von Grundstücken müssen wir immer anrufen plt.draw()
noch einmal, um es tatsächlich zu aktualisieren:
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()
Dies führt zu a Figure
, mit einem leeren Axes
darin und eine eigene Schaltfläche in der oberen rechten Ecke des Bildschirms Axes
:
Und nachdem wir den Knopf ein paar Dutzend Mal gedrückt hatten, unser ax
wird mit zufälligen Markern gefüllt:
Praktischer ausgedrückt könnten wir eine erstellen Zyklus Anzahl der Features, die bei jedem Tastendruck aufgezeichnet werden sollen. Dies erfordert ein paar Anpassungen an der EventHandler
, sowie eine weitere Schaltfläche, um durch diesen Zyklus zurückzugehen.
Verwenden wir die Rotweinqualität Datensatz erneut und visualisieren Sie mehrere Features anhand des Datensatzes Alkohol Besonderheit. Da wir uns nicht die Mühe machen können, diese einzeln darzustellen, schreiben wir den Code, um ein Feature gegen das andere darzustellen, und ändern dann diesen Code, um ein anderes Feature gegen das andere darzustellen.
Das Erstellen einer Streumatrix könnte uns hier helfen, aber wenn der Datensatz viele Funktionen hat, ist er ziemlich unlesbar und wir werden nicht weit kommen. Wenn Sie möchten beide großflächige Darstellungen, die Sie leicht betrachten und interpretieren können, auch B. das Durchlaufen mehrerer Funktionen ohne zusätzlichen Aufwand – Sie können diesen Vorgang mit Schaltflächen automatisieren:
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()
Das EventHandler
Klasse hat jetzt zwei Methoden – next_feature()
und previous_feature()
. Beide prüfen, ob der Zähler i
das Ende oder den Anfang der Spaltenliste erreicht hat – und um ein zu vermeiden IndexError
, setzen wir den Index auf den entgegengesetzten Wert zurück und simulieren a Zyklus. Gehen Sie nach unten 0
bringt uns zurück zum Ende der Spaltenliste, und wenn wir über die letzte Spalte gehen, kehren wir zur ersten zurück.
Nachdem wir festgestellt haben, wo wir uns befinden – wir klar die Axes
, da wir erneut auf einem vorhandenen Grundstück plotten würden, ohne es durchzuräumen cla()
(clOhr axes). Alternativ können Sie auch Feature-Beziehungen stapeln, indem Sie sie übereinander zeichnen und verwenden cla()
Anweisung beim Zurücksetzen des Index am Ende/Beginn des Zyklus.
Nach dem Löschen der Axes
– Wir haben eine leere Leinwand, auf der wir malen können ax.scatter()
Funktion. In diesem Beispiel ist die feste Funktion Alkohol, also ist es jederzeit präsent. Die andere Funktion ist unterschiedlich und kann über aufgerufen werden iloc[]
, indem der Index der Spalte übergeben wird. Dies gibt a zurück Series
die wir in dieser Handlung verwenden können. Ebenso können wir darauf zugreifen Spaltennamen auch über ihren Index – df.columns[index]
, mit dem die Beschriftung der Y-Achse festgelegt wird.
Zum Schluss erhöhen/verringern wir den Zähler und rufen an plt.draw()
um die zu aktualisieren Figure
:
Sobald wir auf das klicken Nächstes Feature Klicken Sie auf die Schaltfläche, um das nächste Feature in der Spaltenliste darzustellen Alkoholund der Figure
werden entsprechend aktualisiert – die Beschriftungen, Markierungen und der Maßstab. Das Gleiche gilt auch umgekehrt – Vorherige Funktion durchläuft die Liste in die entgegengesetzte Richtung und ermöglicht es uns, hin und her zu radeln, mit einem Sicherheitsmechanismus, der unseren Zähler jedes Mal zurücksetzt, wenn wir das Ende oder den Anfang des Zyklus erreichen.
Hinzufügen von Optionsfeldern und Kontrollkästchen
Radio Knöpfe werden verwendet, um einem Benutzer die Auswahl zu ermöglichen ein Wert von mehrere Werte. Es kann jeweils nur ein Optionsfeld ausgewählt werden, das normalerweise eine Auswahl darstellt. Kontrollkästchen kann verwendet werden, wenn Sie dem Benutzer die gleichzeitige Auswahl mehrerer Optionen ermöglichen möchten.
Hinweis: Es gibt nur sehr begrenzte Möglichkeiten, zu überprüfen, ob ein Kontrollkästchen vorhanden ist on or WOW!. Tatsächlich gibt es keines, das sofort einsatzbereit ist. Sie können immer nur überprüfen, ob das Kästchen vorhanden ist Press or nicht, was eine ernsthafte Einschränkung seiner Verwendungsmöglichkeiten darstellt, da wir keine Ahnung haben, in welchem Zustand es sich zuvor befand. Die einzige Alternative besteht darin, Ihren eigenen Zähler bzw. Ihre eigene Überprüfung des aktuellen Zustands der Box mit einem booleschen Wert beizubehalten und die Logik darauf basierend zu ändern.
Auf diese Weise können Sie beispielsweise jeweils ein Kontrollkästchen hinzufügen Anpassungsargument einer bestimmten Handlung, so dass der Benutzer sie festlegen kann True
or False
(markiert oder nicht markiert) oder jede andere nicht widersprüchliche Zuordnung basierend auf diesen Zuständen.
Da die API jedoch selbst begrenzt ist, beschränken wir uns auch auf die beabsichtigte Verwendung – das Ein- und Ausschalten von Dingen. Wir werden zwei Funktionen haben, die wir umsetzen können on und WOW! über eine Checkbox. Beachten Sie, dass auch diese Funktionalität auf Objekte beschränkt ist, bei denen Sie überprüfen können, ob sie sichtbar sind oder nicht.
Andererseits möchten wir dem Benutzer nicht erlauben, zwei Skalen gleichzeitig anzuwenden oder zwei X-Limits gleichzeitig festzulegen, da nur die Anweisung angewendet werden würde, die als zweite in der Sequenz aufgerufen wird. Für diese würden wir Radio Buttons verwenden.
Fügen wir ein paar Optionsfelder hinzu, um dem Benutzer die Auswahl des Achsenbereichs über ein paar Optionsfelder zu ermöglichen, ihm aber auch die Visualisierung von Drehfunktionen zu ermöglichen on und WOW!:
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()
Auch hier haben wir zwei Methoden im Angebot EventHandler()
Klasse - set_range()
und apply_features()
dem „Vermischten Geschmack“. Seine set_range()
Die Methode legt den Bereich entweder auf „klein“ oder „groß“ fest, indem sie die anpasst Axes
‘ X- und Y-Grenzen. Der apply_features()
Funktion ändert die visible
Feld der Liniendiagramme, die wir zuvor erstellt haben, basierend auf ihrem aktuellen visible
Status. Wenn visible == True
, schalten wir den Linienplot aus und umgekehrt.
Wir müssen uns auf die integrierte Fähigkeit verlassen, die Sichtbarkeit von Liniendiagrammen zu überprüfen, da wir nicht überprüfen können, ob das Kontrollkästchen zuvor aktiviert war oder nicht. Dieselbe Fähigkeit kann mit a nachgeahmt werden status
boolean im Rahmen der EventHandler()
Klasse, die auf eingestellt ist True
und False
bei jedem Klick, für Plottypen, die die Überprüfung, ob sie sofort sichtbar sind, nicht unterstützen.
Das Ausführen dieses Codes führt zu a Figure
mit zwei Knöpfen unten. Wenn wir beide Kontrollkästchen aktivieren, werden beide Liniendiagramme angezeigt:
Wir können sie einzeln deaktivieren:
Und wir können die Reichweite ändern Axes
über die Radio Buttons:
Textfelder hinzufügen
Textfelder sind gewöhnt an sammeln Daten vom Benutzer – und wir können die Diagramme basierend auf diesen Daten ändern. Beispielsweise können wir einen Benutzer bitten, den Namen eines Features einzugeben oder eine Funktion zur Visualisierung unseres Plots einzufügen. Natürlich kann die Arbeit mit Benutzereingaben schwierig sein – es gibt immer Randfälle, auf die man achten muss.
Schreiben wir ein Skript, das es dem Benutzer ermöglicht, eine einzugeben Merkmalsname eines Datensatzes und die Axes
Aktualisierungen zu jeder Einreichung, um den Input widerzuspiegeln. Zur Vereinfachung des Benutzers informieren wir ihn, wenn die Eingabe nicht mit einem Spaltennamen abgeglichen werden konnte:
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()
Wir haben eine einfache Überprüfung, um zu sehen, ob die bereitgestellten Informationen vorliegen feature_name
ist leer oder None
In diesem Fall unternehmen wir nichts. Wenn nicht, prüfen wir, ob die feature_name
ist in der DataFrame
, indem Sie eine Nachricht anhängen, dass die Funktion nicht gefunden wurde, wenn sie nicht vorhanden ist. Bevor wir den Text anhängen, müssen wir jedoch sicherstellen, dass die vorherige Nachricht entfernt wird, damit die neue nicht mit ihr überschneidet. Der axes.texts
Eigenschaft ist eine Liste aller Text
Instanzen auf einem Axes
. Seit der Axes
hat schon eine Text
Beispiel, Zugehörigkeit zu unserem TextBox
, wir wollen nichts entfernen, wenn es 2 oder weniger sind Text
Instanzen vorhanden – die Fehlermeldung und die TextBox
Etikette.
Bei mehr als zwei haben wir bereits eine Fehlermeldung erhalten, die entfernt werden sollte.
Wenn die Funktion is anwesend in der DataFrame
, aber wir klären das Axes
und plotte es:
Hinzufügen von Span-Selektoren
Span-Selektoren kann verwendet werden, um es dem Benutzer zu ermöglichen, einen Datenbereich auszuwählen und sich darauf zu konzentrieren, wobei die Achsengrenzen basierend auf dieser Auswahl festgelegt werden. Standardmäßig unterstützen viele Bibliotheken diese Funktionalität, Matplotlib leider nicht und wir müssen dies manuell tun. Darüber hinaus müssen wir noch ein Extra hinzufügen "Zurücksetzen" Taste, wenn wir wollen Verkleinern .
Hinzufügen eines Bereichsauswahl, wir müssen kein ganz neues widmen Axes
dafür – wir können es an ein bestehendes anhängen, was sehr sinnvoll ist. Beim Generieren eines SpanSelector
, wir liefern die Axes
es gehört dazu, ebenso wie der Event-Handler, gefolgt von 'horizontal'
or 'vertical'
, die die dreht Axes
und Span Selector beides.
Das useblit
Das Argument wird normalerweise auf gesetzt True
weil es die Leistung auf den meisten Backends verbessert. Darüber hinaus haben wir einige Styling-Eigenschaften hinzugefügt, z. B. das Festlegen des alpha
des als Span Selector erstellten Rechtecks auf 0.5
und für facecolor
zu einem schönen 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()
Wenn Sie dies ausführen, wird ein Diagramm erstellt, in dem wir Spannen auswählen und vergrößern können, indem wir die Achsengrenzen auf die angegebenen Werte setzen:
Schieberegler hinzufügen
Sliders Ermöglichen Sie Benutzern die intuitive Auswahl zwischen vielen Werten, indem Sie eine Markierung verschieben und einen Wert auswählen. Typischerweise werden Schieberegler verwendet, um einen Wert in einem Diagramm, beispielsweise seinen Bereich, kontinuierlich zu aktualisieren or sogar ein Feature. Sie können beispielsweise den Wert einer Konstante über einen Schieberegler anpassen, was sich wiederum auf eine Funktion auswirkt, die auf dieser Konstante basiert.
Schreiben wir ein Skript, das es uns ermöglicht, die Y- und X-Achsengrenzen über einen Schieberegler zu ändern, wodurch wir die Perspektive ändern können, aus der wir unsere Daten betrachten:
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()
Wir haben die Polsterung angepasst, um links und unten einen Schieber zu ermöglichen Axes
und zeichnete ein einfaches Liniendiagramm. Um einen Schieberegler hinzuzufügen, müssen wir einen erstellen Axes
dafür, wie bei den meisten anderen Widgets, und weisen Sie es dem zu ax
Argument der Slider
durch den Konstruktor. Darüber hinaus können wir die minimalen, maximalen und anfänglichen Werte des Schiebereglers festlegen. Dabei handelt es sich in der Regel um dynamische Bereiche, die auf den Daten basieren, die Sie zeichnen, es können aber auch manuell festgelegte Skalarwerte sein.
Schließlich Slider
s können horizontal oder vertikal ausgerichtet sein. Da sie per Mauswisch kontinuierlich aktualisiert werden sollen – die on_changed()
Die Funktion wird verwendet, um eine Antwort auszulösen, wenn ein Benutzer eine Eingabe macht. Wir haben das optimiert EventHandler
Klasse mit einem update()
Funktion, die einfach die Werte der X- und Y-Grenzen basierend auf anpasst val
ue der jeweiligen Schieberegler.
Wenn Sie diesen Code ausführen, wird ein Diagramm mit zwei Schiebereglern erstellt, mit denen wir den Umfang des Diagramms ändern können Axes
:
- Zugang
- Alle
- Zulassen
- bereits
- Ein anderer
- Bienen
- Ansatz
- Argumente
- um
- Anfang
- Sein
- Box
- eingebaut
- rufen Sie uns an!
- österreichische Unternehmen
- Fälle
- Übernehmen
- Überprüfung
- Code
- Kolonne
- könnte
- Paar
- Erstellen
- Strom
- Aktuellen Zustand
- technische Daten
- engagiert
- erkannt
- Dutzend
- dynamisch
- leicht
- Edge
- Event
- Veranstaltungen
- Beispiel
- Ausgezeichnet
- Merkmal
- Eigenschaften
- Vorname
- Setzen Sie mit Achtsamkeit
- gefunden
- Funktion
- Funktionalität
- Allgemeines
- gehen
- groß
- Grün
- mit
- Hilfe
- hier
- Ultraschall
- HTTPS
- Idee
- Einschließlich
- Index
- Integration
- IT
- Etiketten
- grosse
- Limitiert
- Line
- Liste
- Matrix
- vor allem warme
- Zahlen
- Optionen
- Andere
- Andernfalls
- Leistung
- Perspektive
- Gegenwart
- Presse
- Prozessdefinierung
- produziert
- Resorts
- Radio
- Angebot
- RE
- Antwort
- Die Ergebnisse
- Rückgabe
- Sicherheit
- Said
- Skalieren
- Bildschirm
- ausgewählt
- Sinn
- kompensieren
- Einstellung
- Einfacher
- klein
- So
- Raumfahrt
- Anfang
- Bundesstaat
- Erklärung
- Staaten
- Status
- liefern
- Support
- Systeme und Techniken
- Test
- Durch
- Zeit
- Top
- Aktualisierung
- Updates
- us
- Nutzer
- Wert
- Anzeigen
- Sichtbarkeit
- sichtbar
- ob
- ohne
- gearbeitet
- arbeiten,
- Schreiben
- X
- Jahr
- Zoom