summaryrefslogtreecommitdiff
path: root/bin/pychart/line_plot.py
diff options
context:
space:
mode:
authorpinky <>2006-12-07 13:41:40 +0000
committerpinky <>2006-12-07 13:41:40 +0000
commit004a0b996ff8f269451e07346f71a129a1f3fbaf (patch)
tree48f43c1fc2ca4c1f4d5648e7e73553d3f4ccae06 /bin/pychart/line_plot.py
New trunk
bzr revid: pinky-3f10ee12cea3c4c75cef44ab04ad33ef47432907
Diffstat (limited to 'bin/pychart/line_plot.py')
-rw-r--r--bin/pychart/line_plot.py150
1 files changed, 150 insertions, 0 deletions
diff --git a/bin/pychart/line_plot.py b/bin/pychart/line_plot.py
new file mode 100644
index 00000000000..81b995c86e8
--- /dev/null
+++ b/bin/pychart/line_plot.py
@@ -0,0 +1,150 @@
+#
+# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
+#
+# Jockey is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any
+# later version.
+#
+# Jockey is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+import tick_mark
+import line_style
+import pychart_util
+import error_bar
+import chart_object
+import legend
+import object_set
+import line_plot_doc
+import theme
+from pychart_types import *
+from types import *
+
+default_width = 1.2
+line_style_itr = None
+
+
+_keys = {
+ "data" : (AnyType, None, pychart_util.data_desc),
+ "label": (StringType, "???", pychart_util.label_desc),
+ "data_label_offset": (CoordType, (0, 5),
+ """The location of data labels relative to the sample point. Meaningful only when data_label_format != None."""),
+ "data_label_format": (FormatType, None,
+ """The format string for the label printed
+ beside a sample point.
+ It can be a `printf' style format string, or
+ a two-parameter function that takes the (x, y)
+ values and returns a string. """
+ + pychart_util.string_desc),
+ "xcol" : (IntType, 0, pychart_util.xcol_desc),
+ "ycol": (IntType, 1, pychart_util.ycol_desc),
+ "y_error_minus_col": (IntType, 2,
+ """The column (within "data") from which the depth of the errorbar is extracted. Meaningful only when error_bar != None. <<error_bar>>"""),
+ "y_error_plus_col": (IntType, -1,
+ """The column (within "data") from which the height of the errorbar is extracted. Meaningful only when error_bar != None. <<error_bar>>"""),
+ "y_qerror_minus_col": (IntType, -1, "<<error_bar>>"),
+ "y_qerror_plus_col": (IntType, -1, "<<error_bar>>"),
+
+ "line_style": (line_style.T, lambda: line_style_itr.next(), pychart_util.line_desc,
+ "By default, a style is picked from standard styles round-robin. <<line_style>>"),
+
+ "tick_mark": (tick_mark.T, None, pychart_util.tick_mark_desc),
+ "error_bar": (error_bar.T, None,
+ "The style of the error bar. <<error_bar>>"),
+ }
+
+class T(chart_object.T):
+ __doc__ = line_plot_doc.doc
+ keys = _keys
+ def check_integrity(self):
+ self.type_check()
+
+##AUTOMATICALLY GENERATED
+
+##END AUTOMATICALLY GENERATED
+ def get_data_range(self, which):
+ if which == 'X':
+ return pychart_util.get_data_range(self.data, self.xcol)
+ else:
+ return pychart_util.get_data_range(self.data, self.ycol)
+ def get_legend_entry(self):
+ if self.label:
+ return legend.Entry(line_style=self.line_style,
+ tick_mark=self.tick_mark,
+ fill_style=None,
+ label=self.label)
+ return None
+
+ def draw(self, ar, can):
+
+ # Draw the line
+
+ clipbox = theme.adjust_bounding_box([ar.loc[0], ar.loc[1],
+ ar.loc[0] + ar.size[0],
+ ar.loc[1] + ar.size[1]]);
+
+ can.clip(clipbox[0],clipbox[1],clipbox[2],clipbox[3])
+ if self.line_style:
+ points = []
+ for pair in self.data:
+ yval = pychart_util.get_sample_val(pair, self.ycol)
+ xval = pair[self.xcol]
+ if None not in (xval, yval):
+ points.append((ar.x_pos(xval), ar.y_pos(yval)))
+ can.lines(self.line_style, points)
+ can.endclip()
+
+ # Draw tick marks and error bars
+ can.clip(ar.loc[0] - 10, ar.loc[1] - 10,
+ ar.loc[0] + ar.size[0] + 10,
+ ar.loc[1] + ar.size[1] + 10)
+ for pair in self.data:
+ x = pair[self.xcol]
+ y = pychart_util.get_sample_val(pair, self.ycol)
+ if None in (x, y): continue
+
+ x_pos = ar.x_pos(x)
+ y_pos = ar.y_pos(y)
+
+ if self.error_bar:
+ plus = pair[self.y_error_plus_col or self.y_error_minus_col]
+ minus = pair[self.y_error_minus_col or self.y_error_plus_col]
+ if self.y_qerror_minus_col or self.y_qerror_plus_col:
+ q_plus = pair[self.y_qerror_plus_col or self.y_qerror_minus_col]
+ q_minus = pair[self.y_qerror_minus_col or self.y_qerror_plus_col]
+ if None not in (minus,plus,q_minus,q_plus):
+ self.error_bar.draw(can, (x_pos, y_pos),
+ ar.y_pos(y - minus),
+ ar.y_pos(y + plus),
+ ar.y_pos(y - q_minus),
+ ar.y_pos(y + q_plus))
+ else:
+ if None not in (minus,plus): #PDS
+ self.error_bar.draw(can, (x_pos, y_pos),
+ ar.y_pos(y - minus),
+ ar.y_pos(y + plus))
+
+ if self.tick_mark:
+ self.tick_mark.draw(can, x_pos, y_pos)
+ if self.data_label_format:
+ can.show(x_pos + self.data_label_offset[0],
+ y_pos + self.data_label_offset[1],
+ "/hC" + pychart_util.apply_format(self.data_label_format, (x, y), 1))
+
+ can.endclip()
+
+def init():
+ global line_style_itr
+ line_styles = object_set.T()
+ for org_style in line_style.standards.list():
+ style = line_style.T(width = default_width, color = org_style.color,
+ dash = org_style.dash)
+ line_styles.add(style)
+
+ line_style_itr = line_styles.iterate()
+
+theme.add_reinitialization_hook(init)
+