legends python html image matplotlib flask

legends - plot python 3



Pasar una figura de matplotlib a HTML(matraz) (4)

Estoy trabajando con Python 3.x, he cambiado algunas líneas del código y funcionó para mí. Tuve el siguiente mensaje de error: "..... el objeto no tiene atributo ''savefig''"

@app.route(''/fig/<cropzonekey>'') def fig(cropzonekey): #fig = draw_polygons(cropzonekey) fig = plt.plot([1,2,3,4], [1,2,3,4]) #img = StringIO() img = BytesIO() #fig.savefig(img) plt.savefig(img) img.seek(0) return send_file(img, mimetype=''image/png'')

Estoy usando matplotlib para representar una figura en una aplicación web. He usado fig.savefig() antes cuando solo estoy ejecutando scripts. Sin embargo, necesito una función para devolver una imagen real ".png" para poder llamarla con mi HTML.

Alguna información más (posiblemente innecesaria): estoy usando Python Flask. Me imagino que podría usar fig.savefig() y simplemente fig.savefig() la figura en mi carpeta estática y luego llamarla desde mi HTML, pero prefiero no hacer eso cada vez. Sería óptimo si pudiera simplemente crear la figura, hacer una imagen de ella, devolver esa imagen y llamarla desde mi HTML, luego desaparecerá.

El código que crea la figura funciona. Sin embargo, devuelve una cifra, que no funciona con HTML, supongo.

Aquí es donde llamo el draw_polygon en el enrutamiento, draw_polygon es el método que devuelve la figura:

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

Y aquí está el HTML donde intento generar la imagen.

<html> <head> <title>{{ title }} - image</title> </head> <body> <img src={{ figure }} alt="Image Placeholder" height="100"> </body> </html>

Y, como probablemente puedas adivinar, cuando cargo la página, todo lo que obtengo es Image Placeholder . Entonces, no les gustó el formato con el que alimenté la figura.

¿Alguien sabe qué métodos matplotlib / work-arounds convierten una figura en una imagen real? Estoy en todos estos documentos, pero no puedo encontrar nada. ¡Gracias!

Por cierto: no creo que sea necesario incluir el código de Python que hace la figura, pero puedo incluirlo si ustedes necesitan verlo (simplemente no quería complicar la pregunta)


Para Python3 ....

Tengo un DataFrame, quiero mostrar esta trama en Flask ....

Entonces crea una imagen Base64 de la trama.

df_week_min_az = pd.DataFrame.from_dict(week_max_az.to_dict(), orient=''index'', columns=[''min_az'']) sunalt = df_week_max_angle.plot().get_figure() buf = io.BytesIO() sunalt.savefig(buf, format=''png'') buf.seek(0) buffer = b''''.join(buf) b2 = base64.b64encode(buffer) sunalt2=b2.decode(''utf-8'')

Ahora llamo a mi plantilla usando los datos codificados de base64 como este ....

return render_template(''where.html'', form=form, sunalt=sunalt2)

La parte relevante de la plantilla (es decir, el bit de la imagen) se ve así ...

{% if sunalt != None %} <h2>Sun Altitude during the year</h2> <img src="data:image/png;base64,{{ sunalt }}"> {% endif %}

Espero que ayude a alguien ...


Tienes que separar el HTML y la imagen en dos rutas diferentes.

Su ruta /images/<cropzonekey> solo servirá a la página, y en el contenido HTML de esa página habrá una referencia a la segunda ruta, la que sirve a la imagen.

La imagen se sirve en su propia ruta desde un archivo de memoria que usted genera con savefig() .

Obviamente no probé esto, pero creo que el siguiente ejemplo funcionará como está o te acercará bastante a una solución funcional:

@app.route(''/images/<cropzonekey>'') def images(cropzonekey): return render_template("images.html", title=cropzonekey) @app.route(''/fig/<cropzonekey>'') def fig(cropzonekey): fig = draw_polygons(cropzonekey) img = StringIO() fig.savefig(img) img.seek(0) return send_file(img, mimetype=''image/png'')

Su plantilla images.html convierte en:

<html> <head> <title>{{ title }} - image</title> </head> <body> <img src="{{ url_for(''fig'', cropzonekey = title) }}" alt="Image Placeholder" height="100"> </body> </html>


from flask import Flask, send_file from io import StringIO import matplotlib.pyplot as plt from StringIO import StringIO @app.route(''/fig/'') def fig(): plt.plot([1,2,3,4], [1,2,3,4]) img = StringIO() plt.savefig(img) img.seek(0) return send_file(img, mimetype=''image/png'')

Las otras respuestas son correctas, solo quería mostrar los archivos de encabezado que deben incluirse. Este programa crea un gráfico simple y lo envía a la página html.