Grundlegende (low-level) Library für Plotting: matplotlib
Abstrahierende Interfaces zu grundlegenden matplotlib Funktionen:
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()
Ergebnis:
Wir erstellen einen Plot, der die Sinus- und Kosinusfunktion im Intervall von 0 bis 2Ï€ zeigt.
x = np.linspace(0, 2*3.1415, 200)
plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x))
Erstelle eine Python-Funktion, die eine Gaußsche Glockenkurve basierend auf ihren Parametern mu und sigma zeichnet:
plot_gaussian_function(mu, sigma)
Vorgefertigte Stylesheets verwendbar mittels:
plt.style.use("stylename")
siehe plt.style.available
für eine Liste von verfügbaren Stilen (online Referenz)
Beispiel zum Styling eines Graphen:
plt.plot(x, y, color="C0", marker="X", linestyle="dashed")
mögliche Farbangaben:
C0
... C9
)green
/ lightblue
/ ...)r
/ g
/ b
/ c
/ m
/ y
/ k
)#FFAA00
)(1, 0.7, 0)
)mögliche Lininenstile:
"none"
oder ""
"solid"
oder "-"
"dashed"
oder "--"
"dotted"
oder ":"
"dashdot"
oder "-."
mögliche Marker:
""
(keine)"."
(kleiner Punkt)"o"
(großer Punkt)"s"
(Quadrat)"X"
"+"
","
(Pixel)wichtige Parameter:
color
linestyle
linewidth
marker
markersize
Langform:
plt.plot(x, y, color="C0", marker="X", linestyle="dashed")
Kurzform (weniger flexibel):
plt.plot(x, y, "C0X--")
plt.title("Trigonometric functions")
plt.xlabel("x (radians)")
plt.ylabel("y")
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 ausblenden:
plt.axis("off")
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)
Gleiche Einheitengröße auf beiden Achsen:
plt.axis("equal")
Gleiche Einheitengrößen und Beschränkung der Achsen auf verwendete Datenbereiche:
plt.axis("scaled")
plt.grid(True)
plt.yticks([-1, 0, 1])
plt.xticks(np.linspace(0, 2*np.pi, 5))
mögliches Ergebnis:
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")
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 Theme-Farben (C0 - C10):
axes.prop_cycle: cycler('color', ['4C72B0', '55A868', 'C44E52', '8172B2', 'CCB974', '64B5CD'])
siehe:
https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.html
plt.plot(x, y)
/ plt.plot(y)
plt.bar(x, y)
plt.plot(x, y, ".")
/ plt.scatter(x, y, size, color)
plt.hist(x)
plt.boxplot(x)
plt.pie(x, labels=...)
Graph zusammengehöriger x- und y-Werte:
plt.plot(x, y)
Graph mit automatischem x (0, 1, ...):
plt.plot(y)
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])
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)
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
)
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"]
)
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)
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
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 der petal length und petal width
Wir plotten die Datenpunkte in 50-er Gruppen in drei verschiedenen Farben
Scatter Plot aller vier Iris-Eigenschaften
Wir verwenden Farbe und Größe, um sepal length und sepal width zu visualisieren
Histogramm der petal length
Boxplot für alle vier Abmessungen
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)
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 = ganze Zeichnung
Axes = Koordinatensystem, in das Daten eingetragen werden
Eine Figure kann mehrere Axes-Objekte (nebeneinander, untereinander, ...) enthalten
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.
Exportieren der aktiven Figure:
plt.savefig("myplot.png")
plt.savefig("myplot.svg")
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])
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)
Erstellen eines neuen Axes-Objekts mit gleicher x-Achse und neuer y-Achse:
ax2 = ax1.twinx()
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]
Achtung unglückliche Namensvergabe:
plt.axis
: z.B. zum Einstellen der Skalierungplt.axes
: zum Erstellen eines neuen KoordinatensystemsEigentliche Bedeutungen aus dem Lateinischen / Englischen: axis = Achse, axes = Achsen
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")
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)
siehe Python Data Science Handbook: Histograms, Binnings, and Density
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)
Artist = Base Class für Elemente in einer figure
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)
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")