Pasando una figura de matplotlib a HTML (matraz)

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

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

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

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

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

Y aquí está el HTML donde estoy tratando de generar la imagen.

   http://sofes.miximages.com/python/{{ title }} - image   Image Placeholder   

Y, como probablemente pueda adivinar, cuando cargue la página, todo lo que obtengo es Image Placeholder . Entonces, no les gustó el formato con el que introduje la figura.

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

BTW: no pensé que era necesario incluir el código de Python que hace la figura, pero puedo incluirlo si ustedes necesitan verlo (simplemente no querían abarrotar la pregunta)

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

Su ruta /images/ 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 genera con savefig() .

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

 @app.route('/images/') def images(cropzonekey): return render_template("images.html", title=cropzonekey) @app.route('/fig/') 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:

   {{ title }} - image   Image Placeholder   

Para Python3 ….

Tengo un DataFrame, quiero mostrar esta ttwig en Flask …

Así que crea una imagen Base64 de la ttwig.

  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 en base64 como este …

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

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

  {% if sunalt != None %} 

Sun Altitude during the year

{% endif %}

Espero que ayude a alguien ….

Estoy trabajando con Python 3.x, cambié algunas líneas del código y funcionó para mí. Recibí el siguiente mensaje de error: “….. el objeto no tiene ningún atributo ‘savefig'”

 @app.route('/fig/') 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') 
 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 progtwig crea un gráfico simple y lo envía a la página html.