87
By default matplotlib uses TK gui toolkit, when you’re rendering an image without using the toolkit (i.e. into a file or a string), matplotlib still instantiates a window that doesn’t get displayed, causing all kinds of problems. In order to avoid that, you should use an Agg backend. It can be activated like so —
import matplotlib
matplotlib.use('Agg')
from matplotlib import pyplot
For more information please refer to matplotlib documentation — http://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server
16
The above (accepted) answer is a solution in a terminal environment. If you debug in an IDE, you still might wanna use ‘TkAgg
‘ for displaying data. In order to prevent this issue, apply these two simple rules:
- everytime you display your data, initiate a new
fig = plt.figure()
- don’t close old figures manually (e.g. when using a debug mode)
Example code:
import matplotlib
matplotlib.use('TkAgg')
from matplotlib import pyplot as plt
fig = plt.figure()
plt.plot(data[:,:,:3])
plt.show()
This proves to be the a good intermediate solution under MacOS and PyCharm IDE.
- [Django]-Multiple django sites with apache & mod_wsgi
- [Django]-How to add superuser in Django from fixture
- [Django]-Django: accessing the model instance from within ModelAdmin?
0
If you don’t need to show plots while debugging, the following works:
import matplotlib
matplotlib.use('Agg')
from matplotlib import pyplot as plt
However, if you would like to plot while debugging, you need to do 3 steps:
1.Keep backend to ‘TKAgg’ as follows:
import matplotlib
matplotlib.use('TKAgg')
from matplot.lib import pyplot as plt
or simply
import matplotlib.pyplot as plt
2.As Fábio also mentioned, you need to add fig(no. #i)=plt.figure(no.#i) for each figure #i. As the following example for plot no.#1, add:
fig1 = plt.figure(1)
plt.plot(yourX,yourY)
plt.show()
3.Add breakpoints. You need to add two breakpoints at least, one somewhere at the beginning of your codes (before the first plot), and the other breakpoint at a point where you would like all plots (before to the second breakpoint) are plotted. All figures are plotted and you even don’t need to close any figure manually.
- [Django]-Easy way to run "explain" on query sets in django
- [Django]-Allow only positive decimal numbers
- [Django]-AttributeError: 'module' object has no attribute 'tests'
0
For me, this happened due to parallel access to data by both Matplotlib and by Tensorboard, after Tensorboard’s server was running for a week straight.
Rebotting tensorboard tensorboard --logdir . --samples_per_plugin images=100
solved this for me.
- [Django]-How do I get the default value for a field in a Django model?
- [Django]-How to create a user in Django?
- [Django]-Django: how to annotate queryset with count of filtered ForeignKey field?
0
I encountered this problem when plotting graphs live with matplotlib in my tkinter application.
The easiest solution I found, was to always delete subplots. I found you didn’t need to instantiate a new figure, you only needed to delete the old subplot (using del subplot), then remake it.
Before plotting a new graph, make sure to delete the old subplot.
Example:
f = Figure(figsize=(5,5), dpi=100)
a = f.add_subplot(111)
(For Loop code that updates graph every 5 seconds):
del a #delete subplot
a = f.add_subplot(111) #redefine subplot
Finding this simple solution to fix this "async handler bug" was excruciatingly painful, I hope this helps someone else
- [Django]-Turn off automatic pagination of Django Rest Framework ModelViewSet
- [Django]-How to get request object in django unit testing?
- [Django]-Django get a random object