""" ========================================= Embed in a web application server (Flask) ========================================= When using Matplotlib in a web server it is strongly recommended to not use pyplot (pyplot maintains references to the opened figures to make `~.matplotlib.pyplot.show` work, but this will cause memory leaks unless the figures are properly closed). Since Matplotlib 3.1, one can directly create figures using the `.Figure` constructor and save them to in-memory buffers. In older versions, it was necessary to explicitly instantiate an Agg canvas (see e.g. :doc:`/gallery/user_interfaces/canvasagg`). The following example uses Flask_, but other frameworks work similarly: .. _Flask: https://flask.palletsprojects.com """ import base64 from io import BytesIO from flask import Flask from matplotlib.figure import Figure app = Flask(__name__) @app.route("/") def hello(): # Generate the figure **without using pyplot**. fig = Figure() ax = fig.subplots() ax.plot([1, 2]) # Save it to a temporary buffer. buf = BytesIO() fig.savefig(buf, format="png") # Embed the result in the html output. data = base64.b64encode(buf.getbuffer()).decode("ascii") return f"" # %% # # Since the above code is a Flask application, it should be run using the # `flask command-line tool `_ # Assuming that the working directory contains this script: # # Unix-like systems # # .. code-block:: console # # FLASK_APP=web_application_server_sgskip flask run # # Windows # # .. code-block:: console # # set FLASK_APP=web_application_server_sgskip # flask run # # # Clickable images for HTML # ------------------------- # # Andrew Dalke of `Dalke Scientific `_ # has written a nice `article # `_ # on how to make html click maps with Matplotlib agg PNGs. We would # also like to add this functionality to SVG. If you are interested in # contributing to these efforts that would be great.