Reputation: 8103
When writing scripts that use matplotlib, I temporally get an interactive graphing window when I run the script, which immediately goes away before I can view the plot. If I execute the same code interactively inside iPython, the graphing window stays open. How can I get matplotlib to keep a plot open once it is produces a graph when I run a script?
For example, I can save this plot, but I cannot display it with show()
:
from matplotlib import pyplot as plt
import scipy as sp
x = sp.arange(10)
y = sp.arange(10)
plt.plot(x,y)
plt.show()
Upvotes: 56
Views: 84326
Reputation: 85
For anyone this applies to, I had the problem where my new windows were being automatically closed regardless of the interactive backend. The error for me was accidentally running the script inside a terminal-initiated version of Python rather than calling my system version. To solve I just needed to quit()
my terminal Python session and rerun the program--simple but frustrating to debug!
Upvotes: 0
Reputation: 114548
Old question, but more canonical answer (perhaps), since it uses only documented and not experimental features.
Before your script exits, enter non-interactive mode and show your figures. This can be done using plt.show()
or plt.gcf().show()
. Both will block:
plt.ioff()
plt.show()
OR
plt.ioff()
plt.gcf().show()
In both cases, the show
function will not return until the figure is closed. The first case is to block on all figures, the second case is to block only until the one figure is closed.
You can even use the matplotlib.rc_context
context manager to temporarily modify the interactive state in the middle of your program without changing anything else:
import matplotlib as mpl
with mpl.rc_context(rc={'interactive': False}):
plt.show()
OR
with mpl.rc_context(rc={'interactive': False}):
plt.gcf().show()
Upvotes: 16
Reputation: 5993
According to the documentation, there's an experimental block
parameter you can pass to plt.show()
. Of course, if your version of matplotlib isn't new enough, it won't have this.
If you have this feature, you should be able to replace plt.show()
with plt.show(block=True)
to get your desired behavior.
Upvotes: 51