odoo/openerp/pychart/error_bar.py

161 lines
5.1 KiB
Python

# -*- coding: utf-8 -*-
#
# 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 chart_object
import fill_style
import types
import error_bar_doc
import object_set
from pychart_types import *
__doc__ = """Pychart offers several styles of error bars. Some of them
only displays the min/max confidence interval, while others can display
quartiles in addition to min/max."""
class T(chart_object.T):
keys = {}
##AUTOMATICALLY GENERATED
##END AUTOMATICALLY GENERATED
pass
# Two horizontal lines at min & max locations.
class error_bar1(T):
__doc__ = error_bar_doc.doc_1
keys = {"tic_len" : (UnitType, 10, "Length of the horizontal bars"),
"line_style": (line_style.T, line_style.default, "")
}
##AUTOMATICALLY GENERATED
##END AUTOMATICALLY GENERATED
def draw(self, can, loc, min, max, qmin = None, qmax = None):
x = loc[0]
y = min
can.line(self.line_style, x-self.tic_len/2.0, y, x+self.tic_len/2.0, y)
y = max
can.line(self.line_style, x-self.tic_len/2.0, y, x+self.tic_len/2.0, y)
class error_bar2(T):
__doc__ = error_bar_doc.doc_2
keys = {"tic_len" : (UnitType, 3,
"The length of the horizontal bars"),
"hline_style": (line_style.T, line_style.default,
"The style of the horizontal bars."),
"vline_style": (line_style.T, None,
"The style of the vertical bar.")
}
##AUTOMATICALLY GENERATED
##END AUTOMATICALLY GENERATED
def draw(self, can, loc, min, max, qmin = None, qmax = None):
vline_style = self.vline_style
if not vline_style:
vline_style = self.hline_style
x = loc[0]
y1 = min
can.line(self.hline_style, x-self.tic_len/2.0, y1, x+self.tic_len/2.0, y1)
y2 = max
can.line(self.hline_style, x-self.tic_len/2.0, y2, x+self.tic_len/2.0, y2)
can.line(vline_style, x, y1, x, y2)
class error_bar3(T):
# Tufte style
__doc__ = "This style is endorsed by the Tufte's books. " \
+ error_bar_doc.doc_3
keys = { "line_style": (line_style.T, line_style.default, "")
}
##AUTOMATICALLY GENERATED
##END AUTOMATICALLY GENERATED
def draw(self, can, loc, min, max, qmin, qmax):
x = loc[0]
can.line(self.line_style, x, min, x, qmin)
can.line(self.line_style, x, qmax, x, max)
class error_bar4(T):
__doc__ = error_bar_doc.doc_4
keys = { "line_style": (line_style.T, line_style.default, ""),
"fill_style": (fill_style.T, fill_style.gray70, ""),
"box_width": (UnitType, 4, ""),
"tic_len": (UnitType, 4, "")
}
##AUTOMATICALLY GENERATED
##END AUTOMATICALLY GENERATED
def draw(self, can, loc, min, max, qmin, qmax):
x = loc[0]
style = self.line_style
y1 = min
can.line(style, x-self.tic_len/2.0, y1, x+self.tic_len/2.0, y1)
y2 = max
can.line(style, x-self.tic_len/2.0, y2, x+self.tic_len/2.0, y2)
can.line(style, x, y1, x, y2)
can.rectangle(style, self.fill_style,
x-self.box_width/2.0, qmin,
x+self.box_width/2.0, qmax)
# vertical line
class error_bar5(T):
__doc__ = error_bar_doc.doc_5
keys = { "line_style": (line_style.T, line_style.default, "")
}
##AUTOMATICALLY GENERATED
##END AUTOMATICALLY GENERATED
def draw(self, can, loc, min, max, qmin = None, qmax = None):
x = loc[0]
y = loc[1]
min = (min - y) *1 + y
max = (max - y) *1+ y
can.line(self.line_style, x, min, x, max)
# a box
class error_bar6(T):
__doc__ = error_bar_doc.doc_6
keys = { "line_style": (line_style.T, line_style.default, ""),
"fill_style": (fill_style.T, fill_style.gray70, ""),
"center_line_style": (line_style.T, line_style.T(width=0.5), ""),
"box_width": (UnitType, 4, ""),
}
##AUTOMATICALLY GENERATED
##END AUTOMATICALLY GENERATED
def draw(self, can, loc, min, max, qmin = None, qmax = None):
x = loc[0]
y = loc[1]
can.rectangle(self.line_style, self.fill_style,
x - self.box_width / 2.0, min,
x + self.box_width / 2.0, max)
can.line(self.center_line_style,
x - self.box_width/2.0, (min+max)/2.0,
x + self.box_width/2.0, (min+max)/2.0)
bar1 = error_bar1()
bar2 = error_bar2()
bar3 = error_bar3()
bar4 = error_bar4()
bar5 = error_bar5()
bar6 = error_bar6()
standards = object_set.T(bar1, bar2, bar3, bar4, bar5, bar6)