aboutsummaryrefslogtreecommitdiffstats
path: root/gnuplot.py
diff options
context:
space:
mode:
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]