I'd like to create different figures in Python using matplotlib.pyplot
. I'd then like to save some of them to a file, while others should be shown on-screen using the show()
command.
However, show()
displays all created figures. I can avoid this by calling close()
after creating the plots which I don't want to show on-screen, like in the following code:
import matplotlib.pyplot as plt
y1 = [4, 2, 7, 3]
y2 = [-7, 0, -1, -3]
plt.figure()
plt.plot(y1)
plt.savefig('figure1.p开发者_JAVA百科ng')
plt.close()
plt.figure()
plt.plot(y2)
plt.show()
plt.close('all')
This saves the first figure and shows the second one. However, I get an error message:
can't invoke "event" command: application has been destroyed while executing
Is it possible to select in a more elegant way which figures to show?
Also, is the first figure()
command superfluous? It doesn't seem to make a different whether I give it or not.
Many thanks in advance.
The better way is to use plt.clf()
instead of plt.close()
.
Moreover plt.figure()
creates a new graph while you can just clear previous one with plt.clf()
:
import matplotlib.pyplot as plt
y1 = [4, 2, 7, 3]
y2 = [-7, 0, -1, -3]
plt.figure()
plt.plot(y1)
plt.savefig('figure1.png')
plt.clf()
plt.plot(y2)
plt.show()
plt.clf()
This code will not generate errors or warnings such can't invoke "event" command...
Generally speaking, you can just close the figure. As a quick example:
import matplotlib.pyplot as plt
fig1 = plt.figure()
plt.plot(range(10), 'ro-')
plt.title('This figure will be saved but not shown')
fig1.savefig('fig1.png')
plt.close(fig1)
fig2 = plt.figure()
plt.plot(range(10), 'bo')
plt.title('This figure will be shown')
plt.show()
As far as whether or not the first plt.figure()
call is superflous, it depends on what you're doing. Usually, you want to hang on to the figure object it returns and work with that instead of using matplotlib's matlab-ish state machine interface.
When you're making more complex plots, it often becomes worth the extra line of code to do something like this:
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(range(10))
The advantage is that you don't have to worry about which figure or axis is "active", you just refer to a specific axis or figure object.
精彩评论