22

From some examples from the Internet I made the test code below. It works!

... BUT if I reload the page, the pie will draw itself with the same image. Some parts get darker every time I reload the page. When I restart the the development server, it is reset. How do I draw properly with Matplotlib in Django? It looks like it remembers some drawings...

Source views.py (let urls.py link to it):

from pylab import figure, axes, pie, title
from matplotlib.backends.backend_agg import FigureCanvasAgg

def test_matplotlib(request):
    f = figure(1, figsize=(6,6))
    ax = axes([0.1, 0.1, 0.8, 0.8])
    labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
    fracs = [15,30,45, 10]
    explode=(0, 0.05, 0, 0)
    pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True)
    title('Raining Hogs and Dogs', bbox={'facecolor':'0.8', 'pad':5})

    canvas = FigureCanvasAgg(f)    
    response = HttpResponse(content_type='image/png')
    canvas.print_png(response)
    return response

I am using Django 1.0.1 and Python 2.6.2 (Linux).

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Jack Ha
  • 19,661
  • 11
  • 37
  • 41
  • 2
    For django 2.0 and matplotlib 2.2, check [this SO answer](https://stackoverflow.com/a/49544179/4126114) – Shadi Jul 18 '18 at 04:00

2 Answers2

28

You need to remove the num parameter from the figure constructor and close the figure when you're done with it.

import matplotlib.pyplot

def test_matplotlib(request):
    f = figure(figsize=(6,6))
    ....
    matplotlib.pyplot.close(f)

By removing the num parameter, you'll avoid using the same figure at the same time. This could happen if 2 browsers request the image at the same time. If this is not an issue, another possible solution is to use the clear method, i.e. f.clear().

Cristian Ciupitu
  • 20,270
  • 7
  • 50
  • 76
0

1.save picture which created by matplotlib
for example:plt.savefig('./app1/static/visualize.png') 2.use the picture in your html code for example:

about django how to use static variable(like picture and js file) you can refer to django document

chenxuZhu
  • 451
  • 4
  • 5