Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Plot a PNG using matplotlib in a web request, using Flask.
"Plot a PNG using matplotlib in a web request, using Flask."
# Install dependencies, preferably in a virtualenv:
#
# pip install flask matplotlib
#
# Run the development server:
#
# python app.py
#
# Go to http://localhost:5000/plot.png and see a plot of random data.
import random
import StringIO
from flask import Flask, make_response
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
app = Flask(__name__)
@app.route('/plot.png')
def plot():
fig = Figure()
axis = fig.add_subplot(1, 1, 1)
xs = range(100)
ys = [random.randint(1, 50) for x in xs]
axis.plot(xs, ys)
canvas = FigureCanvas(fig)
output = StringIO.StringIO()
canvas.print_png(output)
response = make_response(output.getvalue())
response.mimetype = 'image/png'
return response
if __name__ == '__main__':
app.run(debug=True)

sburns commented Apr 3, 2014

exactly what I needed, thank you.

i like it, thx!!!

thanks!

mapfumo commented Sep 6, 2015

Awesome. Thank you.

smargs commented Oct 29, 2015

Hi, thank you for the code. I ran it and got this msg '* Restarting with stat'. So i installed watchdog suggested in this post http://stackoverflow.com/questions/28241989/flask-app-restarting-with-stat and now I get this '* '*Restarting with windowsapi reloader'. And the localhost page doesn't work (keeps loading). Would you know how to make this work ? Thank you.

Is there a way to embed this into a flask template? Right now i'm passing the response variable into an html template using the render_template function, but the image is not showing up; instead, only the response string is rendering. Thank you in advance!

thank you for alternative way to show plotted graph !

Thanks a lot! This was super useful :)

I am using python3.5 and ran the code with slight modification:

  1. Instead of import StringIO, I used import io
  2. Instead of output = StringIO.StringIO(), I used output = io.BytesIO()

Thanks

Great help, thanks

How to embed this response in the html page?

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