image image


image

Matplotlib.quiver: Ein Köcher für Vektoren

Von Mecit Yaman gibt es auf YouTube eine vierzehnteilige Playlist »Scientific Computation using Python« und in dem sechsten Video entdeckte ich eine Funktion, die ich bis dato nicht kannte: Mit matplotlib.pyplot.quiver() kann man nämlich recht einfach Vektoren als Pfeile darstellen. Gedacht ist dieser Köcher für Vektoren eigentlich, um ganze Vektorfelder zu visualisieren, aber die einfache Darstellung einzelner Vektoren geht damit natürlich auch.

Ich habe das einmal ausprobiert und mich dabei weitestgehend an dem Video von Mecit Yaman orientiert:

import numpy as np
import matplotlib.pyplot as plt

def mag(v):
    vx, vy = v
    return(np.sqrt(vx**2 + vy**2))

def normalize(v):
    vx, vy = v
    m = mag(v)
    return(vx/m, vy/m)

def angle_between(v1, v2, degrees = False):
    v1x, v1y = v1
    v2x, v2y = v2
    m_v1 = mag(v1)
    m_v2 = mag(v2)
    
    angle = np.arccos((v1x*v2x + v1y*v2y)/(m_v1*m_v2))
    if degrees:
        angle = angle/np.pi*180
    
    return(angle)

def projection(v1, v2):
    vx, vy = v1
    ux, uy = normalize(v2)
    return(vx*ux + vy*uy)

fig, axes = plt.subplots()
axes.set_aspect(1)

plt.xlim(-3.0, 3.0)
plt.ylim(-3.0, 3.0)

a = ax, ay = np.random.randn(2)
# b = bx, by = 0.0, 2.0
b = bx, by = np.random.randn(2)

print(a, b)

plt.quiver(0, 0, ax, ay, scale = 1, units = "xy", color = "blue")
plt.quiver(0, 0, bx, by, scale = 1, units = "xy", color = "red")

ux, uy = normalize(b)
proj = projection(a, b)
plt.quiver(0, 0, proj*ux, proj*uy, scale = 1, units = "xy", color = "green")

print("Die Länge des Vektors a ist %5.2f" %mag(a))
print("Die Länge des Vektors b ist %5.2f" %mag(b))
print("Der Winkel zwischen a und b in Radians ist %5.2f" %angle_between(a, b))
print("Der Winkel zwischen a und b in Grad ist %0.0f" %angle_between(a, b, degrees = True))

Die Syntax von quiver(x, y, u, v) ist straigthforward: x, y bezeichnet den Ursprung des Vektors im Koordinatensystem, u, v die Richtung des Vektors. Daneben gibt es noch eine Reihe optionaler Parameter, von denen ich scale, units und color genutzt habe. scale setzt die Länge des Vektors im Bezug auf das Koordinatensystem, units die Dimension, in meinem Falle die x- und y-Achse des Koordinatensystems, und color – Ihr ahnt es schon – gibt dem Vektor eine Farbe.

Während mag() und normalize() schon bestehende Methoden meiner eigenen Vektorklasse PVector sind, werde ich angle_between() und projection() noch implementieren, natürlich ohne die Abhängigkeiten von Numpy, denn schließlich soll sie auch in Jython und TigerJython funktionieren.

Wie der Screenshot zeigt, habe ich für dieses Script zum ersten Mal Spyder als Python-IDE genutzt und ich bin recht angetan. Denn wenn man sich das Teil so zurechtbiegt, daß es auf der rechten Seite nur die IPython-Konsole und auf der linken Seite nur den Editor anzeigt und das ganze andere – in meinen Augen – überflüssige Gedöns wegklickt1, dann wird es tatsächlich zu einem brauchbaren Werkzeug für die Python-Programmierung.

  1. Wenn man das »Gedöns« doch mal braucht, kann man es sich via Menü oder Tastaturkürzel anzeigen lassen. 


(Kommentieren) 

image image



Über …

Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!

Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.

Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.

Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.


Werbung

Diese Spalte wurde absichtlich leergelassen!


Werbung


image  image  image
image  image  image


image