[PYTHON] Anzeigen von Matplotlib-Diagrammen in einer Webanwendung

Im Moment frage ich mich, ob die JavaScript-Bibliothek coole Grafiken erstellen wird, aber ich bin mir nicht sicher, aber ich möchte trotzdem die vertraute Matplotlib in Web-Apps verwenden.

Da matplotlib jedoch mit X11 zeichnet, ist dies nicht der Fall, wenn Sie der Meinung sind, dass die Verwendung in einer Webanwendung schwierig sein kann.

Erstellen Sie Bilddaten mit AGG (Anti-Grain Geometry) für das Backend.

Dinge die zu tun sind

Zeichnen Sie das von matplotlib erstellte Diagramm mit der Kolbenwebanwendung. Der Grund für die Verwendung des Kolbens liegt darin, dass er praktisch ist. Ich denke, dass Sie dasselbe tun können, wenn Sie dasselbe tun, ohne ihn zu verwenden.

Führen Sie außerdem die folgenden zwei Muster aus.

png Daten als Antwort zurückgeben

Ein Diagramm machen

Zur Zeit brauche ich ein Diagramm, um etwas anzuzeigen, also

Ich werde eine Grafik machen.

Diese Zahlen scheinen keine tiefe Bedeutung zu haben, aber sie tun es nicht. Der Titel des Diagramms sollte "IMINASHI GRAPH" lauten.

fig, ax = matplotlib.pyplot.subplots()
ax.set_title(u'IMINASHI GRAPH')
x_ax = range(1, 284)
y_ax = [x * random.randint(436, 875) for x in x_ax]
ax.plot(x_ax, y_ax)

So was.

iminashi_graph.png

In der Web-App anzeigen

Der Verarbeitungsablauf ist wie folgt.

  1. Erstellen Sie PNG-Daten für Diagramme
  2. Schreiben Sie die Daten in den Puffer von cStringIO.StringIO
  3. Geben Sie als Antwort Daten als Bildinhalt zurück

Vielleicht ist es schneller, sich den Code anzusehen.

@app.route('/graph1')
def graph1():
    import matplotlib.pyplot
    from matplotlib.backends.backend_agg import FigureCanvasAgg
    import cStringIO
    import random

    fig, ax = matplotlib.pyplot.subplots()
    ax.set_title(u'IMINASHI GRAPH')
    x_ax = range(1, 284)
    y_ax = [x * random.randint(436, 875) for x in x_ax]
    ax.plot(x_ax, y_ax)

    canvas = FigureCanvasAgg(fig)
    buf = cStringIO.StringIO()
    canvas.print_png(buf)
    data = buf.getvalue()

    response = make_response(data)
    response.headers['Content-Type'] = 'image/png'
    response.headers['Content-Length'] = len(data)
    return response

Wenn Sie jetzt über einen Webbrowser darauf zugreifen, wird das Bild angezeigt.

iminashi_graph_on_brw.png

Erstellen Sie eine Bilddatei als temporäre Datei

Ein anderer ist dieser.

Der Prozess ist so.

  1. Exportieren Sie Diagramme als PNG-Dateien
  2. Geben Sie als Antwort eine PNG-Datei zurück
  3. Löschen Sie die PNG-Datei

Das Interessante wäre 3. Angesichts des gleichzeitigen Zugriffs mehrerer Personen ist es meiner Meinung nach besser, eine zufällige Zeichenfolge für den Dateinamen zu verwenden. In diesem Fall nimmt die Anzahl der Dateien jedoch stetig zu, sodass Sie sie nach dem Anzeigen der Dateien ordnungsgemäß löschen müssen.

Verwenden Sie das gleiche Diagramm wie zuvor. Der Titel des Diagramms sollte "IMINASHI GRAPH 2" lauten.

@app.route('/graph2')
def graph2():
    import matplotlib.pyplot
    from matplotlib.backends.backend_agg import FigureCanvasAgg
    import random
    import string
    import os

    class TempImage(object):

        def __init__(self, file_name):
            self.file_name = file_name

        def create_png(self):
            fig, ax = matplotlib.pyplot.subplots()
            ax.set_title(u'IMINASHI GRAPH 2')
            x_ax = range(1, 284)
            y_ax = [x * random.randint(436, 875) for x in x_ax]
            ax.plot(x_ax, y_ax)

            canvas = FigureCanvasAgg(fig)
            canvas.print_figure(self.file_name)

        def __enter__(self):
            return self

        def __exit__(self, exc_type, exc_value, traceback):
            os.remove(self.file_name)

    chars = string.digits + string.letters
    img_name = ''.join(random.choice(chars) for i in xrange(64)) + '.png'

    with TempImage(img_name) as img:
        img.create_png()
        return send_file(img_name, mimetype='image/png')

Es gibt verschiedene Möglichkeiten, es nach dem Zurücksenden einer Antwort zu löschen. In diesem Beispiel verwenden wir den Kontextmanager, um es zu zerstören. Dies ist das Python-ähnlichste Bild.

iminashi_graph_on_brw_2.png

Es wurde angezeigt. Es ist möglicherweise einfacher zu verwenden, wenn es in eine Datei umgewandelt wird.

Recommended Posts

Anzeigen von Matplotlib-Diagrammen in einer Webanwendung
Schritte zum Entwickeln einer Webanwendung in Python
Erstellen einer Webanwendung mit Flask ②
Erstellen einer Web-App für die Sprachtranskription
Erstellen Sie eine Webanwendung mit Django
Erstellen einer Webanwendung mit Flask ①
Erstellen einer Webanwendung mit Flask ③
Erstellen einer Webanwendung mit Flask ④
So unterdrücken Sie Anzeigefehler in matplotlib
Zeigen Sie eine Liste der Alphabete in Python 3 an
Externe Anzeige von Matplotlib-Diagrammen mit tkinter
Zeigen Sie das xy-Diagramm von Matplotlib mit PySimpleGUI an.
[Python] Eine schnelle Webanwendung mit Bottle!
Pyopengl im Browser anzeigen (Python + Aal)
Führen Sie eine Python-Webanwendung mit Docker aus
Ich habe versucht, das Webanwendungs-Framework zu vergleichen
Flask-Erstellen Sie einen Webdienst mit SQLAlchemy + PostgreSQL
Ich habe eine WEB-Bewerbung bei Django gemacht
Ich habe eine Webanwendung in Python erstellt, die Markdown in HTML konvertiert
Wovon ich beim Erstellen von Webanwendungen in einer Windows-Umgebung abhängig war
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
Heppoko entwickelt den Webdienst in einer Woche # 2 Domain Search
Dies ist ein Beispiel für eine Funktionsanwendung im Datenrahmen.
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
Starten Sie mit Docker eine Python-Webanwendung auf Nginx + Gunicorn
So zeigen Sie DataFrame als Tabelle in Markdown an
Praktisch, um Matplotlib-Unterzeichnungen in for-Anweisungen zu verwenden
Erstellen Sie einen Webserver in der Sprache Go (net / http) (1)
Zeigen Sie ein Histogramm der Bildhelligkeitswerte in Python an
installiere digrams in wsl
Anzeigen des regionalen Netzes des Government Statistics Office (eStat) in einem Webbrowser
Bilder mit Matplotlib anzeigen
diktieren in diktieren Macht ein Diktat ein Diktat
2D-Plot in Matplotlib
Webanwendung mit Flasche (1)
Erstellen Sie eine Web-App, die Zahlen mit einem neuronalen Netzwerk erkennt
Anwendung zum Anzeigen und Durchsuchen lokaler Memos (Tagebuch) in Python
Holen Sie sich Python-Webseite, Zeichenkodierung und Anzeige
Google Maps auf der Webseite anzeigen (Spring Boot + Thymeleaf)
Webseite mit FastAPI + uvicorn + Nginx anzeigen (SSL / HTTPS-Konvertierung)
Eine Geschichte über alles von der Datenerfassung über die KI-Entwicklung bis hin zur Veröffentlichung von Webanwendungen in Python (3. KI-Entwicklung)