Create a gist now

Instantly share code, notes, and snippets.

Example of rendering a matplotlib image directly to Flask view
from flask import Flask, make_response
app = Flask(__name__)
@app.route("/simple.png")
def simple():
import datetime
import StringIO
import random
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
from matplotlib.dates import DateFormatter
fig=Figure()
ax=fig.add_subplot(111)
x=[]
y=[]
now=datetime.datetime.now()
delta=datetime.timedelta(days=1)
for i in range(10):
x.append(now)
now+=delta
y.append(random.randint(0, 1000))
ax.plot_date(x, y, '-')
ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d'))
fig.autofmt_xdate()
canvas=FigureCanvas(fig)
png_output = StringIO.StringIO()
canvas.print_png(png_output)
response=make_response(png_output.getvalue())
response.headers['Content-Type'] = 'image/png'
return response
if __name__ == "__main__":
app.run()
@jyoo
jyoo commented Jan 18, 2012

Yo this is awesome. Thank you and works perfectly out of the box.

@Wayn0
Wayn0 commented Nov 20, 2013

Thanks, this has given me some ideas!

@dledgerton

Thanks! I teaching my stats class using Python and this is very helpful.

@taylorhawks

Just what I was looking for. Thanks!

@crystal95

I have a problem that when render matplot image directly into flask view , I loose my basic features of matplot image(like now it donot show coordinates when hovering over the image ,now I cannot zoom into a particular portion of image etc ) . Can you suggest how can I render matplotimage into flask and still having these features of images ? (I am able to do that using pygal but not matplot lib)
Thanks in advance :)

@ivorscott

Thanks Andy. :)

@aryeguetta

Great! thanks that works wonderfully.
Is there a way that I can do something like that and using Drawnow() and plotting a PNG image that will show my graph and also interactive mode.
I was trying to figure that ourt and I am getting always Error with $DISPLAY.
Thanks.

@kwanwasutumkethom

thanks !

@tacaswell

Patch to make this work with python 3

15:18 $ diff -u /tmp/fa2.py /tmp/fa.py 
--- /tmp/fa2.py	2017-01-25 15:18:03.000000000 -0500
+++ /tmp/fa.py	2017-01-25 15:13:33.000000000 -0500
@@ -5,7 +5,7 @@
 @app.route("/simple.png")
 def simple():
     import datetime
-    import StringIO
+    from io import BytesIO
     import random
 
     from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
@@ -26,7 +26,7 @@
     ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d'))
     fig.autofmt_xdate()
     canvas=FigureCanvas(fig)
-    png_output = StringIO.StringIO()
+    png_output = BytesIO()
     canvas.print_png(png_output)
     response=make_response(png_output.getvalue())
     response.headers['Content-Type'] = 'image/png'
@saikiran6

Hi Thanks for the example. What is I want to put he result back to same home url. What changes I have to do?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment