Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Matplotlib-Widgets

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 Buttons, CheckButtons, Sliders, TextBoxes 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 FalseIn 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:

Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Und nachdem wir den Knopf ein paar Dutzend Mal gedrückt hatten, unser ax wird mit zufälligen Markern gefüllt:

Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

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:

Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

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:

Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Wir können sie einzeln deaktivieren:

Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Und wir können die Reichweite ändern Axes über die Radio Buttons:

Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

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 NoneIn 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:

Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

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:

Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

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 Axesund 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 Sliders 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 value 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:

Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Matplotlib-Widgets PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Zeitstempel:

Mehr von Stapelmissbrauch