Reputation: 155
i have this code to produce multiple plots from all the text files in a folder. It runs perfectly fine and shows the plots but i cant work out how to then save them all.
import re
import numpy as np
import matplotlib.pyplot as plt
import pylab as pl
import os
rootdir='C:\documents\Neighbors for each search id'
for subdir,dirs,files in os.walk(rootdir):
for file in files:
f=open(os.path.join(subdir,file),'r')
print file
data=np.loadtxt(f)
#plot data
pl.plot(data[:,1], data[:,2], 'gs')
#Put in the errors
pl.errorbar(data[:,1], data[:,2], data[:,3], data[:,4], fmt='ro')
#Dashed lines showing pmRa=0 and pmDec=0
pl.axvline(0,linestyle='--', color='k')
pl.axhline(0,linestyle='--', color='k')
pl.show()
f.close()
I have previously used
fileName="C:\documents\FirstPlot.png"
plt.savefig(fileName, format="png")
but i think this just saves each graph into one file and overwrites the last one.
Upvotes: 10
Views: 25944
Reputation: 1124658
All you have to do is provide unique filenames. You could use a counter:
fileNameTemplate = r'C:\documents\Plot{0:02d}.png'
for subdir,dirs,files in os.walk(rootdir):
for count, file in enumerate(files):
# Generate a plot in `pl`
pl.savefig(fileNameTemplate.format(count), format='png')
pl.clf() # Clear the figure for the next loop
What I did:
Create a template using python's string formatting syntax
Added a counter to the loop using the enumerate()
function.
Used the counter and the template to generate a new filename for each plot.
Upvotes: 11
Reputation: 775
You’re doing the right thing to save the plot (just put that code before f.close()
, and make sure to use pl.savefig
rather than plt.savefig
, since you import pyplot
as pl
). You just have to give each output plot a different filename.
One way to do this is to add a counter variable that gets incremented for each file you go through, and add that to the filename, for instance, doing something like this:
fileName = "C:\documents\Plot-%04d.png" % ifile
Another option is to make a unique output filename based on the filename of the input. You could try something like:
fileName = "C:\documents\Plot-" + "_".join(os.path.split(os.path.join(subdir,file))) + ".png"
That will take the input path, and replace any path separators with _
. You can use this as a part of your output filename.
Upvotes: 0