aboutsummaryrefslogtreecommitdiffstats
path: root/gnuplot.py
diff options
context:
space:
mode:
authorBjörn B. Brandenburg <bbb@cs.unc.edu>2010-05-25 13:35:36 -0400
committerBjörn B. Brandenburg <bbb@cs.unc.edu>2010-05-25 13:35:36 -0400
commit707f7ed573c29581bc6a050257a0b6e8970a5553 (patch)
tree17001272c826f8513dd844749d8a66fd5d944709 /gnuplot.py
parentab01739fd3d30d3c808ed1773a2748d1f890f4d6 (diff)
add object-oriented interface to gnuplot
Create a plot, configure it as desired, then executed. In the long run, this should make it easier to customize "default styles" for individual papers without changing the look of old paper styles.
Diffstat (limited to 'gnuplot.py')
-rwxr-xr-xgnuplot.py179
1 files changed, 175 insertions, 4 deletions
diff --git a/gnuplot.py b/gnuplot.py
index 260fbf5..aa9e26b 100755
--- a/gnuplot.py
+++ b/gnuplot.py
@@ -6,6 +6,13 @@ from optparse import make_option as o
6FORMATS = ['png', 'eps', 'pdf', 'show', 'ps'] 6FORMATS = ['png', 'eps', 'pdf', 'show', 'ps']
7STYLES = ['points', 'lines', 'linespoints'] 7STYLES = ['points', 'lines', 'linespoints']
8 8
9TERMINALS = {
10 'png' : 'png',
11 'eps' : 'postscript eps',
12 'ps' : 'postscript',
13 'pdf' : 'pdf',
14 }
15
9class CommandBuffer(object): 16class CommandBuffer(object):
10 def __init__(self): 17 def __init__(self):
11 self.cmds = [] 18 self.cmds = []
@@ -16,6 +23,21 @@ class CommandBuffer(object):
16 def __str__(self): 23 def __str__(self):
17 return '\n'.join([str(x) for x in self.cmds]) 24 return '\n'.join([str(x) for x in self.cmds])
18 25
26
27class Label(object):
28 def __init__(self, x, y, txt):
29 self.x = x
30 self.y = y
31 self.txt = txt
32 # support more label stuff optionally...
33
34 def gnuplot_cmd(self):
35 return '"%s" at %f,%f center' % (self.txt, self.x, self.y)
36
37 def __str__(self):
38 return 'set label %s' % self.gnuplot_cmd()
39
40
19class FileGraph(object): 41class FileGraph(object):
20 def __init__(self, fname, xcol=1, ycol=2, error=None, 42 def __init__(self, fname, xcol=1, ycol=2, error=None,
21 title=None, 43 title=None,
@@ -25,12 +47,12 @@ class FileGraph(object):
25 self.ycol = ycol 47 self.ycol = ycol
26 self.error = error 48 self.error = error
27 self.title = title 49 self.title = title
28 self.style = style 50 self.style = style # replace with linetype, lines/points etc.
29 51
30 def __str__(self): 52 def __str__(self):
31 return self.get_command() 53 return self.gnuplot_cmd()
32 54
33 def get_command(self, default_style=None): 55 def gnuplot_cmd(self, default_style=None):
34 if self.error: 56 if self.error:
35 using_txt = "%s:%s:%s" % (self.xcol, self.ycol, self.error) 57 using_txt = "%s:%s:%s" % (self.xcol, self.ycol, self.error)
36 style = self.style if self.style else "errorbars" 58 style = self.style if self.style else "errorbars"
@@ -42,6 +64,155 @@ class FileGraph(object):
42 return "'%s' using %s%s%s" % \ 64 return "'%s' using %s%s%s" % \
43 (self.fname, using_txt, title_txt, style_txt) 65 (self.fname, using_txt, title_txt, style_txt)
44 66
67
68class LiteralGraph(object):
69 def __init__(self, literal_expr, title=None, style=None):
70 self.expr = literal_expr
71 self.title = title
72 self.style = style
73
74 def __str__(self):
75 return self.gnuplot_cmd()
76
77 def gnuplot_cmd(self, default_style=None):
78 style = self.style if self.style else default_style
79 style_txt = " with %s" % style if style else ""
80 title_txt = " title '%s'" % self.title if self.title else ""
81 return "%s %s%s" % \
82 (self.expr, title_txt, style_txt)
83
84
85label = Label
86
87def curve(fname=None, literal=None, **kargs):
88 if fname:
89 return FileGraph(fname, **kargs)
90 elif literal:
91 return LiteralGraph(literal, **kargs)
92
93
94class Plot(object):
95 def __init__(self):
96 self.format = None
97 self.output = None
98 self.size = None
99
100 self.font = None
101 self.font_size = None
102 self.enhanced_text = None
103
104 self.monochrome = None
105 self.dashed_lines = None
106 self.rounded_caps = None
107
108 self.xrange = None
109 self.xticks = None
110 self.xlog = None
111 self.xlabel = None
112
113 self.yrange = None
114 self.yticks = None
115 self.ylog = None
116 self.ylabel = None
117
118 self.key = None
119 self.title = None
120
121 self.labels = []
122 self.curves = []
123
124 def gnuplot_commands(self, cmd_buf=None):
125 if cmd_buf:
126 g = cmd_buf
127 else:
128 g = CommandBuffer()
129
130 def isset(x):
131 return not (x is None)
132
133 if isset(self.format):
134 term = [TERMINALS[self.format]]
135 else:
136 term = 'x11'
137
138 ps_like = self.format in ['eps', 'pdf', 'ps']
139
140 if isset(self.monochrome) and ps_like:
141 term += ['monochrome' if self.monochrome else 'color']
142
143 if isset(self.enhanced_text):
144 term += ['enhanced' if self.enhanced_text else 'noenhanced']
145
146 if isset(self.dashed_lines) and ps_like:
147 term += ['dashed' if self.dashed_lines else 'solid']
148 if isset(self.font) and ps_like:
149 term += ['font "%s%s"' %
150 (self.font,
151 (",%s" % self.font_size) if isset(self.font_size)
152 else "")
153 ]
154
155 if isset(self.rounded_caps):
156 term += ['rounded' if self.rounded_caps else 'butt']
157
158 if isset(self.size):
159 term += ['size %s,%s' % (self.size)]
160
161 if isset(self.font_size) and self.format == 'png':
162 term += [self.font_size]
163
164 g("set terminal %s" % " ".join(term))
165 if isset(self.output):
166 g("set out '/dev/null'")
167
168 if self.xrange:
169 g("set xrange [%s:%s]" % self.xrange)
170 if self.xticks:
171 g("set xtics %s, %s" % self.xticks)
172 if self.xlabel:
173 g("set xlabel '%s'" % self.xlabel)
174
175 if self.yrange:
176 g("set yrange [%s:%s]" % self.yrange)
177 if self.yticks:
178 g("set ytics %s, %s" % self.yticks)
179 if self.ylabel:
180 g("set ylabel '%s'" % self.ylabel)
181
182 if self.key:
183 g('set key %s' % self.key)
184 if self.title:
185 g("set title '%s'" % self.title)
186
187 logscale = ""
188 if self.xlog:
189 logscale += "x"
190 if self.ylog:
191 logscale += "y"
192 if logscale:
193 g("set logscale %s" % logscale)
194
195 plots = [c.gnuplot_cmd() for c in self.curves]
196 if plots:
197 g("plot " + ", ".join(plots))
198
199 for l in self.labels:
200 g("set label " + l.gnuplot_cmd())
201
202 if isset(self.output):
203 g("set out '%s'" % self.output)
204
205 g("replot")
206
207 if isset(self.output):
208 g("set out") # close file
209
210 return g
211
212
213 def gnuplot_exec(self):
214 pipe2gnuplot(self.gnuplot_commands())
215
45def gnuplot_cmd(graphs, title=None, ylabel=None, xlabel=None, 216def gnuplot_cmd(graphs, title=None, ylabel=None, xlabel=None,
46 format='show', term_opts=None, 217 format='show', term_opts=None,
47 style='linespoints', xrange=None, 218 style='linespoints', xrange=None,
@@ -99,7 +270,7 @@ def gnuplot_cmd(graphs, title=None, ylabel=None, xlabel=None,
99 plot.append(str(gr)) 270 plot.append(str(gr))
100 elif type(gr) == FileGraph: 271 elif type(gr) == FileGraph:
101 # formatter object 272 # formatter object
102 plot.append(gr.get_command(style)) 273 plot.append(gr.gnuplot_cmd(style))
103 elif len(gr) == 4: 274 elif len(gr) == 4:
104 par = (gr[0], gr[1], gr[2], gr[3], style) 275 par = (gr[0], gr[1], gr[2], gr[3], style)
105 plot += ["'%s' using %s:%s title '%s' with %s" % par] 276 plot += ["'%s' using %s:%s title '%s' with %s" % par]