posted on: 2008-07-04 12:24:08
This started as a command line script, and I made a class that I use with other scripts for producing large numbers of graphs quickly.
>The only requirements for this are python 2.3 and, of course, you must have gnuplot. I do not intend on doing too much development with this because the is an existing gnuplot.py. What I have done is merely so that I can type from the command line.
clgnuplot.py data.txt
Or if I want to plot a bunch of files.
clgnuplot.py data*
Here is the code.
#!/usr/bin/env python
"""
Gnuplot utility, plot a datafile from command line with data seperated into columns
"""
import sys,os
import subprocess
Ghelp = """
Any options must follow the specific form of '-o value'
These first commands a implemented in sequence of being called.
-x choose column for x data
-y choose column for y data
-s set the line type for any data set specified after ward
These options are called before the plot is made, so every dataset will be affected
-f include a function it wil use the current style
-o directly sent as a line to the gnuplot interpreter.
-p out put to a ps file you need the filname option
"""
class Gs(object):
def __init__(self):
self.refresh()
self.moddict = { 'x':self.setx,
'y':self.sety,
's':self.setstyle,
'f':self.function,
'o':self.rawoption,
'p':self.wfile
}
self.start()
def __call__(self,x,y):
self.moddict.get(x,self.nonmod)(y)
def setx(self,x):
self.xdata = x
def sety(self,x):
self.ydata = x
def setstyle(self,x):
self.style = ' with %s'%x
def nonmod(self,x):
print 'the -%s %s is not a valid option'%(mod,x)
def function(self,x):
self.data += self.sep + "%s %s"%(x,self.style)
self.sep = ', '
def rawoption(self,x):
self.options.append('%s\n'%x)
def wfile(self,x='graph.ps'):
self.options.append('set term postscript color\n')
self.options.append('set out "%s"\n'%x)
self.pause = False
def datafile(self,x):
self.data += self.sep + "'%s' using %s:%s%s"%(x,self.xdata,self.ydata,self.style)
self.sep = ', '
#executes the options and then the plot cmd
def plot(self):
self.data += "\n"
for thing in self.options:
self.program.stdin.write(thing)
self.program.stdin.write(self.data)
if self.pause==True:
text = raw_input()
self.program.stdin.write('\n')
#cleans up
def end(self):
(callSTD,callErr) = self.program.communicate()
#starts the program
def start(self):
exec_args = ['/usr/bin/gnuplot']
popenarg = {'stdout':subprocess.PIPE,'stdin':subprocess.PIPE}
self.program = subprocess.Popen(exec_args,**popenarg)
#initializes a new plot statement.
def refresh(self):
self.xdata = '1'
self.ydata = '2'
self.style = ''
self.data = "plot "
self.sep = ''
self.pause = True
self.options = []
#Command line routine
if __name__=='__main__':
if len(sys.argv)>1:
G = Gs()
filecoming = 1
for item in sys.argv[1:]:
if filecoming==1:
if item[0]!='-':
G.datafile(item)
else:
mod = item[1]
filecoming=0
else:
G(mod,item)
filecoming=1
G.plot()
G.end()
else:
print Ghelp
Comments
Matt
2008-07-01 15:32:39
This could probably be done with a pipe instead of a temporary file. I might switch that since it wouldn't change the functionality, but it would stop the accumulation of temporary files in my tmp directory.
matt
2008-07-02 12:26:40
This version is outdated already. It doesn't process options for one thing and it pauses when you write a file, both of which have been fixed already.