Einbettung in einem Webanwendungsserver (Flask)#

Bei der Verwendung von Matplotlib auf einem Webserver wird dringend davon abgeraten, pyplot zu verwenden (pyplot hält Referenzen auf die geöffneten Abbildungen, um show zu ermöglichen, was jedoch zu Speicherlecks führt, es sei denn, die Abbildungen werden ordnungsgemäß geschlossen).

Seit Matplotlib 3.1 kann man direkt Abbildungen mit dem Figure-Konstruktor erstellen und in In-Memory-Puffern speichern. In älteren Versionen war es notwendig, explizit eine Agg-Leinwand zu instanziieren (siehe z. B. CanvasAgg Demo).

Das folgende Beispiel verwendet Flask, aber andere Frameworks funktionieren ähnlich

import base64
from io import BytesIO

from flask import Flask

from matplotlib.figure import Figure

app = Flask(__name__)


@app.route("/")
def hello():
    # Generate the figure **without using pyplot**.
    fig = Figure()
    ax = fig.subplots()
    ax.plot([1, 2])
    # Save it to a temporary buffer.
    buf = BytesIO()
    fig.savefig(buf, format="png")
    # Embed the result in the html output.
    data = base64.b64encode(buf.getbuffer()).decode("ascii")
    return f"<img src='data:image/png;base64,{data}'/>"

Da der obige Code eine Flask-Anwendung ist, sollte er mit dem flask-Kommandozeilenwerkzeug ausgeführt werden. Vorausgesetzt, das Arbeitsverzeichnis enthält dieses Skript

Unix-ähnliche Systeme

FLASK_APP=web_application_server_sgskip flask run

Windows

set FLASK_APP=web_application_server_sgskip
flask run

Klickbare Bilder für HTML#

Andrew Dalke von Dalke Scientific hat einen schönen Artikel darüber geschrieben, wie man mit Matplotlib Agg PNGs interaktive HTML-Klick-Maps erstellt. Wir möchten diese Funktionalität auch für SVG hinzufügen. Wenn Sie an einem Beitrag zu diesen Bemühungen interessiert sind, wäre das großartig.

Galerie generiert von Sphinx-Gallery