The following example code generates a simple plot, then saves it to 'fig1.pdf', then displays it, then saves it again to 'fig2.pdf'. The first image looks as expected, but the second one is blank (contains a white square). What's actually going on here? The line
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 100)
y = x**2
If you want to save the figure after displaying it, you'll need to hold on to the figure instance. The reason that
plt.savefig doesn't work after calling
show is that the current figure has been reset.
pyplot keeps track of which figures, axes, etc are "current" (i.e. have not yet been displayed with
gca get the current figure and current axes instances, respectively.
plt.savefig (and essentially any other
pyplot method) just does
plt.gcf().savefig(...). In other words, get the current figure instance and call its
savefig method. Similarly
plt.plot basically does
show is called, the list of "current" figures and axes is empty.
In general, you're better off directly using the figure and axes instances to plot/save/show/etc, rather than using
plt.plot, etc, to implicitly get the current figure/axes and plot on it. There's nothing wrong with using
pyplot for everything (especially interactively), but it makes it easier to shoot yourself in the foot.
plt.show() and to generate a figure and an axes object(s), but then use the figure or axes methods directly. (e.g.
ax.plot(x, y) instead of
plt.plot(x, y), etc) The main advantage of this is that it's explicit. You know what objects you're plotting on, and don't have to reason about what the pyplot state-machine does (though it's not that hard to understand the state-machine interface, either).
As an example of the "recommended" way of doing things, do something like:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-1, 1, 100) y = x**2 fig, ax = plt.subplots() ax.plot(x, y) fig.savefig('fig1.pdf') plt.show() fig.savefig('fig2.pdf')
If you'd rather use the
pyplot interface for everything, then just grab the figure instance before you call
show. For example:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-1, 1, 100) y = x**2 plt.plot(x, y) fig = plt.gcf() fig.savefig('fig1.pdf') plt.show() fig.savefig('fig2.pdf')