Einführung
In diesem Labyrinth lernen Sie, wie Sie mit mehreren Zeichenflächen interagieren können. Indem Sie einen Punkt auf einer Achse auswählen und hervorheben, generieren Sie die Daten dieses Punktes auf der anderen Achse. Für dieses Labyrinth verwenden wir Python Matplotlib.
Tipps für die virtuelle Maschine
Nachdem der Start der virtuellen Maschine abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu öffnen.
Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.
Wenn Sie während des Lernens Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.
Bibliotheken importieren
Wir beginnen mit dem Import der erforderlichen Bibliotheken.
import numpy as np
import matplotlib.pyplot as plt
Daten generieren
Wir werden mit NumPy zufällige Daten generieren.
np.random.seed(19680801)
X = np.random.rand(100, 200)
xs = np.mean(X, axis=1)
ys = np.std(X, axis=1)
Figur und Achsen erstellen
Wir werden eine Figur mit zwei Achsen erstellen.
fig, (ax, ax2) = plt.subplots(2, 1)
Daten plotten
Wir werden die generierten Daten auf der ersten Achse plotten.
line, = ax.plot(xs, ys, 'o', picker=True, pickradius=5)
Punkt-Browser-Klasse erstellen
Wir werden eine Klasse erstellen, um die Funktionalität des Punkt-Browsers zu verwalten.
class PointBrowser:
def __init__(self):
self.lastind = 0
self.text = ax.text(0.05, 0.95, 'ausgewählt: keines',
transform=ax.transAxes, va='top')
self.selected, = ax.plot([xs[0]], [ys[0]], 'o', ms=12, alpha=0.4,
color='gelb', visible=False)
def on_press(self, event):
if self.lastind is None:
return
if event.key not in ('n', 'p'):
return
if event.key == 'n':
inc = 1
else:
inc = -1
self.lastind += inc
self.lastind = np.clip(self.lastind, 0, len(xs) - 1)
self.update()
def on_pick(self, event):
if event.artist!= line:
return True
N = len(event.ind)
if not N:
return True
## die Klickpositionen
x = event.mouseevent.xdata
y = event.mouseevent.ydata
distances = np.hypot(x - xs[event.ind], y - ys[event.ind])
indmin = distances.argmin()
dataind = event.ind[indmin]
self.lastind = dataind
self.update()
def update(self):
if self.lastind is None:
return
dataind = self.lastind
ax2.clear()
ax2.plot(X[dataind])
ax2.text(0.05, 0.9, f'mu={xs[dataind]:1.3f}\nsigma={ys[dataind]:1.3f}',
transform=ax2.transAxes, va='top')
ax2.set_ylim(-0.5, 1.5)
self.selected.set_visible(True)
self.selected.set_data(xs[dataind], ys[dataind])
self.text.set_text('ausgewählt: %d' % dataind)
fig.canvas.draw()
Ereignishandler verbinden
Wir werden die Ereignishandler mit der Figurcanvas verbinden.
browser = PointBrowser()
fig.canvas.mpl_connect('pick_event', browser.on_pick)
fig.canvas.mpl_connect('key_press_event', browser.on_press)
Diagramm anzeigen
Wir werden das Diagramm anzeigen.
plt.show()
Zusammenfassung
In diesem Lab haben wir gelernt, wie man mit Python Matplotlib Daten mit mehreren Canvases interagieren kann. Wir haben eine Klasse erstellt, um die Funktionalität des Punkt-Browsers zu verwalten, und Ereignishandler mit der Figurcanvas verbunden, um Interaktivität zu ermöglichen.