Flask Mathplotlib

Django, Flask, Bottle, WSGI, CGI…
Antworten
telegraph
User
Beiträge: 31
Registriert: Mittwoch 6. November 2013, 10:59

Hallo zusammen,

ich habe ein Problem mit dem Plotten von einem Bild, wenn die Adresse der Funktion mit dem Plot Aufgerufen wird ist alles in Ordnung. Aber das aufrufen des Bildes im HTML Code, gibt einen kaputtes bild zurück.

Code: Alles auswählen

@app.route('/plot')
def build_plot():

    img = io.BytesIO()

    y = [1,2,3,4,5]
    x = [0,2,1,3,4]
    plt.plot(x,y)
    plt.savefig(img, format='png', bbox_inches='tight')
    img.seek(10)

    plot_url = base64.b64encode(img.getvalue()).decode()

    return '<img src="data:image/png;base64,{}">'.format(plot_url)

Aber das implementieren in eine andre Seite funktioniert nicht

[codebox=html5 file=Unbenannt.html]
<img src="{{ url_for('build_plot') }}" alt="plot"/>
[/code]

Für ein paar Ratschläge zur Fehler suche oder zur Lösung währe ich dank bar :)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

`plt` erzeugt globale Grafiken, die Du auch nicht wieder abräumst. Benutze `figure`. Das `seek` ist ziemlich unnötig. Im einen Fall lieferst Du eine HTML-Seite aus, im anderen nur die Bilddaten.

Code: Alles auswählen

from flask import Flask, make_response
from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.figure import Figure
import io

@app.route('/plot.png')
def build_plot():
    y = [1,2,3,4,5]
    x = [0,2,1,3,4]

    fig = Figure()
    ax = fig.add_subplot(111)
    ax.plot(x,y)
    img = io.BytesIO()
    canvas = FigureCanvasAgg(fig)
    canvas.print_figure(img, format='png', bbox_inches='tight')
    response=make_response(img.getvalue())
    response.headers['Content-Type'] = 'image/png'
    return response
 
telegraph
User
Beiträge: 31
Registriert: Mittwoch 6. November 2013, 10:59

Danke das hat mit sehr geholfen. Es funktioniert!
Antworten