Pyplot

Plotting

Plotting

Grundlegende (low-level) Library für Plotting: matplotlib

Abstrahierende Interfaces zu grundlegenden matplotlib Funktionen:

  • pyplot (enthalten in matplotlib, ähnlich zum matlab Plotinterface)
  • pandas Plotfunktionen (basieren auf pyplot)
  • seaborn

Einfacher Plot mit pyplot

import numpy as np
import matplotlib.pyplot as plt

x = np.array([0, 1, 2, 3])

y1 = x*2
y2 = x**2

plt.plot(x, y1)
plt.plot(x, y2)

In Jupyter werden Plots automatisch angezeigt

wenn wir nicht Jupyter verwenden zusätzlich:

plt.show()

Einfacher Plot mit pyplot

Ergebnis:

Simple plot in pyplot

Beispiel

Wir erstellen einen Plot, der die Sinus- und Kosinusfunktion im Intervall von 0 bis 2Ï€ zeigt.

Beispiel

x = np.linspace(0, 2*3.1415, 200)

plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x))

Ãœbung

Erstelle eine Python-Funktion, die eine Gaußsche Glockenkurve basierend auf ihren Parametern mu und sigma zeichnet:

plot_gaussian_function(mu, sigma)

Pyplot: Konfiguration und Styling

Stile

Vorgefertigte Stylesheets verwendbar mittels:

plt.style.use("stylename")

siehe plt.style.available für eine Liste von verfügbaren Stilen (online Referenz)

Stile von Graphen

Beispiel zum Styling eines Graphen:

plt.plot(x, y, color="C0", marker="X", linestyle="dashed")

Stile von Graphen

mögliche Farbangaben:

  • Theme-Farbe (C0 ... C9)
  • Farbname (green / lightblue / ...)
  • Kurzname (r / g / b / c / m / y / k)
  • Hex-Code (z.B. #FFAA00)
  • RGB-Tupel (z.B. (1, 0.7, 0))

Stile von Graphen

mögliche Lininenstile:

  • "none" oder ""
  • "solid" oder "-"
  • "dashed" oder "--"
  • "dotted" oder ":"
  • "dashdot" oder "-."

Stile von Graphen

mögliche Marker:

  • "" (keine)
  • "." (kleiner Punkt)
  • "o" (großer Punkt)
  • "s" (Quadrat)
  • "X"
  • "+"
  • "," (Pixel)
  • ...

Stile von Graphen

wichtige Parameter:

  • color
  • linestyle
  • linewidth
  • marker
  • markersize

Stile von Graphen

Langform:

plt.plot(x, y, color="C0", marker="X", linestyle="dashed")

Kurzform (weniger flexibel):

plt.plot(x, y, "C0X--")

Label

  • plt.title("Trigonometric functions")
  • plt.xlabel("x (radians)")
  • plt.ylabel("y")

Label

Label für einzelne Graphen:

plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')

plt.legend()

Achsen

Achsen ausblenden:

plt.axis("off")

Achsenlimits

Ansicht einpassen (ohne Abstand zum Rand):

plt.axis("tight")

Bestimmten Ausschnitt anzeigen:

plt.axis([-1, 1, -1, 1])

Bestimmten Ausschnitt für einzelne Achse:

plt.xlim(-1, 1)

Achsenskalierung

Gleiche Einheitengröße auf beiden Achsen:

plt.axis("equal")

Gleiche Einheitengrößen und Beschränkung der Achsen auf verwendete Datenbereiche:

plt.axis("scaled")

Gitter

plt.grid(True)

Achsenmarkierungen

plt.yticks([-1, 0, 1])
plt.xticks(np.linspace(0, 2*np.pi, 5))

Ãœbungen

  • Sinus und Kosinus mit erweiterten Optionen
  • n-te Primzahl und Approximation via n * ln(n)
  • Schätzung von Pi durch zufällige Punkte

Ãœbung: Sinus und Kosinus mit erweiterten Optionen

mögliches Ergebnis:

Advanced plot of sine and cosine

Ãœbung: Sinus und Kosinus mit erweiterten Optionen

import matplotlib.pyplot as plt
import numpy as np

plt.style.use("seaborn")

x = np.linspace(0, 2*np.pi, 100)
sin = np.sin(x)
cos = np.cos(x)
plt.plot(x, sin, "C0--", label="sin(x)")
plt.plot(x, cos, "C1:", label="cos(x)")

pi_multiples = np.array([0, 0.5, 1, 1.5, 2]) * np.pi
sin_points = np.sin(pi_multiples)
cos_points = np.cos(pi_multiples)
plt.plot(pi_multiples, sin_points, "C0o")
plt.plot(pi_multiples, cos_points, "C1o")

plt.title("Trigonometric functions")
plt.xlabel("x (radians)")
plt.xticks(np.linspace(0, 2*np.pi, 5))
plt.legend()
plt.axis("scaled")

Eigene Stylesheets

plt.style.use("./mystyle.mplstyle")
# general configuration
axes.facecolor: EAEAF2

# line plot configuration
lines.linewidth: 1.5
lines.marker: o
lines.markersize: 4

# box plot configuration
boxplot.whiskers: 0, 100

Eigene Stylesheets

eigene Theme-Farben (C0 - C10):

axes.prop_cycle: cycler('color', ['4C72B0', '55A868', 'C44E52', '8172B2', 'CCB974', '64B5CD'])

Ressourcen

Pyplot API

Pyplot API

siehe:

https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.html

Gundlegende Plots

Grundlegende Plots

  • Graph: plt.plot(x, y) / plt.plot(y)
  • Säulen- und Balkendiagramm: plt.bar(x, y)
  • Scatter Plot: plt.plot(x, y, ".") / plt.scatter(x, y, size, color)
  • Histogramm: plt.hist(x)
  • Box Plot: plt.boxplot(x)
  • Tortendiagramm: plt.pie(x, labels=...)

Graph

Graph zusammengehöriger x- und y-Werte:

plt.plot(x, y)

Graph mit automatischem x (0, 1, ...):

plt.plot(y)

Säulen- und Balkendiagramm

plt.bar(x, y, width=0.6)
plt.bar(x, y, width=1, align="edge")

plt.bar(
    [0, 1, 2],
    [9.6, 17, 9.8],
    tick_label=["China", "Russia", "USA"]
)

# horizontal
plt.barh([0, 1, 2], [9.6, 17, 9.8])

Scatter Plot

Erstellt Datenpunkte mit zwei (oder mehr) zugehörigen Werten - einer auf der x- und einer auf der y-Achse

Einfach:

plt.plot(x, y, ".")

Fortgeschritten:

plt.scatter(x, y, s=sizes, c=colors)

Histogramm

Zählt die Häufigkeit von bestimmten Werten / Wertebereichen

plt.hist(many_simulated_dice_rolls_with_10_dice)
plt.hist(
    many_simulated_dice_rolls_with_10_dice,
    bins=[13, 18, 23, 28, 33, 38, 43, 48, 53, 58]
)
plt.hist(
    many_simulated_dice_rolls_with_10_dice,
    density=True
)

Box Plot

Visualisierung von statistischen Daten einer Verteilung (Minimum, Median, Maximum, ...)

plt.boxplot(dice_simulation_1, whis=(0, 100))
plt.boxplot(
    [dice_simulation_1, dice_simulation_2],
    labels=["simulation 1", "simulation 2"]
)

Tortendiagramm

plt.pie([3, 10, 17, 9], labels=["a", "b", "c", "d"])

plt.pie([3, 10, 17, 9], explode=[0, 0, 0, 0.1])

plt.pie([3, 10, 17, 9], startangle=90, counterclock=False)

Visualisierung von Iris-Daten

Iris Datensatz

Iris Datensatz: Abmessungen von 150 Iris-Blumen (50 vom Typ Iris Setosa, 50 vom Typ Iris versicolor und 50 vom Typ Iris Virginica)

Einträge: sepal length, sepal width, petal length, petal width

Laden der Daten

import pandas as pd
iris = pd.read_csv(
    "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv"
)
# get all rows and the first four columns as numpy data
iris = iris.iloc[:,:4].to_numpy()

sepal_length = iris[:,0]
sepal_width = iris[:,1]
petal_length = iris[:,2]
petal_width = iris[:,3]

Scatter Plot 1

Scatter Plot der petal length und petal width

Wir plotten die Datenpunkte in 50-er Gruppen in drei verschiedenen Farben

Scatter plot 2

Scatter Plot aller vier Iris-Eigenschaften

Wir verwenden Farbe und Größe, um sepal length und sepal width zu visualisieren

Histogramm und Boxplot

Histogramm der petal length

Boxplot für alle vier Abmessungen

Scatter Plot: Lösungen

plt.plot(petal_length[:50], petal_width[:50], ".",
         label="setosa")
plt.plot(petal_length[50:100], petal_width[50:100], ".",
         label="versicolor")
plt.plot(petal_length[100:150], petal_width[100:150], ".",
         label="virginica")

plt.legend()
plt.scatter(petal_length, petal_width,
            sepal_length*10, sepal_width)

Histogramm und Boxplot: Lösungen

plt.hist(
    petal_length,
    bins=np.arange(0.5, 7.5, 0.5)
)
plt.boxplot(
    [petal_length, petal_width, sepal_length, sepal_width],
    labels=["petal length", "petal width", "sepal length",
            "sepal width"],
    whis=(0, 100)
)

Figure, Axes & Subplots

Figure & Axes

Figure = ganze Zeichnung

Axes = Koordinatensystem, in das Daten eingetragen werden

Eine Figure kann mehrere Axes-Objekte (nebeneinander, untereinander, ...) enthalten

Figure

Jede Zeichnung in pyplot erfolgt mittels eines Figure-Objekts (wird beim plotten meist automatisch erzeugt).

Manuelles Erstellen einer Figure mit Größe 800 x 600 px (bei 100 dpi):

fig = plt.figure(
    figsize=(8, 6),
    facecolor="#eeeeee"
)

Dies wird automatisch zur aktiven Figure.

Figure Objekte

Exportieren der aktiven Figure:

plt.savefig("myplot.png")
plt.savefig("myplot.svg")

Axes Objekte

Erstellen und aktivieren neuer Axes Objekte:

# axes in the bottom left
ax1 = plt.axes(0, 0, 0.5, 0.5)
plt.plot([0, 1, 2], [0, 1, 0])

# axes in the top right
ax2 = plt.axes(0.5, 0.5, 0.5, 0.5)
plt.plot([0, 1, 2], [0, 1, 0])

Axes Objekte

Das aktive Axes-Objekt abfragen:

# gca = get current axes
active_axes = plt.gca()

Ein Axes-Objekt zum aktiven machen:

# sca = set current axes
plt.sca(ax1)

Axes Objekte

Erstellen eines neuen Axes-Objekts mit gleicher x-Achse und neuer y-Achse:

ax2 = ax1.twinx()

Subplots

automatisches Erstellen mehrerer Axes-Objekte in einem Raster (hier: 2 Zeilen, 3 Spalten):

fig, ax = plt.subplots(2, 3)

ax0 = ax[0, 0]
ax1 = ax[0, 1]
ax5 = ax[1, 2]

Axis und Axes

Achtung unglückliche Namensvergabe:

  • plt.axis: z.B. zum Einstellen der Skalierung
  • plt.axes: zum Erstellen eines neuen Koordinatensystems

Eigentliche Bedeutungen aus dem Lateinischen / Englischen: axis = Achse, axes = Achsen

Objekt-orientiertes Interface

Objekt-orientiertes Interface

Die schon bekannten Methoden von plt verwenden im Hintergrund Methoden des aktiven Axes Objekts:

ax.plot(...)
ax.set_title(...)
ax.set_xlabel(...)
ax.legend()
ax.set_aspect("equal")

Weitere Plots

Weitere Plots

  • Plotten von Datenpunkten mit mehr als 2 Merkmalen
  • Plotten von z = f(x, y)
  • Plotten der Dichtefunktion einer Verteilung (1D und 2D)

Plotten von Datenpunkten mit mehr als 2 Merkmalen

  • erweiterter Scatter Plot (Größe, Farbe) - pyplot, pandas, seaborn
  • Scatter Matrix - pandas, seaborn

Scatter Matrix

Zusätzliche Plot-Funktion in pandas: Scatter Matrix

Erstellt mehrere Scatter Plots in einem Raster

Bei 4 Datenserien werden 4x4=16 Plots erstellt (Scatter Plots und Histogramme)

from pandas.plotting import scatter_matrix

scatter_matrix(iris)

Plotten von z = f(x, y)

  • Contour Plots - pyplot, pandas, seaborn
  • 3D Plots - matplotlib

Plotten der Dichtefunktion einer Verteilung

  • (Histogramm)
  • (Box Plot)
  • KDE (Kernel Density Estimation) - pandas, seaborn
  • Violin Plot (Box Plot + KDE) - seaborn
  • 2D Histogramm - pyplot (hist2d, hexbin)
  • 2D KDE - seaborn

siehe Python Data Science Handbook: Histograms, Binnings, and Density

Anzeigen von Bildern

Anzeigen von Bildern

Ein Graustufenbild mit 3x3 Pixeln:

image = np.array([[0, 1, 2],
                  [3, 4, 5],
                  [6, 7, 8]])
plt.imshow(image, cmap="gray")

ein RGB-Bild mit 2x2 Pixeln:

colors = np.array([[[255, 0, 0], [0, 255, 0]],
                   [[0, 0, 255], [0, 0, 0]]])
plt.imshow(colors)

Artists

Artists

Artist = Base Class für Elemente in einer figure

Artists

Beispiel: explizites Erstellen eines Artists (Rechteck)

r = plt.Rectangle((0.25, 0.75), 0.1, 0.1, color="C0")

ax = plt.gca()
ax.add_artist(r)

Artists

Beispiele: Erstellen einfacher Artists

r = plt.Rectangle((0.25, 0.75), 0.1, 0.1, color="C0")
c = plt.Circle((0.75, 0.75), 0.1, color="C1")
p = plt.Polygon(
    [[0.2, 0.2], [0.5, 0.1], [0.8, 0.2]],
    color="C2",
)
l = plt.Line2D(
    (0.5, 0.5), # x coordinates
    (0.25, 0.75), # y coordinates
    color="C3",
)
t = plt.Text(0, 0, "Hello!", size=40, color="C4")