Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RuntimeError: main thread is not in main loop using Matplotlib with Django

I am creating a Matplotlib figure to display in a HTML template in my Django application. I send this figure to the HTML by saving it under my static files, and then loading an img tag with the saved .png. I do this in my views.py after getting a reference to the figure.

        # Get analysis visualization chart
        figure = analyser.visualize_tweets(emotions)

        # Save figure in static folder as png
        figure.savefig('static/analysis_figures/figure.png')

        # Inject html with figure path
        response['analysis_figure_path'] = 'analysis_figures/figure.png'

return render(request, 'landing_page/index.html', response)

My HTML is something like this:

<img src={% static analysis_figure %} alt="">

However, this caused the RuntimeError: main thread is not in main loop to happen when the function in my views.py is called a second time (if it's called once everything works properly). To prevent this error, I moved saving the Matplotlib figure to main() as to run in the main thread and then call it in my original function. This fixed the error, but prevents my HTML from reloading so every time the user submits a query the new figure is displayed over the previous one without the previous one being removed. Any ideas on any of the problems ?

like image 465
Ahmad Avatar asked May 03 '18 14:05

Ahmad


1 Answers

I think this post explains what to do: How to clean images in Python / Django?

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

As explained here: https://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server

To prevent that the new figure is displayed over the previous one use: plt.close() / figure.close()

like image 118
Jan Avatar answered Oct 20 '22 18:10

Jan