40 Stimmen

Übergabe einer matplotlib-Figur in HTML (Flask)

Ich verwende matplotlib, um in einer Web-App einige Abbildungen darzustellen. Ich habe fig.savefig() verwendet, als ich nur Skripte ausgeführt habe. Allerdings benötige ich eine Funktion, die ein tatsächliches ".png"-Bild zurückgibt, damit ich es in meinem HTML aufrufen kann.

Weitere (möglicherweise unnötige) Informationen: Ich verwende Python Flask. Ich dachte, ich könnte fig.savefig() verwenden und die Abbildung einfach in meinen statischen Ordner legen und sie dann von meinem HTML aufrufen, aber ich würde das lieber nicht jedes Mal tun. Es wäre optimal, wenn ich einfach die Abbildung erstellen könnte, ein Bild davon machen, dieses Bild zurückgeben und es von meinem HTML aufrufen könnte, dann wäre es weg.

Der Code, der die Abbildung erstellt, funktioniert. Allerdings gibt er eine Abbildung zurück, die anscheinend nicht mit HTML funktioniert.

Hier rufe ich draw_polygon im Routing auf, draw_polygon ist die Methode, die die Abbildung zurückgibt:

@app.route('/images/')
def images(cropzonekey):
    fig = draw_polygons(cropzonekey)
    return render_template("images.html", title=cropzonekey, figure = fig)

Und hier ist das HTML, in dem ich versuche, das Bild zu generieren.

    {{ title }} - Bild

Und, wie Sie wahrscheinlich erraten können, wenn ich die Seite lade, bekomme ich nur Platzhalterbild. Also mochten sie das Format nicht, in dem ich die Abbildung eingespeist habe.

Weiß jemand, welche matplotlib Methoden/Workarounds eine Abbildung in ein tatsächliches Bild umwandeln? Ich habe die Dokumentation durchsucht, aber ich finde nichts. Danke!

Übrigens: Ich dachte, es wäre nicht notwendig, den Python-Code einzuschließen, der die Abbildung erstellt, aber ich kann ihn einschließen, wenn ihr ihn sehen müsst (wollte die Frage nur nicht überladen)

1voto

Mohamed Berrimi Punkte 110

Dies funktioniert ziemlich gut für mich, du kannst auch diese URL überprüfen medium blog

from flask import Flask, render_template
from PIL import Image
import base64
import io

app = Flask(__name__)

@app.route('/')
def show_image():

    # Ihre plt plots Anweisungen hier 
    # plt.save('generated_plot.png') 

    im = Image.open("generated_plot.png") #Öffnen Sie das generierte Bild
    data = io.BytesIO() 
    im.save(data, "png")
    encoded_img_data = base64.b64encode(data.getvalue())

    return render_template("show_image.html", img=encoded_img_data.decode('utf-8'))

if __name__ == '__main__':

   app.run(debug=True)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X