Werkzeugkiste - matplotlib

Dieses Notizbuch zeigt, wie Sie mit der matplotlib-Bibliothek schöne Grafiken zeichnen.

Zeichnen Sie Ihr erstes Diagramm

Stellen wir zunächst sicher, dass dieses Notebook sowohl in Python 2 als auch in Python 3 gut funktioniert:


In [ ]:
from __future__ import division, print_function, unicode_literals

Zuerst müssen wir die matplotlib Bibliothek importieren.


In [ ]:
import matplotlib

Matplotlib kann Diagramme mithilfe verschiedener Backend-Grafikbibliotheken wie Tk, wxPython usw. ausgeben. Wenn Sie Python über die Befehlszeile ausführen, werden die Diagramme normalerweise in einem separaten Fenster angezeigt. In einem Jupyter-Notizbuch können wir die Grafiken einfach im Notizbuch selbst ausgeben, indem wir den magischen Befehl % matplotlib inline ausführen.


In [ ]:
%matplotlib inline
# matplotlib.use("TKAgg")  # Verwenden Sie dies stattdessen in Ihrem Programm, wenn Sie Tk als Grafik-Backend verwenden möchten.

Zeichnen wir nun unser erstes Diagramm!


In [ ]:
import matplotlib.pyplot as plt
plt.plot([1, 3, 6, 9, 5, 4,9])
plt.show()

Ja, durch das Aufrufen der Funktion plot mit einigen Daten und dem Aufrufen der Funktion show, wird die Grafik gezeichnet.!

Wenn der Plotfunktion ein Datenarray zugewiesen wird, werden die als Koordinaten auf der vertikalen Achse und nur der Index jedes Datenpunkts im Array (Achtung: beginnt mit 0) als horizontale Koordinate verwendet. Sie können auch zwei Arrays bereitstellen: eines für die horizontale Achse x und das zweite für die vertikale Achse y:


In [ ]:
plt.plot([-3, -2, 5, 0, 2, 4], [1, 6, 4, 3, 2, 1])
plt.show()

Die Achsen passen sich automatisch dem Umfang der Daten an.
Wir möchten dem Diagramm etwas mehr Raum geben, also rufen wir die
Funktion axis auf, um die Ausdehnung jeder Achse [xmin, xmax, ymin, ymax] zu ändern.


In [ ]:
plt.plot([-3, -2, 5, 0, 2, 4], [1, 6, 4, 3, 2, 1])
plt.axis([-4, 6, 0, 7])
plt.show()

Zeichnen wir nun eine mathematische Funktion. Wir verwenden die linspace -Funktion von NumPy, um ein Array x mit 500 Float Werten im Bereich von -2 bis 2 zu erstellen. Dann erstellen wir ein zweites Arrayy, das als Quadrat von x berechnet wird (um mehr über NumPy zu erfahren, lesen Sie das Numpy Tutorial (numpy-werkzeugkiste-10.ipynb)).


In [ ]:
import numpy as np
x = np.linspace(-2, 2, 500)
y = x**2+4

plt.plot(x, y)
plt.axis([-3, 3, 0, 10])
plt.show()

Das ist ein bisschen einfach, fügen wir einen Titel sowie x- und y-Beschriftungen hinzu und zeichnen ein Raster.


In [ ]:
plt.plot(x, y)
plt.title("Parabel y=x²+4")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.show()

Linienstil und Farbe

Standardmäßig zeichnet matplotlib eine Linie zwischen aufeinanderfolgenden Punkten.


In [ ]:
plt.plot([0, 100, 100, 0, 0, 100, 50, 0, 100], [0, 0, 100, 100, 0, 100, 130, 100, 0])
plt.axis([-10, 110, -10, 140])
plt.show()

Sie können ein drittes Argument übergeben, um den Stil und die Farbe der Linie zu ändern. Zum Beispiel bedeutet "g--" "grüne gestrichelte Linie".


In [ ]:
plt.plot([0, 100, 100, 0, 0, 100, 50, 0, 100], [0, 0, 100, 100, 0, 100, 130, 100, 0], "g--")
plt.axis([-10, 110, -10, 140])
plt.show()

Sie können ganz einfach mehrere Linien in einem Diagramm zeichnen: Übergeben Sie einfach x1, y1, [style1], x2, y2, [style2], ...

Beispielsweise:


In [ ]:
plt.plot([0, 100, 100, 0, 0], [0, 0, 100, 100, 0], "r-", [0, 100, 50, 0, 100], [0, 100, 130, 100, 0], "g--")
plt.axis([-10, 110, -10, 140])
plt.show()

Oder rufen Sie plot einfach mehrmals auf, bevor Sie show aufrufen.


In [ ]:
plt.plot([0, 100, 100, 0, 0], [0, 0, 100, 100, 0], "r-")
plt.plot([0, 100, 50, 0, 100], [0, 100, 130, 100, 0], "g--")
plt.axis([-10, 110, -10, 140])
plt.show()

Sie können auch einfache Punkte anstelle von Linien zeichnen. Hier ist ein Beispiel mit grünen Strichen, rot gepunkteten Linien und blauen Dreiecken. Die vollständige Liste der Stil- und Farboptionen finden Sie in der Dokumentation.


In [ ]:
x = np.linspace(-1.4, 1.4, 30)
plt.plot(x, x, 'g--', x, x**2, 'r:', x, x**3, 'b^', x, x**4, 'm o')
plt.show()

Die Plotfunktion gibt eine Liste von Line2D -Objekten zurück (eines für jede Zeile). Sie können zusätzliche Attribute für diese Linien festlegen, z. B. die Linienbreite, den Strichstil oder die Alpha-Ebene. Die vollständige Liste der Attribute finden Sie in der Dokumentation .


In [ ]:
x = np.linspace(-1.4, 1.4, 30)
line1, line2, line3 = plt.plot(x, x, 'g--', x, x**2, 'r:', x, x**3, 'b^')
line1.set_linewidth(3.0)
line1.set_dash_capstyle("round")
line3.set_alpha(0.2)
plt.show()

Eine Grafik speichern

Das Speichern einer Figur auf der Festplatte ist so einfach wie das Aufrufen von savefig mit dem Namen der Datei (oder eines Dateiobjekts). Die verfügbaren Bildformate hängen vom verwendeten Grafik-Backend ab. Die Dokumentation finden Sie hier .


In [ ]:
x = np.linspace(-1.4, 1.4, 30)
plt.plot(x, x**2)
plt.savefig("my_square_function.png", transparent=True)

Subplots

Eine Matplotlib-Grafik kann mehrere Subplots enthalten. Diese Subplots sind in einem Raster organisiert. Um ein Subplot zu erstellen, rufen Sie einfach die Funktion subplot auf und geben Sie die Anzahl der Zeilen und Spalten in der Abbildung sowie den Index des Unterplots an, auf den Sie zeichnen möchten (beginnend mit 1, dann von links nach rechts und von oben nach unten) ). Beachten Sie, dass pyplot den aktuell aktiven Subplot verfolgt (auf den Sie durch Aufrufen von plt.gca () verweisen können). Wenn Sie also die Funktion plot aufrufen, wird auf den Unterplot active zurückgegriffen.


In [ ]:
x = np.linspace(-1.4, 1.4, 30)
plt.subplot(2, 2, 1)  # 2 rows, 2 columns, 1st subplot = top left
plt.plot(x, x)
plt.subplot(2, 2, 2)  # 2 rows, 2 columns, 2nd subplot = top right
plt.plot(x, x**2)
plt.subplot(2, 2, 3)  # 2 rows, 2 columns, 3rd subplot = bottow left
plt.plot(x, x**3)
plt.subplot(2, 2, 4)  # 2 rows, 2 columns, 4th subplot = bottom right
plt.plot(x, x**4)
plt.show()
  • Anmerkung subplot(223) ist eine Kurzschreibweise für subplot(2, 2, 3).

Es ist einfach, Subplots zu erstellen, die sich über mehrere Rasterzellen erstrecken:


In [ ]:
plt.subplot(2, 2, 1)  # 2 rows, 2 columns, 1st subplot = top left
plt.plot(x, x)
plt.subplot(2, 2, 2)  # 2 rows, 2 columns, 2nd subplot = top right
plt.plot(x, x**2)
plt.subplot(2, 1, 2)  # 2 rows, *1* column, 2nd subplot = bottom
plt.plot(x, x**3)
plt.show()

Wenn Sie eine komplexere Subplot-Positionierung benötigen, können Sie subplot2grid anstelle von subplot verwenden. Sie geben die Anzahl der Zeilen und Spalten im Raster an, dann die Position Ihres Unterplots in diesem Raster (oben links = (0,0)) und optional die Anzahl der Zeilen und / oder Spalten, die es umfasst. Beispielsweise:


In [ ]:
plt.subplot2grid((3,3), (0, 0), rowspan=2, colspan=2)
plt.plot(x, x**2)
plt.subplot2grid((3,3), (0, 2))
plt.plot(x, x**3)
plt.subplot2grid((3,3), (1, 2), rowspan=2)
plt.plot(x, x**4)
plt.subplot2grid((3,3), (2, 0), colspan=2)
plt.plot(x, x**5)
plt.show()

Wenn Sie noch mehr Flexibilität bei der Positionierung von Subplots benötigen, lesen Sie die GridSpec-Dokumentation.

Mehrfache Grafiken

Es ist auch möglich, mehrere Grafiken zu zeichnen. Jede Grafik kann eine oder mehrere Subplots enthalten. Standardmäßig erstellt matplotlib automatisch figure (1). Wenn Sie die Grafik wechseln, verfolgt pyplot die aktuell aktive Figur (auf die Sie durch Aufrufen von plt.gcf () verweisen können), und der aktive SubplotUnterzeichnung dieser Grafik wird zum aktuellen Subplot.

Beispiel:


In [ ]:
x = np.linspace(-1.4, 1.4, 30)

plt.figure(1)
plt.subplot(211)
plt.plot(x, x**2)
plt.title("Quadrat und Kubisch")
plt.subplot(212)
plt.plot(x, x**3)

plt.figure(2, figsize=(10, 5))
plt.subplot(121)
plt.plot(x, x**4)
plt.title("y = x**4")
plt.subplot(122)
plt.plot(x, x**5)
plt.title("y = x**5")

plt.figure(1)      # zurück zu figure 1, aktueller subplot ist 212 (unten) - es wird die rote Linie gezeichnet
plt.plot(x, -x**3, "r:")

plt.figure(2)      # zurück zu figure 2, aktueller subplot ist 122 (unten rechts) - es wird die rote Linie gezeichnet
plt.plot(x, x**5+1, "r:")

plt.show()

For consistency, we will continue to use pyplot's state machine in the rest of this tutorial, but we recommend using the object-oriented interface in your programs.

Pylab vs Pyplot vs Matplotlib

There is some confusion around the relationship between pylab, pyplot and matplotlib. It's simple: matplotlib is the full library, it contains everything including pylab and pyplot.

Pyplot provides a number of tools to plot graphs, including the state-machine interface to the underlying object-oriented plotting library.

Pylab is a convenience module that imports matplotlib.pyplot and NumPy in a single name space. You will find many examples using pylab, but it is no longer recommended (because explicit imports are better than implicit ones).

Text zeichnen

Sie können Text aufrufen, um an einer beliebigen Stelle im Diagramm Text hinzuzufügen. Geben Sie einfach die horizontalen und vertikalen Koordinaten und den Text sowie optional einige zusätzliche Attribute an. Jeder Text in matplotlib kann TeX-Gleichungsausdrücke enthalten. Weitere Informationen finden Sie in der Dokumentation

Beispiel:


In [ ]:
x = np.linspace(-1.5, 1.5, 30)
px = 0.8
py = px**2

plt.plot(x, x**2, "b-", px, py, "ro")

plt.text(0, 1.5, "Quadratische Funktion\n$y = x^2$", fontsize=20, color='blue', horizontalalignment="center")
plt.text(px - 0.08, py, "Gesuchter Punkt", ha="right", weight="heavy")
plt.text(px, py, "x = %0.2f\ny = %0.2f"%(px, py), rotation=50, color='gray')

plt.show()
  • Anmerkung: ha ist ein alias für horizontalalignment

Weitere Texteigenschaften finden Sie in der Dokumentation.

Es ist ziemlich häufig, Elemente eines Diagramms zu kommentieren, wie z. B. den schönen Punkt oben. Die Funktion annotate macht dies einfach: Geben Sie einfach die Position des interessierenden Punkts und die Position des Textes sowie optional einige zusätzliche Attribute für den Text und den Pfeil an.


In [ ]:
plt.plot(x, x**2, px, py, "ro")
plt.annotate("Gesuchter Punkt", xy=(px, py), xytext=(px-1.5,py+0.5),
                           color="green", weight="heavy", fontsize=14,
                           arrowprops={"facecolor": "lightgreen"})
plt.show()

Sie können Ihrem Text auch einen Begrenzungsrahmen hinzufügen, indem Sie das Attribut bbox verwenden:


In [ ]:
plt.plot(x, x**2, px, py, "ro")

bbox_props = dict(boxstyle="rarrow,pad=0.3", ec="b", lw=2, fc="lightblue")
plt.text(px-0.2, py, "Gesuchter Punkt", bbox=bbox_props, ha="right")

bbox_props = dict(boxstyle="round4,pad=1,rounding_size=0.2", ec="black", fc="#EEEEFF", lw=5)
plt.text(0, 1.5, "Quadratische Funktion\n$y = x^2$", fontsize=20, color='black', ha="center", bbox=bbox_props)

plt.show()

Nur zum Spaß, wenn Sie einen Plot im xkcd -Stil möchten, zeichnen Sie einfach in einem Abschnitt mit plt.xkcd ():


In [ ]:
with plt.xkcd():
    plt.plot(x, x**2, px, py, "ro")

    bbox_props = dict(boxstyle="rarrow,pad=0.3", ec="b", lw=2, fc="lightblue")
    plt.text(px-0.2, py, "Gesuchter Punkt", bbox=bbox_props, ha="right")

    bbox_props = dict(boxstyle="round4,pad=1,rounding_size=0.2", ec="black", fc="#EEEEFF", lw=5)
    plt.text(0, 1.5, "Quadratische Funktion\n$y = x^2$", fontsize=20, color='black', ha="center", bbox=bbox_props)

    plt.show()

Legenden

Der einfachste Weg, eine Legende hinzuzufügen, besteht darin, in allen Zeilen eine Beschriftung festzulegen und dann einfach die Funktion `legend' aufzurufen.


In [ ]:
x = np.linspace(-1.4, 1.4, 50)
plt.plot(x, x**2, "r--", label="Quadratische Funktion")
plt.plot(x, x**3, "g-", label="Kubische Funktion")
plt.legend(loc="best")
plt.grid(True)
plt.show()

Nicht Lineare Skalen

Matplotlib unterstützt nichtlineare Skalen wie zum Beispiel logarithmische oder logit-Skalen.


In [ ]:
x = np.linspace(0.1, 15, 500)
y = x**3/np.exp(2*x)

plt.figure(1)
plt.plot(x, y)
plt.yscale('linear')
plt.title('linear')
plt.grid(True)

plt.figure(2)
plt.plot(x, y)
plt.yscale('log')
plt.title('log')
plt.grid(True)

plt.figure(3)
plt.plot(x, y)
plt.yscale('logit')
plt.title('logit')
plt.grid(True)

plt.figure(4)
plt.plot(x, y - y.mean())
plt.yscale('symlog', linthreshy=0.05)
plt.title('symlog')
plt.grid(True)

plt.show()

Achsenbeschriftungen

Die Achsen haben Markierungen, die standardmäßig verwendet werden.


In [ ]:
x = np.linspace(-2, 2, 100)

plt.figure(1, figsize=(15,10))
plt.subplot(131)
plt.plot(x, x**3)
plt.grid(True)
plt.title("Standard Beschriftung")

ax = plt.subplot(132)
plt.plot(x, x**3)
ax.xaxis.set_ticks(np.arange(-2, 2, 1))
plt.grid(True)
plt.title("Manuelle Beschriftung auf der x-Achse")

ax = plt.subplot(133)
plt.plot(x, x**3)
plt.minorticks_on()
ax.tick_params(axis='x', which='minor', bottom='off')
ax.xaxis.set_ticks([-2, 0, 1, 2])
ax.yaxis.set_ticks(np.arange(-5, 5, 1))
ax.yaxis.set_ticklabels(["min", -4, -3, -2, -1, 0, 1, 2, 3, "max"])
plt.title("Manuelle Beschriftung\n(plus min/max) auf der y-Achse")


plt.grid(True)

plt.show()

Polar Projektion

Das Zeichnen eines Polardiagramms ist durch das Setzen des Attributs projection auf polar beim Erstellen des Subplots.


In [ ]:
radius = 1
theta = np.linspace(0, 2*np.pi*radius, 1000)

plt.subplot(111, projection='polar')
plt.plot(theta, np.sin(5*theta), "g-")
plt.plot(theta, 0.5*np.cos(20*theta), "b-")
plt.show()

3D projection

-Diagrammen ist recht einfach. Sie müssen Axes3D importieren, das die "3d" -Projektion registriert. Erstellen Sie dann einen Subplot, in der die projection auf "3d" gesetzt wird. Dies gibt ein Axes3DSubplot-Objekt zurück, mit dem Sie plot_surface aufrufen können, wobei x-, y- und z-Koordinaten sowie optionale Attribute angegeben werden.


In [ ]:
from mpl_toolkits.mplot3d import Axes3D

x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

figure = plt.figure(1, figsize = (12, 6))
subplot3d = plt.subplot(111, projection='3d')
surface = subplot3d.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=matplotlib.cm.coolwarm, linewidth=0.1)
plt.show()

Eine andere Möglichkeit, dieselben Daten anzuzeigen, ist ein Konturdiagramm.


In [ ]:
plt.contourf(X, Y, Z, cmap=matplotlib.cm.coolwarm)
plt.colorbar()
plt.show()

Streudiagramm

Geben Sie zum Zeichnen eines Streudiagramms einfach die x- und y-Koordinaten der Punkte an.


In [ ]:
from numpy.random import rand
x, y = rand(2, 100)
plt.scatter(x, y)
plt.show()

Optional können Sie auch die Skalierung jedes Punkts angeben.


In [ ]:
x, y, scale = rand(3, 100)
scale = 500 * scale ** 5
plt.scatter(x, y, s=scale)
plt.show()

Und wie üblich können Sie eine Reihe anderer Attribute festlegen, z. B. die Füll- und Kantenfarben sowie die Alpha-Ebene.


In [ ]:
for color in ['red', 'green', 'blue']:
    n = 100
    x, y = rand(2, n)
    scale = 500.0 * rand(n) ** 5
    plt.scatter(x, y, s=scale, c=color, alpha=0.3, edgecolors='blue')

plt.grid(True)

plt.show()

Linien

Sie können Linien einfach mit der Funktion plot zeichnen, wie wir es bisher getan haben. Es ist jedoch häufig zweckmäßig, eine Dienstprogrammfunktion zu erstellen, die eine (scheinbar) unendliche Linie über den Graphen zeichnet, wenn eine Steigung und ein Achsenabschnitt gegeben sind. Sie können auch die Funktionen hlines und vlines verwenden, mit denen horizontale und vertikale Liniensegmente dargestellt werden. Beispielsweise:


In [ ]:
from numpy.random import randn

def plot_line(axis, slope, intercept, **kargs):
    xmin, xmax = axis.get_xlim()
    plt.plot([xmin, xmax], [xmin*slope+intercept, xmax*slope+intercept], **kargs)

x = randn(1000)
y = 0.5*x + 5 + randn(1000)*2
plt.axis([-2.5, 2.5, -5, 15])
plt.scatter(x, y, alpha=0.2)
plt.plot(1, 0, "ro")
plt.vlines(1, -5, 0, color="red")
plt.hlines(0, -2.5, 1, color="red")
plot_line(axis=plt.gca(), slope=0.5, intercept=5, color="magenta")
plt.grid(True)
plt.show()

Histogramme


In [ ]:
data = [1, 1.1, 1.8, 2, 2.1, 3.2, 3, 3, 3, 3]
plt.subplot(211)
plt.hist(data, bins = 10, rwidth=0.8)

plt.subplot(212)
plt.hist(data, bins = [1, 1.5, 2, 2.5, 3], rwidth=0.95)
plt.xlabel("Werte")
plt.ylabel("Häufigkeit")

plt.show()

Weitere Beispiele für Histogramme


In [ ]:
data1 = np.random.randn(400)
data2 = np.random.randn(500) + 3
data3 = np.random.randn(450) + 6
data4a = np.random.randn(200) + 9
data4b = np.random.randn(100) + 10

plt.hist(data1, bins=5, color='g', alpha=0.75, label='bar hist') # default histtype='bar'
plt.hist(data2, color='b', alpha=0.65, histtype='stepfilled', label='stepfilled hist')
plt.hist(data3, color='r', histtype='step', label='step hist')
plt.hist((data4a, data4b), color=('r','m'), alpha=0.55, histtype='barstacked', label=('barstacked a', 'barstacked b'))

plt.xlabel("Werte")
plt.ylabel("Häufigkeit")
plt.legend()
plt.grid(True)
plt.show()

Was nun?

Jetzt kennen Sie einige Grundlagen von matplotlib, aber es stehen noch viele weitere Optionen zur Verfügung. Der beste Weg, um mehr zu erfahren, ist, die Galerie zu besuchen, sich die Bilder anzusehen, ein Beispiel auszuwählen, die Sie interessiert, und dann einfach den Code in ein Jupyter Notebook zu kopieren und damit herumspielen.


In [ ]: