8.3.2. Grafische und animierte Ausgaben (V)#
Im vorherigen Abschnitt ging es um textbasierte Ausgabe: print() schickt Zeichen auf die Standard-Ausgabe (stdout), und die erscheinen als Text im Terminal oder unter der Notebook-Zelle.
Programme können aber auch andere Arten von Ausgabe nutzen – z.B. Grafiken oder Animationen. Diese laufen über andere Schnittstellen als stdout.
Plots und Grafiken
Mit Bibliotheken wie Matplotlib erzeugen Sie Bilder (Diagramme, Kurven, Histogramme).
plt.show()(bzw.matplotlib.pyplot.show()) sorgt dafür, dass die erstellte Grafik angezeigt wird.Je nach Umgebung erscheint sie
in einem eigenen Fenster oder
in der Notebook-Ausgabe unter der Zelle.
Der Inhalt ist dann kein Text, sondern ein gerendertes Bild.
Animationen
Wenn Sie eine Abfolge von Einzelbildern als Animation darstellen wollen (z.B. einen Roboter, der durch ein Labyrinth läuft), nutzen Sie typischerweise eine Animationsfunktion wie rw.animate(world) aus roboworld.
Das Ergebnis ist ein abspielbares Video bzw. eine interaktive Animation in der Zelle. Wiederum: keine Textausgabe über stdout.
Für die Anzeige solcher Animationen in Jupyter werden oft Einstellungen wie %matplotlib inline und mpl.rcParams["animation.html"] = "jshtml" gesetzt, damit die Animation im Notebook eingebettet und abspielbar ist.
Beispiel: Von Textausgabe zu grafischer Ausgabe
Im Roboworld-Kontext können Sie die Textausgabe mit robo.disable_print() abschalten und stattdessen die Simulation am Ende mit rw.animate(world) als Animation ausgeben. Statt fortlaufender Textmeldungen sehen Sie dann einen bewegten Ablauf – ein anderer Ausgabetyp:
import random as rnd
%matplotlib inline
import matplotlib as mpl
mpl.rcParams["animation.html"] = "jshtml"
mpl.rcParams["animation.embed_limit"] = 50
def random_move(robo):
turns = rnd.choice([0, 1, 2, 3])
for _ in range(turns):
robo.turn_left()
if not robo.is_wall_in_front():
robo.move()
robo = world.get_robo()
robo.disable_print() # Textausgabe abschalten
while not robo.is_at_goal():
random_move(robo)
rw.animate(world) # Grafische/animierte Ausgabe
Welche Ausgabekanäle gibt es – und wann schlagen sie fehl?
Ausgabetyp |
Kanal |
Wann sichtbar? |
Headless (z.B. CI, Server)? |
|---|---|---|---|
Text ( |
stdout (Dateideskriptor 1) |
Terminal, Notebook-Textausgabe |
Ja, funktioniert |
Grafik ( |
Display-Server (X11, Wayland) |
Eigenes Fenster |
Nein – fehlgeschlagen |
Grafik/Animation (inline im Notebook) |
Notebook-Rich-Output (PNG/HTML eingebettet) |
Unter der Zelle |
Ja, wenn korrekt konfiguriert |
Headless bedeutet: Die Umgebung hat keinen Bildschirm und keinen Display-Server (z.B. Docker-Container, GitLab CI, Server im Rechenzentrum).
Dann gilt:
Alles, was ein echtes Fenster öffnen will, schlägt fehl. Beispiel:
plt.show()mit einem GUI-Backend (Tk, Qt), weil kein X11/Wayland vorhanden ist.
Für headless Umgebungen werden daher typischerweise softwarebasierte Backends wie Agg genutzt:
Matplotlib rendert die Grafik im Speicher zu einem Bild (PNG). Dieses Bild wird dann z.B. in die Notebook-Ausgabe eingebettet – ohne Display.
Mit
%matplotlib inlineund passender Konfiguration (z.B.MPLCONFIGDIR,MPLBACKEND=Agg) funktionieren Plots und Animationen auch headless.
Der Text über stdout funktioniert in jedem Fall.
Kurz zusammengefasst
Nicht jede Ausgabe eines Programms ist Text. print() nutzt stdout. Grafiken (plt.show()) und Animationen (animate()) nutzen andere Ausgabekanäle – und erscheinen dort, wo die Laufzeitumgebung Bilder und Videos anzeigt (z.B. unter der Zelle im Notebook). In headless Umgebungen funktioniert nur stdout garantiert; Grafiken erfordern ein softwarebasiertes Backend statt eines GUI-Fensters.