aboutsummaryrefslogtreecommitdiffstats
path: root/plot.py
diff options
context:
space:
mode:
Diffstat (limited to 'plot.py')
-rw-r--r--plot.py138
1 files changed, 138 insertions, 0 deletions
diff --git a/plot.py b/plot.py
new file mode 100644
index 0000000..d610875
--- /dev/null
+++ b/plot.py
@@ -0,0 +1,138 @@
1import defapp
2from subprocess import Popen, PIPE
3from optparse import make_option as o
4
5FORMATS = ['png', 'eps', 'pdf', 'show']
6STYLES = ['points', 'lines', 'linespoints']
7
8class CommandBuffer(object):
9 def __init__(self):
10 self.cmds = []
11
12 def __call__(self, cmd):
13 self.cmds += [cmd]
14
15 def __str__(self):
16 return '\n'.join([str(x) for x in self.cmds])
17
18def gnuplot_cmd(graphs, title=None, ylabel=None, xlabel=None,
19 format='show', term_opts=None,
20 style='linespoints', xrange=None,
21 yrange=None,
22 xticks=None, yticks=None,
23 key='below',
24 fname=None):
25 g = CommandBuffer()
26 if format == 'png':
27 terminal = 'png'
28 if term_opts is None:
29 term_opts = 'size 1024,768 large'
30 elif format == 'eps':
31 terminal = 'postscript eps'
32 if term_opts is None:
33 term_opts = 'color blacktext solid linewidth 1.0'
34 elif format == 'pdf':
35 terminal = 'pdf'
36 if term_opts is None:
37 term_opts = 'color enhanced'
38 if format != 'show':
39 g('set terminal %s %s' % (terminal, term_opts))
40 g("set out '/dev/null'")
41 if xlabel:
42 g("set xlabel '%s'" % xlabel)
43 if ylabel:
44 g("set ylabel '%s'" % ylabel)
45 if title:
46 g("set title '%s'" % title)
47 if xrange:
48 g("set xrange [%s:%s]" % xrange)
49 if yrange:
50 g("set yrange [%s:%s]" % yrange)
51 if xticks:
52 g("set xtics %s, %s" % xticks)
53 if yticks:
54 g("set ytics %s, %s" % yticks)
55 g('set key %s' % key)
56 plot = []
57 for gr in graphs:
58 par = (gr[0], gr[1], gr[2], gr[3], style) if len(gr) == 4 else gr
59 plot += ["'%s' using %s:%s title '%s' with %s" % par]
60 if plot:
61 g('plot ' + ', '.join(plot))
62 if format != 'show' and fname:
63 g("set out '%s.%s'" % (fname, format))
64 if plot:
65 g('replot')
66 if format != 'show' and fname:
67 g('set out')
68 return g
69
70def pipe2gnuplot(cmds):
71 proc = Popen(['gnuplot'], stdin=PIPE)
72 proc.stdin.write(str(cmds))
73 proc.stdin.close()
74 proc.wait()
75
76def eps2pdf(file):
77 Popen(['ps2pdf', '-dEPSCrop', '%s.eps' % file]).wait()
78
79options = [
80 o('-f', '--format', action='store', dest='format', type='choice',
81 choices=FORMATS, help='output format'),
82 o('-o', '--output', action='store', dest='out', help='Output file name.'),
83 o('-s', '--style', action='store', dest='style', type='choice',
84 choices=STYLES, help='line style'),
85 o('-t', '--title', action='store', dest='title'),
86 o(None, '--xlabel', action='store', dest='xlabel'),
87 o(None, '--ylabel', action='store', dest='ylabel'),
88 o(None, '--xrange', action='store', dest='xrange', nargs=2, type='float'),
89 o(None, '--yrange', action='store', dest='yrange', nargs=2, type='float'),
90 o(None, '--xticks', action='store', dest='xticks', nargs=2, type='float'),
91 o(None, '--yticks', action='store', dest='yticks', nargs=2, type='float'),
92 ]
93
94defaults = {
95 'out' : 'graph',
96 'format' : 'show',
97 'style' : 'linespoints',
98 'title' : None,
99 'xlabel' : None,
100 'ylabel' : None,
101 'xrange' : None,
102 'yrange' : None,
103 }
104
105class Plotter(defapp.App):
106 def __init__(self):
107 defapp.App.__init__(self, options, defaults, no_std_opts=True)
108
109 def get_cmd(self, args):
110 graphs = []
111 while len(args) >= 4:
112 g = args[0:4]
113 graphs += [g]
114 args = args[4:]
115 if args:
116 self.err("Warning: Ignoring trailing args. Args:", *args)
117 return gnuplot_cmd(graphs,
118 title=self.options.title,
119 format=self.options.format,
120 style=self.options.style,
121 xlabel=self.options.xlabel,
122 ylabel=self.options.ylabel,
123 xrange=self.options.xrange,
124 yrange=self.options.yrange,
125 xticks=self.options.xticks,
126 yticks=self.options.yticks,
127 fname=self.options.out)
128
129 def default(self, _):
130 cmd = self.get_cmd(list(self.args))
131 pipe2gnuplot(cmd)
132
133 def do_cmd(self, _):
134 cmd = self.get_cmd(self.args[1:])
135 self.out(cmd)
136
137if __name__ == "__main__":
138 Plotter().launch()