char_draw.graph module
module that implements graphs of data rendered in a terminal window
# Copyright 2017 James P Goodwin a package to draw graphs of data in a terminal window """ module that implements graphs of data rendered in a terminal window """ import locale locale.setlocale(locale.LC_ALL,"") import curses import curses.ascii import sys import os import math from char_draw import canvas from char_draw import display_list from data_sources import data_table def float_range(start, stop, step): while start <= stop: yield float(start) start += step class GraphSeries(): """ wrapper for data series to be graphed """ def __init__(self,data_table,coordinate,color): """ constructor takes a data table and a coordinate to choose the column """ self.data = data_table self.column = coordinate self.color = color class Graph(display_list.DisplayList): """Graph base class for all graph types """ def __init__(self,data_table=None,x_values=None,y_values=None,y_unit="",parent=None,canvas=None,top=0,title=None): """ base constructor for all graph types constructor takes a data_table which contains values to be graphed, x_values is a column reference in the data table for the xaxis values, y_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on """ display_list.DisplayList.__init__(self,parent,None,canvas) self.colors = [] self.data = data_table self.x_values_name = x_values self.y_values_names = y_values self.y_unit = y_unit self.x_values = None self.y_values = [] self.top = top self.graph_title = title self.initialized = False def init(self): """ set internal state to default state """ if not self.initialized: if self.canvas: self.colors = [self.canvas.cyan, self.canvas.green, self.canvas.red, self.canvas.white] self.x_values = GraphSeries(self.data, self.x_values_name, self.canvas.green ) self.y_values = [GraphSeries(self.data, sy,self.colors[self.y_values_names.index(sy)%len(self.colors)]) for sy in self.y_values_names] self.data.listen(self.data_changed) def get_series_unit( self ): """ get the name of the units for the y axis """ return self.y_unit def get_series( self ): """ return list of GraphSeries objects that describe the data series to be graphed """ return self.y_values def get_xvalues( self ): """ return the series for the x-values """ return self.x_values def get_data(self): """ return reference to the data table """ return self.data def data_changed(self,data_table): """ listener that gets called if the data table is changed """ self.modified = True def refresh_data(self): """ force a refresh on the data backing this graph """ self.data.refresh() def render(self): """ override render to force initialization and layout""" if self.canvas: self.init() self.get_bbox() self.canvas.clear() display_list.DisplayList.render(self) def get_top_indexes(self): """ get the indexes of the self.top items in the series """ top_values = [] for series in self.y_values: column = series.data.get_column(series.column) for idx in range(column.size()): top_values.append((column.get(idx).get_float_value(),idx)) top_values.sort(reverse=True) top_indexes = [] for idx in range(self.top): top_indexes.append(top_values[idx][1]) return top_indexes def get_title( self ): """ return the title for this graph """ if self.graph_title: return self.graph_title else: return self.get_data().get_name() def is_top(self): """ are we justing just the self.top highest items """ return self.top > 0 class GraphElement( display_list.DisplayList ): """ base of all of the graph children """ def __init__(self, parent, x=0.0, y=0.0, width=0.0, height=0.0): display_list.DisplayList.__init__(self,parent) self.x = x self.y = y self.width = width self.height = height def get_location( self ): """ return the location of the graph element """ return (self.x,self.y) def get_size( self ): """ return the height and width of the graph element """ return (self.width, self.height) def set_location( self, location ): """ set the location of the graph element """ self.x,self.y = location self.modified = True def set_size( self, size ): """ set the size of the graph element """ self.width,self.height = size self.modified = True def get_bbox( self ): """ return the bounding box of this element if it has no children make it based on it's height and width """ ret = display_list.DisplayList.get_bbox(self) if not ret: ret = display_list.Bbox(self.x,self.y,self.x+self.width,self.y+self.height) return ret class GraphTitle(GraphElement): """ A title to be displayed on a graph """ def __init__(self,parent,text=None): GraphElement.__init__(self,parent) self.text = text self.add_child(display_list.Text(0,0,self.text,self.canvas.white)) def get_bbox(self): """ recompute and relayout the component and return it's bbox """ if self.modified: new_children = [] x,y = self.get_location() width,height = self.get_size() rows,cols = self.canvas.to_rowcol(width,height) r_height,r_width = self.canvas.from_rowcol(1,1) text = self.text.strip() while text and rows: if len(text) > cols: s_idx = cols while s_idx > 0: if text[s_idx] == ' ': break s_idx -= 1 if s_idx <= 0: s_idx = cols else: s_idx = cols new_children.append(display_list.Text(x,y,text[:s_idx],self.canvas.white|(curses.A_STANDOUT if self.is_focus() else curses.A_NORMAL))) rows -= 1 y += r_height text = text[s_idx:].lstrip() self.set_children(new_children) return GraphElement.get_bbox(self) class GraphLegend(GraphElement): """ A legend to be displayed on a graph """ def __init__(self,parent,listoftext=None): GraphElement.__init__(self,parent) self.series_labels = listoftext r_height,r_width = self.canvas.from_rowcol(1,1) x = 0 y = 0 for l in self.series_labels: self.add_child(display_list.Text(x,y,l,self.canvas.white)) y += r_height def get_bbox(self): """ recompute and relayout the component and return it's bbox """ if self.modified: new_children = [] x,y = self.get_location() width,height = self.get_size() rows,cols = self.canvas.to_rowcol(width-4,height) r_height,r_width = self.canvas.from_rowcol(1,1) for text,color in self.series_labels: new_children.append(display_list.Rect(x,y,x+1,y+1,color)) text = text.strip() while text and rows: if len(text) > cols: s_idx = cols while s_idx > 0: if text[s_idx] == ' ': break s_idx -= 1 if s_idx <= 0: s_idx = cols else: s_idx = cols new_children.append(display_list.Text(x+4,y,text[:s_idx],self.canvas.white)) rows -= 1 y += r_height text = text[s_idx:].lstrip() self.set_children(new_children) return GraphElement.get_bbox(self) class GraphXAxisTitle(GraphTitle): """ A title to be displayed on the x-axis """ def __init(self,parent,text): GraphTitle.__init__(self,parent,text) class GraphYAxisTitle(GraphTitle): """ A title to be displayed on the y-axis """ def __init(self,parent,text): GraphTitle.__init__(self,parent,text) class GraphXAxis(GraphElement): """ An X-axis to be displayed on a graph """ def __init__(self,parent, horizontal = True): GraphElement.__init__(self,parent) self.horizontal = horizontal self.range_min = -1 self.range_max = -1 self.sx = 0 self.dx = 0 self.values = [] self.add_child(display_list.PolyLine([],self.canvas.green)) def get_range( self ): """ return range_min, range_max, sx """ return (self.range_min,self.range_max, self.sx, self.dx) def get_values( self ): """ return vector of x (value,label) """ return self.values def get_bbox( self ): """ compute the bounding box """ if self.modified: new_children = [] x_values = self.parent.get_xvalues() column = x_values.data.get_column(x_values.column) type = None for c in data_table.ColumnIterator(column): if not type or type == data_table.blank_type: type = c.get_type() elif type != c.get_type(): type = 'mixed' self.range_min = -1 self.range_max = -1 self.sx = 0 self.dx = 0 self.values = [] if self.parent.is_top(): top_indexes = self.parent.get_top_indexes() if type in [data_table.blank_type,data_table.string_type, 'mixed']: if self.parent.is_top(): self.range_min = 0 self.range_max = len(top_indexes) ii = 0 for ix in top_indexes: c = column.get(ix) self.values.append((ii,str(c))) ii += 1 else: self.range_min = 0 self.range_max = column.size() ix = 0 for c in data_table.ColumnIterator(column): self.values.append((ix,str(c))) ix += 1 else: self.range_min = None self.range_max = None if self.parent.is_top(): for ix in top_indexes: c = column.get(ix) value = c.get_float_value() if self.range_min == None or value < self.range_min: self.range_min = value if self.range_max == None or value > self.range_max: self.range_max = value self.values.append((value,str(c))) else: for c in data_table.ColumnIterator(column): value = c.get_float_value() if self.range_min == None or value < self.range_min: self.range_min = value if self.range_max == None or value > self.range_max: self.range_max = value self.values.append((value,str(c))) if len(self.values) >= 2: extra_value = self.values[-1][0] + (self.values[-1][0] - self.values[-2][0]) self.values.append((extra_value," ")) if extra_value > self.range_max: self.range_max = extra_value r_height,r_width = self.canvas.from_rowcol(1,1) width,height = self.get_size() ox,oy = self.get_location() self.sx = width / max(1.0,(self.range_max-self.range_min)) x = ox y = oy new_children.append(display_list.Rect(x,y,x+width,y+height,self.canvas.black,fill=True)) points = [(x,y)] labels = [] prev_scaled_x = None total_dx = 0 prev_label = None for v,label in self.values: if label.endswith(".00"): label=label[:-3] force = False if prev_label: prev_parts = prev_label.split(' ') cur_parts = label.split(' ') new_label = '' no_match = False idx = 0 while idx < min(len(prev_parts),len(cur_parts)): if no_match or prev_parts[idx] != cur_parts[idx]: if idx == 0: force = True new_label += cur_parts[idx] + ' ' no_match = True idx += 1 while idx < len(cur_parts): new_label += cur_parts[idx] + ' ' idx += 1 prev_label = label label = new_label else: prev_label = label scaled_x = (v-self.range_min)*self.sx if prev_scaled_x != None: total_dx += (scaled_x - prev_scaled_x) prev_scaled_x = scaled_x t_x,t_y = self.canvas.round_text_position(ox+scaled_x,y+1) if t_x >= x or force: points.append((t_x,y)) points.append((t_x,t_y)) points.append((t_x,y)) labels.append((t_x,t_y,label)) l_height,l_width = self.canvas.from_rowcol(1,len(label)+1) x = t_x + l_width if points[-1][0] < ox+width: points.append((ox+width,y)) self.dx = total_dx / len(self.values) new_children.append(display_list.PolyLine(points,self.canvas.green)) for x,y,label in labels: new_children.append(display_list.Text(x,y,label,self.canvas.green)) self.set_children(new_children) return GraphElement.get_bbox(self) class GraphYAxis(GraphElement): """ An X-axis to be displayed on a graph """ def __init__(self,parent,vertical = True): GraphElement.__init__(self,parent) self.vertical = vertical self.add_child(display_list.PolyLine([],self.canvas.green)) self.range_min = -1 self.range_max = -1 self.sy = 0 def get_range( self ): """ return range_min, range_max, sy """ return (self.range_min,self.range_max, self.sy) def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] y_values = self.parent.get_series() self.range_min = -1 self.range_max = -1 self.dy = 0 if self.parent.is_top(): top_indexes = self.parent.get_top_indexes() for series in y_values: column = series.data.get_column(series.column) for idx in top_indexes: c = column.get(idx) value = c.get_float_value() if self.range_min < 0 or value < self.range_min: self.range_min = value if self.range_max < 0 or value > self.range_max: self.range_max = value else: for series in y_values: column = series.data.get_column(series.column) for c in data_table.ColumnIterator(column): value = c.get_float_value() if self.range_min < 0 or value < self.range_min: self.range_min = value if self.range_max < 0 or value > self.range_max: self.range_max = value if self.range_min <= 0: self.range_min = 0 if self.range_max <= 0: self.range_max = 1 tick_size = max(1.0,(self.range_max-self.range_min))/5 if tick_size > 1: tick_size = round(tick_size) self.range_max += tick_size r_height,r_width = self.canvas.from_rowcol(1,1) width,height = self.get_size() ox,oy = self.get_location() new_children.append(display_list.Rect(ox,oy,ox+width,oy+height,self.canvas.black,fill=True)) oy += height ox += (width- 1) self.sy = height / max(1.0,(self.range_max-self.range_min)) x = ox y = oy points = [(x,y)] labels = [] for data_y in float_range(self.range_min,self.range_max,tick_size): scaled_y = (data_y-self.range_min)*self.sy label = data_table.format_float(float(data_y)) if label.endswith(".00"): label=label[:-3] t_x,t_y = self.canvas.round_text_position(x-3,oy-scaled_y) if t_y <= y: l_height,l_width = self.canvas.from_rowcol(1,len(label)+1) points.append((x,t_y)) points.append((t_x,t_y)) points.append((x,t_y)) labels.append((t_x-l_width,t_y-(l_height/2),label)) y = t_y-l_height if points[-1][1] > oy-height: points.append((x,oy-height)) new_children.append(display_list.PolyLine(points,self.canvas.green)) for x,y,label in labels: new_children.append(display_list.Text(x,y,label,self.canvas.green)) self.set_children(new_children) return GraphElement.get_bbox(self) class GraphArea(GraphElement): """ The area behind the graph series to be displayed on a graph """ def __init__(self,parent): GraphElement.__init__(self,parent) self.add_child(display_list.Rect(0,0,0,0,self.canvas.white)) def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] x,y = self.get_location() width,height = self.get_size() new_children.append(display_list.Rect(x,y,x+width,y+height,self.canvas.black,fill=True)) self.set_children(new_children) return GraphElement.get_bbox(self) class GraphBars(GraphElement): """ A bar chart plot of a graph series to be displayed on a graph """ def __init__(self,parent,series,x_axis,y_axis): self.series = series self.x_axis = x_axis self.y_axis = y_axis GraphElement.__init__(self,parent) def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] if self.x_axis.modified: self.x_axis.get_bbox() if self.y_axis.modified: self.y_axis.get_bbox() x_min,x_max,x_scale,x_dx = self.x_axis.get_range() y_min,y_max,y_scale = self.y_axis.get_range() x_values = self.x_axis.get_values() x,y = self.get_location() width,height = self.get_size() y = y+height n_series = len(self.parent.get_series()) i_series = self.parent.get_series().index(self.series) bar_width = max(1.0,(x_dx / n_series)) series_x_offset = (n_series - (i_series+1)) * bar_width x += series_x_offset if self.parent.is_top(): top_indexes = self.parent.get_top_indexes() column = self.series.data.get_column(self.series.column) idx = 0 for c in data_table.ColumnIterator(column): if not self.parent.is_top() or idx in top_indexes: y_value = c.get_float_value() if self.parent.is_top(): x_value = x_values[top_indexes.index(idx)][0] else: x_value = x_values[idx][0] scaled_x = (x_value-x_min)*x_scale scaled_y = (y_value-y_min)*y_scale new_children.append(display_list.Rect(x+scaled_x-(bar_width/2),y,min(x+scaled_x+(bar_width/2),x+width),y-scaled_y,self.series.color,True)) idx += 1 self.set_children(new_children) return GraphElement.get_bbox(self) class GraphLines(GraphElement): """ A line chart plot of a graph series to be displayed on a graph """ def __init__(self,parent,series,x_axis,y_axis,area=False): self.series = series self.x_axis = x_axis self.y_axis = y_axis self.area = area GraphElement.__init__(self,parent) def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] if self.x_axis.modified: self.x_axis.get_bbox() if self.y_axis.modified: self.y_axis.get_bbox() x_min,x_max,x_scale,x_dx = self.x_axis.get_range() y_min,y_max,y_scale = self.y_axis.get_range() x_values = self.x_axis.get_values() x,y = self.get_location() width,height = self.get_size() y = y+height column = self.series.data.get_column(self.series.column) idx = 0 points = [] for c in data_table.ColumnIterator(column): y_value = c.get_float_value() if idx < len(x_values): x_value = x_values[idx][0] scaled_x = (x_value-x_min)*x_scale scaled_y = (y_value-y_min)*y_scale points.append((x+scaled_x,y-scaled_y)) idx += 1 else: break if self.area: p1 = (points[-1][0],y) if p1 not in points: points.append(p1) p2 = (x,y) if p2 not in points: points.append(p2) new_children.append(display_list.Polygon(points,self.series.color,True)) else: new_children.append(display_list.PolyLine(points,self.series.color)) self.set_children(new_children) return GraphElement.get_bbox(self) class BarGraph(Graph): """BarGraph that displays a data table as a bar graph""" def __init__(self,data_table=None,x_values=None,y_values=None,y_unit="",parent=None,canvas=None,top=0,title=None): """ constructor takes a data_table which contains values to be graphed, x_values is a column reference in the data table for the xaxis values, y_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on """ Graph.__init__(self,data_table,x_values,y_values,y_unit,parent,canvas,top,title=title) self.title = None self.legend = None self.x_axis_title = None self.y_axis_title = None self.x_axis = None self.y_axis = None self.chart_area = None self.chart_series = [] if self.canvas: self.init() def init(self): """ create the children for all of the graph components """ if not self.initialized: Graph.init(self) self.title = GraphTitle(self,self.get_title()) self.legend = GraphLegend(self,[(s.column,s.color) for s in self.get_series()]) self.x_axis_title = GraphXAxisTitle(self,self.get_xvalues().column) self.y_axis_title = GraphYAxisTitle(self,self.get_series_unit()) self.x_axis = GraphXAxis(self, horizontal = True ) self.y_axis = GraphYAxis(self, vertical = True ) self.chart_area = GraphArea(self) self.chart_series = [GraphBars(self,series,self.x_axis,self.y_axis) for series in self.get_series()] self.add_child(self.title) self.add_child(self.legend) self.add_child(self.x_axis_title) self.add_child(self.y_axis_title) self.add_child(self.chart_area) for cs in self.chart_series: self.add_child(cs) self.add_child(self.x_axis) self.add_child(self.y_axis) self.initialized = True def set_focus( self, state ): """ set focus to this graph, in this case tell the title about it so it will highlight """ if self.title: self.title.set_focus(state) Graph.set_focus(self,state) def get_bbox(self): """ arrange the children of the graph based on size of graph """ if self.modified: min_x,min_y,max_x,max_y = self.bounds() width = (max_x-min_x) - 4 height = (max_y-min_y) - 4 x = 2 y = 2 self.title.set_location((x,y)) self.title.set_size((width,height*0.10)) y = y + height*0.10 self.legend.set_location((x,y)) self.legend.set_size((width,height*0.10)) y = y + height*0.10 self.y_axis_title.set_location((x,y+height*0.35)) self.y_axis_title.set_size((width*0.05,height*0.35)) self.y_axis.set_location((x+(width*0.05),y)) self.y_axis.set_size((width*0.05,height*0.70)) self.x_axis.set_location((x+(width*0.10),y+height*0.70)) self.x_axis.set_size((width*0.80,height*0.07)) ya_x,ya_y = self.y_axis.get_location() ya_w,ya_h = self.y_axis.get_size() xa_x,xa_y = self.x_axis.get_location() xa_w,xa_h = self.x_axis.get_size() self.chart_area.set_location((ya_x+ya_w,ya_y)) self.chart_area.set_size((xa_w,ya_h)) for cs in self.chart_series: cs.set_location((ya_x+ya_w+1,ya_y)) cs.set_size((xa_w,ya_h)) self.x_axis_title.set_location((xa_x,xa_y+xa_h)) self.x_axis_title.set_size((xa_w,xa_h)) return Graph.get_bbox(self) class LineGraph(Graph): """LineGraph that displays a data table as a line graph""" def __init__(self,data_table=None,x_values=None,y_values=None,y_unit="",parent=None,canvas=None,area=False,title=None): """ constructor takes a data_table which contains values to be graphed, x_values is a column reference in the data table for the xaxis values, y_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on """ Graph.__init__(self,data_table,x_values,y_values,y_unit,parent,canvas,title=title) self.title = None self.legend = None self.x_axis_title = None self.y_axis_title = None self.x_axis = None self.y_axis = None self.chart_area = None self.chart_series = [] self.area = area if self.canvas: self.init() def init(self): """ create the children for all of the graph components """ if not self.initialized: Graph.init(self) self.title = GraphTitle(self,self.get_title()) self.legend = GraphLegend(self,[(s.column,s.color) for s in self.get_series()]) self.x_axis_title = GraphXAxisTitle(self,self.get_xvalues().column) self.y_axis_title = GraphYAxisTitle(self,self.get_series_unit()) self.x_axis = GraphXAxis(self, horizontal = True ) self.y_axis = GraphYAxis(self, vertical = True ) self.chart_area = GraphArea(self) self.chart_series = [GraphLines(self,series,self.x_axis,self.y_axis,area=self.area) for series in self.get_series()] self.add_child(self.title) self.add_child(self.legend) self.add_child(self.x_axis_title) self.add_child(self.y_axis_title) self.add_child(self.chart_area) for cs in self.chart_series: self.add_child(cs) self.add_child(self.x_axis) self.add_child(self.y_axis) self.initialized = True def set_focus( self, state ): """ set focus to this graph, in this case tell the title about it so it will highlight """ if self.title: self.title.set_focus(state) Graph.set_focus(self,state) def get_bbox(self): """ arrange the children of the graph based on size of graph """ if self.modified: min_x,min_y,max_x,max_y = self.bounds() width = (max_x-min_x) - 4 height = (max_y-min_y) - 4 x = 2 y = 2 self.title.set_location((x,y)) self.title.set_size((width,height*0.10)) y = y + height*0.10 self.legend.set_location((x,y)) self.legend.set_size((width,height*0.10)) y = y + height*0.10 self.y_axis_title.set_location((x,y+height*0.35)) self.y_axis_title.set_size((width*0.05,height*0.35)) self.y_axis.set_location((x+(width*0.05),y)) self.y_axis.set_size((width*0.05,height*0.70)) self.x_axis.set_location((x+(width*0.10),y+(height*0.70)+1.0)) self.x_axis.set_size((width*0.80,height*0.07)) ya_bbox = self.y_axis.get_bbox() yat_bbox = self.y_axis_title.get_bbox() if ya_bbox.x0 < yat_bbox.x1: self.y_axis.set_location((self.canvas.round_text_x_position(yat_bbox.x1),ya_bbox.y0)) self.y_axis.set_size(((ya_bbox.x1-ya_bbox.x0),height*0.70)) ya_x,ya_y = self.y_axis.get_location() ya_w,ya_h = self.y_axis.get_size() xa_x,xa_y = self.x_axis.get_location() xa_w,xa_h = self.x_axis.get_size() self.x_axis.set_location((ya_x+ya_w,ya_y+ya_h)) self.x_axis.set_size((xa_w - ((ya_x+ya_w)-xa_x),xa_h)) xa_x,xa_y = self.x_axis.get_location() xa_w,xa_h = self.x_axis.get_size() self.chart_area.set_location((ya_x+ya_w,ya_y)) self.chart_area.set_size((xa_w,ya_h)) for cs in self.chart_series: cs.set_location((ya_x+ya_w+1,ya_y)) cs.set_size((xa_w,ya_h)) self.x_axis_title.set_location((xa_x,xa_y+xa_h)) self.x_axis_title.set_size((xa_w,xa_h)) return Graph.get_bbox(self) class GraphSlices(GraphElement): """ A pie chart plot of a graph series to be displayed on a graph """ def __init__(self,parent,series): self.series = series GraphElement.__init__(self,parent) self.label_positions = [] self.angle = 0 def get_bbox(self): """ compute the bounding box """ if self.modified: label_series = self.parent.get_xvalues() label_column = label_series.data.get_column(label_series.column) data_column = self.series.data.get_column(self.series.column) x,y = self.get_location() width,height = self.get_size() data_idxs = [] data_total = 0 for idx in range(0,data_column.size()): cell = data_column.get(idx) value = cell.get_float_value() data_total += value data_idxs.append((value,idx,str(label_column.get(idx)))) data_idxs.sort(reverse=True) if data_total > 0: total_included = 0 for idx in range(0,len(data_idxs)): if data_idxs[idx][0]/data_total < 0.02: remaining = len(data_idxs) - idx remaining_idx = data_idxs[idx][1] data_idxs = data_idxs[:idx] data_idxs.append((data_total-total_included,remaining_idx,"%d < 2%%"%(remaining))) break else: total_included += data_idxs[idx][0] total_degrees = 0 self.set_children([]) label_children = [] lcx = x lcy = y l_height,l_width = self.canvas.from_rowcol(1,11) px = x+l_width pw = width - l_width py = y+l_height ph = height - (l_height*2) for idx in range(0,len(data_idxs)): data_percent = (data_idxs[idx][0]/data_total) data_degrees = round(360.0 * data_percent ) slice_color = curses.color_pair(self.canvas.color_min+(30+(idx*11)%((self.canvas.color_max-30)-self.canvas.color_min))) arc = display_list.Arc(px+pw/2, py+ph/2, min(ph,pw)/2, total_degrees, total_degrees+data_degrees, slice_color, True) self.add_child(arc) label = "(%.0f%%) %s"%(data_percent*100.00, data_idxs[idx][2][:11]) if lcy < y + height: label_children.append(display_list.Text(lcx,lcy,label,slice_color)) lcy += l_height total_degrees += data_degrees title = self.series.column l_height,l_width = self.canvas.from_rowcol(1,len(title)) lcx = x+width/2 - l_width/2 lcy = y+height-l_height label_children.append(display_list.Text(lcx,lcy,title,label_series.color)) for lc in label_children: self.add_child(lc) return GraphElement.get_bbox(self) class PieGraph(Graph): """PieGraph that displays a data table as a pie chart""" def __init__(self,data_table=None,pie_labels=None,slice_values=None,parent=None,canvas=None,title=None): """ constructor takes a data_table which contains values to be graphed, pie_labels is a column reference in the data table for the pie slice labels, slice_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on """ Graph.__init__(self,data_table,pie_labels,slice_values,"",parent,canvas,title=title) self.title = None self.chart_area = None self.chart_series = [] if self.canvas: self.init() def init(self): """ create the children for all of the graph components """ if not self.initialized: Graph.init(self) self.title = GraphTitle(self,self.get_title()) self.chart_area = GraphArea(self) self.chart_series = [GraphSlices(self,series) for series in self.get_series()] self.add_child(self.title) self.add_child(self.chart_area) for cs in self.chart_series: self.add_child(cs) self.initialized = True def set_focus( self, state ): """ set focus to this graph, in this case tell the title about it so it will highlight """ if self.title: self.title.set_focus(state) Graph.set_focus(self,state) def get_bbox(self): """ arrange the children of the graph based on size of graph """ if self.modified: min_x,min_y,max_x,max_y = self.bounds() width = (max_x-min_x) - 4 height = (max_y-min_y) - 4 x = 2 y = 2 self.title.set_location((x,y)) self.title.set_size((width,height*0.10)) y = y + height*0.15 self.chart_area.set_location((x,y)) self.chart_area.set_size((width,height*0.80)) n_series = len(self.chart_series) if n_series > 1: split = 1 while split*split < n_series: split += 1 sx = width / split sy = (height*0.80) / split ix = 0 gx = x gy = y for cs in self.chart_series: cs.set_location((gx,gy)) cs.set_size((sx,sy)) ix += 1 if ix == split: ix = 0 gx = x gy += sy else: gx += sx else: for cs in self.chart_series: cs.set_location((x,y)) cs.set_size((width,height*0.80)) return Graph.get_bbox(self) class GraphTable(GraphElement): """ Element that lays out a table of text for the series """ def __init__(self,parent): GraphElement.__init__(self,parent) def get_bbox(self): """ recompute and relayout the component and return it's bbox """ if self.modified: new_children = [] x,y = self.get_location() width,height = self.get_size() row_labels = self.parent.get_xvalues() columns = self.parent.get_series() n_columns = len(columns)+1 cw = width / n_columns ch = height rows,cols = self.canvas.to_rowcol(width,height) r_height,r_nothing = self.canvas.from_rowcol(1,1) col_width = cols // n_columns rlc = row_labels.data.get_column(row_labels.column) def pad( s, width ): if len(s) < width: return s+' '*(width-len(s)) else: return s new_children.append(display_list.Text(x,y,pad(row_labels.column[0:col_width],col_width),self.canvas.white|curses.A_STANDOUT)) for idx in range(len(columns)): new_children.append(display_list.Text(x+cw+idx*cw,y,pad(columns[idx].column[0:col_width],col_width),self.canvas.white|curses.A_STANDOUT)) for ridx in range(min(rows-1,rlc.size())): y += r_height new_children.append(display_list.Text(x,y,pad(str(rlc.get(ridx))[0:col_width],col_width),self.canvas.white)) for cidx in range(len(columns)): column = columns[cidx].data.get_column(columns[cidx].column) new_children.append(display_list.Text(x+cw+cidx*cw,y,pad(str(column.get(ridx))[0:col_width],col_width),self.canvas.white)) self.set_children(new_children) return GraphElement.get_bbox(self) class TableGraph(Graph): """TableGraph that displays a data table as a formatted table""" def __init__(self,data_table=None,row_labels=None,column_values=None,parent=None,canvas=None,title=None): """ constructor takes a data_table which contains values to be graphed, row_labels is a column reference in the data table for the table row labels, column_values is a list of column references to series of numerical or text data to be displayed in the table, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on """ Graph.__init__(self,data_table,row_labels,column_values,"",parent,canvas,title=title) self.title = None self.chart_area = None self.graph_table = None if self.canvas: self.init() def init(self): """ create the children for all of the graph components """ if not self.initialized: Graph.init(self) self.title = GraphTitle(self,self.get_title()) self.chart_area = GraphArea(self) self.graph_table = GraphTable(self) self.add_child(self.title) self.add_child(self.chart_area) self.add_child(self.graph_table) self.initialized = True def set_focus( self, state ): """ set focus to this graph, in this case tell the title about it so it will highlight """ if self.title: self.title.set_focus(state) Graph.set_focus(self,state) def get_bbox(self): """ arrange the children of the graph based on size of graph """ if self.modified: min_x,min_y,max_x,max_y = self.bounds() width = (max_x-min_x) - 4 height = (max_y-min_y) - 4 x = 2 y = 2 self.title.set_location((x,y)) self.title.set_size((width,height*0.10)) y = y + height*0.15 self.chart_area.set_location((x,y)) self.chart_area.set_size((width,height*0.80)) self.graph_table.set_location((x,y)) self.graph_table.set_size((width,height*0.80)) return Graph.get_bbox(self)
Functions
def float_range(
start, stop, step)
def float_range(start, stop, step): while start <= stop: yield float(start) start += step
Classes
class BarGraph
BarGraph that displays a data table as a bar graph
class BarGraph(Graph): """BarGraph that displays a data table as a bar graph""" def __init__(self,data_table=None,x_values=None,y_values=None,y_unit="",parent=None,canvas=None,top=0,title=None): """ constructor takes a data_table which contains values to be graphed, x_values is a column reference in the data table for the xaxis values, y_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on """ Graph.__init__(self,data_table,x_values,y_values,y_unit,parent,canvas,top,title=title) self.title = None self.legend = None self.x_axis_title = None self.y_axis_title = None self.x_axis = None self.y_axis = None self.chart_area = None self.chart_series = [] if self.canvas: self.init() def init(self): """ create the children for all of the graph components """ if not self.initialized: Graph.init(self) self.title = GraphTitle(self,self.get_title()) self.legend = GraphLegend(self,[(s.column,s.color) for s in self.get_series()]) self.x_axis_title = GraphXAxisTitle(self,self.get_xvalues().column) self.y_axis_title = GraphYAxisTitle(self,self.get_series_unit()) self.x_axis = GraphXAxis(self, horizontal = True ) self.y_axis = GraphYAxis(self, vertical = True ) self.chart_area = GraphArea(self) self.chart_series = [GraphBars(self,series,self.x_axis,self.y_axis) for series in self.get_series()] self.add_child(self.title) self.add_child(self.legend) self.add_child(self.x_axis_title) self.add_child(self.y_axis_title) self.add_child(self.chart_area) for cs in self.chart_series: self.add_child(cs) self.add_child(self.x_axis) self.add_child(self.y_axis) self.initialized = True def set_focus( self, state ): """ set focus to this graph, in this case tell the title about it so it will highlight """ if self.title: self.title.set_focus(state) Graph.set_focus(self,state) def get_bbox(self): """ arrange the children of the graph based on size of graph """ if self.modified: min_x,min_y,max_x,max_y = self.bounds() width = (max_x-min_x) - 4 height = (max_y-min_y) - 4 x = 2 y = 2 self.title.set_location((x,y)) self.title.set_size((width,height*0.10)) y = y + height*0.10 self.legend.set_location((x,y)) self.legend.set_size((width,height*0.10)) y = y + height*0.10 self.y_axis_title.set_location((x,y+height*0.35)) self.y_axis_title.set_size((width*0.05,height*0.35)) self.y_axis.set_location((x+(width*0.05),y)) self.y_axis.set_size((width*0.05,height*0.70)) self.x_axis.set_location((x+(width*0.10),y+height*0.70)) self.x_axis.set_size((width*0.80,height*0.07)) ya_x,ya_y = self.y_axis.get_location() ya_w,ya_h = self.y_axis.get_size() xa_x,xa_y = self.x_axis.get_location() xa_w,xa_h = self.x_axis.get_size() self.chart_area.set_location((ya_x+ya_w,ya_y)) self.chart_area.set_size((xa_w,ya_h)) for cs in self.chart_series: cs.set_location((ya_x+ya_w+1,ya_y)) cs.set_size((xa_w,ya_h)) self.x_axis_title.set_location((xa_x,xa_y+xa_h)) self.x_axis_title.set_size((xa_w,xa_h)) return Graph.get_bbox(self)
Ancestors (in MRO)
Static methods
def __init__(
self, data_table=None, x_values=None, y_values=None, y_unit='', parent=None, canvas=None, top=0, title=None)
constructor takes a data_table which contains values to be graphed, x_values is a column reference in the data table for the xaxis values, y_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on
def __init__(self,data_table=None,x_values=None,y_values=None,y_unit="",parent=None,canvas=None,top=0,title=None): """ constructor takes a data_table which contains values to be graphed, x_values is a column reference in the data table for the xaxis values, y_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on """ Graph.__init__(self,data_table,x_values,y_values,y_unit,parent,canvas,top,title=title) self.title = None self.legend = None self.x_axis_title = None self.y_axis_title = None self.x_axis = None self.y_axis = None self.chart_area = None self.chart_series = [] if self.canvas: self.init()
def add_child(
self, child)
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def data_changed(
self, data_table)
listener that gets called if the data table is changed
def data_changed(self,data_table): """ listener that gets called if the data table is changed """ self.modified = True
def get_bbox(
self)
arrange the children of the graph based on size of graph
def get_bbox(self): """ arrange the children of the graph based on size of graph """ if self.modified: min_x,min_y,max_x,max_y = self.bounds() width = (max_x-min_x) - 4 height = (max_y-min_y) - 4 x = 2 y = 2 self.title.set_location((x,y)) self.title.set_size((width,height*0.10)) y = y + height*0.10 self.legend.set_location((x,y)) self.legend.set_size((width,height*0.10)) y = y + height*0.10 self.y_axis_title.set_location((x,y+height*0.35)) self.y_axis_title.set_size((width*0.05,height*0.35)) self.y_axis.set_location((x+(width*0.05),y)) self.y_axis.set_size((width*0.05,height*0.70)) self.x_axis.set_location((x+(width*0.10),y+height*0.70)) self.x_axis.set_size((width*0.80,height*0.07)) ya_x,ya_y = self.y_axis.get_location() ya_w,ya_h = self.y_axis.get_size() xa_x,xa_y = self.x_axis.get_location() xa_w,xa_h = self.x_axis.get_size() self.chart_area.set_location((ya_x+ya_w,ya_y)) self.chart_area.set_size((xa_w,ya_h)) for cs in self.chart_series: cs.set_location((ya_x+ya_w+1,ya_y)) cs.set_size((xa_w,ya_h)) self.x_axis_title.set_location((xa_x,xa_y+xa_h)) self.x_axis_title.set_size((xa_w,xa_h)) return Graph.get_bbox(self)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_data(
self)
return reference to the data table
def get_data(self): """ return reference to the data table """ return self.data
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_series(
self)
return list of GraphSeries objects that describe the data series to be graphed
def get_series( self ): """ return list of GraphSeries objects that describe the data series to be graphed """ return self.y_values
def get_series_unit(
self)
get the name of the units for the y axis
def get_series_unit( self ): """ get the name of the units for the y axis """ return self.y_unit
def get_title(
self)
return the title for this graph
def get_title( self ): """ return the title for this graph """ if self.graph_title: return self.graph_title else: return self.get_data().get_name()
def get_top_indexes(
self)
get the indexes of the self.top items in the series
def get_top_indexes(self): """ get the indexes of the self.top items in the series """ top_values = [] for series in self.y_values: column = series.data.get_column(series.column) for idx in range(column.size()): top_values.append((column.get(idx).get_float_value(),idx)) top_values.sort(reverse=True) top_indexes = [] for idx in range(self.top): top_indexes.append(top_values[idx][1]) return top_indexes
def get_xvalues(
self)
return the series for the x-values
def get_xvalues( self ): """ return the series for the x-values """ return self.x_values
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def init(
self)
create the children for all of the graph components
def init(self): """ create the children for all of the graph components """ if not self.initialized: Graph.init(self) self.title = GraphTitle(self,self.get_title()) self.legend = GraphLegend(self,[(s.column,s.color) for s in self.get_series()]) self.x_axis_title = GraphXAxisTitle(self,self.get_xvalues().column) self.y_axis_title = GraphYAxisTitle(self,self.get_series_unit()) self.x_axis = GraphXAxis(self, horizontal = True ) self.y_axis = GraphYAxis(self, vertical = True ) self.chart_area = GraphArea(self) self.chart_series = [GraphBars(self,series,self.x_axis,self.y_axis) for series in self.get_series()] self.add_child(self.title) self.add_child(self.legend) self.add_child(self.x_axis_title) self.add_child(self.y_axis_title) self.add_child(self.chart_area) for cs in self.chart_series: self.add_child(cs) self.add_child(self.x_axis) self.add_child(self.y_axis) self.initialized = True
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def is_top(
self)
are we justing just the self.top highest items
def is_top(self): """ are we justing just the self.top highest items """ return self.top > 0
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def refresh_data(
self)
force a refresh on the data backing this graph
def refresh_data(self): """ force a refresh on the data backing this graph """ self.data.refresh()
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
override render to force initialization and layout
def render(self): """ override render to force initialization and layout""" if self.canvas: self.init() self.get_bbox() self.canvas.clear() display_list.DisplayList.render(self)
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to this graph, in this case tell the title about it so it will highlight
def set_focus( self, state ): """ set focus to this graph, in this case tell the title about it so it will highlight """ if self.title: self.title.set_focus(state) Graph.set_focus(self,state)
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
Instance variables
var chart_area
var chart_series
var legend
var title
var x_axis
var x_axis_title
var y_axis
var y_axis_title
class Graph
Graph base class for all graph types
class Graph(display_list.DisplayList): """Graph base class for all graph types """ def __init__(self,data_table=None,x_values=None,y_values=None,y_unit="",parent=None,canvas=None,top=0,title=None): """ base constructor for all graph types constructor takes a data_table which contains values to be graphed, x_values is a column reference in the data table for the xaxis values, y_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on """ display_list.DisplayList.__init__(self,parent,None,canvas) self.colors = [] self.data = data_table self.x_values_name = x_values self.y_values_names = y_values self.y_unit = y_unit self.x_values = None self.y_values = [] self.top = top self.graph_title = title self.initialized = False def init(self): """ set internal state to default state """ if not self.initialized: if self.canvas: self.colors = [self.canvas.cyan, self.canvas.green, self.canvas.red, self.canvas.white] self.x_values = GraphSeries(self.data, self.x_values_name, self.canvas.green ) self.y_values = [GraphSeries(self.data, sy,self.colors[self.y_values_names.index(sy)%len(self.colors)]) for sy in self.y_values_names] self.data.listen(self.data_changed) def get_series_unit( self ): """ get the name of the units for the y axis """ return self.y_unit def get_series( self ): """ return list of GraphSeries objects that describe the data series to be graphed """ return self.y_values def get_xvalues( self ): """ return the series for the x-values """ return self.x_values def get_data(self): """ return reference to the data table """ return self.data def data_changed(self,data_table): """ listener that gets called if the data table is changed """ self.modified = True def refresh_data(self): """ force a refresh on the data backing this graph """ self.data.refresh() def render(self): """ override render to force initialization and layout""" if self.canvas: self.init() self.get_bbox() self.canvas.clear() display_list.DisplayList.render(self) def get_top_indexes(self): """ get the indexes of the self.top items in the series """ top_values = [] for series in self.y_values: column = series.data.get_column(series.column) for idx in range(column.size()): top_values.append((column.get(idx).get_float_value(),idx)) top_values.sort(reverse=True) top_indexes = [] for idx in range(self.top): top_indexes.append(top_values[idx][1]) return top_indexes def get_title( self ): """ return the title for this graph """ if self.graph_title: return self.graph_title else: return self.get_data().get_name() def is_top(self): """ are we justing just the self.top highest items """ return self.top > 0
Ancestors (in MRO)
- Graph
- char_draw.display_list.DisplayList
- builtins.object
Static methods
def __init__(
self, data_table=None, x_values=None, y_values=None, y_unit='', parent=None, canvas=None, top=0, title=None)
base constructor for all graph types constructor takes a data_table which contains values to be graphed, x_values is a column reference in the data table for the xaxis values, y_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on
def __init__(self,data_table=None,x_values=None,y_values=None,y_unit="",parent=None,canvas=None,top=0,title=None): """ base constructor for all graph types constructor takes a data_table which contains values to be graphed, x_values is a column reference in the data table for the xaxis values, y_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on """ display_list.DisplayList.__init__(self,parent,None,canvas) self.colors = [] self.data = data_table self.x_values_name = x_values self.y_values_names = y_values self.y_unit = y_unit self.x_values = None self.y_values = [] self.top = top self.graph_title = title self.initialized = False
def add_child(
self, child)
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def data_changed(
self, data_table)
listener that gets called if the data table is changed
def data_changed(self,data_table): """ listener that gets called if the data table is changed """ self.modified = True
def get_bbox(
self)
computes the bounding box of the display list object
def get_bbox(self): """ computes the bounding box of the display list object """ ret = self.bbox if self.modified: ret = self.bbox = None for c in self.children: if not ret: ret = c.get_bbox() else: ret = ret.union(c.get_bbox()) self.bbox = ret self.modified = False return (ret)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_data(
self)
return reference to the data table
def get_data(self): """ return reference to the data table """ return self.data
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_series(
self)
return list of GraphSeries objects that describe the data series to be graphed
def get_series( self ): """ return list of GraphSeries objects that describe the data series to be graphed """ return self.y_values
def get_series_unit(
self)
get the name of the units for the y axis
def get_series_unit( self ): """ get the name of the units for the y axis """ return self.y_unit
def get_title(
self)
return the title for this graph
def get_title( self ): """ return the title for this graph """ if self.graph_title: return self.graph_title else: return self.get_data().get_name()
def get_top_indexes(
self)
get the indexes of the self.top items in the series
def get_top_indexes(self): """ get the indexes of the self.top items in the series """ top_values = [] for series in self.y_values: column = series.data.get_column(series.column) for idx in range(column.size()): top_values.append((column.get(idx).get_float_value(),idx)) top_values.sort(reverse=True) top_indexes = [] for idx in range(self.top): top_indexes.append(top_values[idx][1]) return top_indexes
def get_xvalues(
self)
return the series for the x-values
def get_xvalues( self ): """ return the series for the x-values """ return self.x_values
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def init(
self)
set internal state to default state
def init(self): """ set internal state to default state """ if not self.initialized: if self.canvas: self.colors = [self.canvas.cyan, self.canvas.green, self.canvas.red, self.canvas.white] self.x_values = GraphSeries(self.data, self.x_values_name, self.canvas.green ) self.y_values = [GraphSeries(self.data, sy,self.colors[self.y_values_names.index(sy)%len(self.colors)]) for sy in self.y_values_names] self.data.listen(self.data_changed)
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def is_top(
self)
are we justing just the self.top highest items
def is_top(self): """ are we justing just the self.top highest items """ return self.top > 0
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def refresh_data(
self)
force a refresh on the data backing this graph
def refresh_data(self): """ force a refresh on the data backing this graph """ self.data.refresh()
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
override render to force initialization and layout
def render(self): """ override render to force initialization and layout""" if self.canvas: self.init() self.get_bbox() self.canvas.clear() display_list.DisplayList.render(self)
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to True or False to tell graph to render in focus mode
def set_focus( self, state ): """ set focus to True or False to tell graph to render in focus mode """ self.focus = state self.modified = True
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
Instance variables
var colors
var data
var graph_title
var initialized
var top
var x_values
var x_values_name
var y_unit
var y_values
var y_values_names
class GraphArea
The area behind the graph series to be displayed on a graph
class GraphArea(GraphElement): """ The area behind the graph series to be displayed on a graph """ def __init__(self,parent): GraphElement.__init__(self,parent) self.add_child(display_list.Rect(0,0,0,0,self.canvas.white)) def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] x,y = self.get_location() width,height = self.get_size() new_children.append(display_list.Rect(x,y,x+width,y+height,self.canvas.black,fill=True)) self.set_children(new_children) return GraphElement.get_bbox(self)
Ancestors (in MRO)
- GraphArea
- GraphElement
- char_draw.display_list.DisplayList
- builtins.object
Static methods
def __init__(
self, parent)
Inheritance:
GraphElement
.__init__
constructor, takes a parent object to be contained within and a list of children object to contain
def __init__(self,parent): GraphElement.__init__(self,parent) self.add_child(display_list.Rect(0,0,0,0,self.canvas.white))
def add_child(
self, child)
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def get_bbox(
self)
compute the bounding box
def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] x,y = self.get_location() width,height = self.get_size() new_children.append(display_list.Rect(x,y,x+width,y+height,self.canvas.black,fill=True)) self.set_children(new_children) return GraphElement.get_bbox(self)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_location(
self)
return the location of the graph element
def get_location( self ): """ return the location of the graph element """ return (self.x,self.y)
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_size(
self)
return the height and width of the graph element
def get_size( self ): """ return the height and width of the graph element """ return (self.width, self.height)
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
draw the object on the suppied canvas
def render(self): """ draw the object on the suppied canvas """ for c in self.children: c.render()
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to True or False to tell graph to render in focus mode
def set_focus( self, state ): """ set focus to True or False to tell graph to render in focus mode """ self.focus = state self.modified = True
def set_location(
self, location)
set the location of the graph element
def set_location( self, location ): """ set the location of the graph element """ self.x,self.y = location self.modified = True
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def set_size(
self, size)
set the size of the graph element
def set_size( self, size ): """ set the size of the graph element """ self.width,self.height = size self.modified = True
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
class GraphBars
A bar chart plot of a graph series to be displayed on a graph
class GraphBars(GraphElement): """ A bar chart plot of a graph series to be displayed on a graph """ def __init__(self,parent,series,x_axis,y_axis): self.series = series self.x_axis = x_axis self.y_axis = y_axis GraphElement.__init__(self,parent) def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] if self.x_axis.modified: self.x_axis.get_bbox() if self.y_axis.modified: self.y_axis.get_bbox() x_min,x_max,x_scale,x_dx = self.x_axis.get_range() y_min,y_max,y_scale = self.y_axis.get_range() x_values = self.x_axis.get_values() x,y = self.get_location() width,height = self.get_size() y = y+height n_series = len(self.parent.get_series()) i_series = self.parent.get_series().index(self.series) bar_width = max(1.0,(x_dx / n_series)) series_x_offset = (n_series - (i_series+1)) * bar_width x += series_x_offset if self.parent.is_top(): top_indexes = self.parent.get_top_indexes() column = self.series.data.get_column(self.series.column) idx = 0 for c in data_table.ColumnIterator(column): if not self.parent.is_top() or idx in top_indexes: y_value = c.get_float_value() if self.parent.is_top(): x_value = x_values[top_indexes.index(idx)][0] else: x_value = x_values[idx][0] scaled_x = (x_value-x_min)*x_scale scaled_y = (y_value-y_min)*y_scale new_children.append(display_list.Rect(x+scaled_x-(bar_width/2),y,min(x+scaled_x+(bar_width/2),x+width),y-scaled_y,self.series.color,True)) idx += 1 self.set_children(new_children) return GraphElement.get_bbox(self)
Ancestors (in MRO)
- GraphBars
- GraphElement
- char_draw.display_list.DisplayList
- builtins.object
Static methods
def __init__(
self, parent, series, x_axis, y_axis)
constructor, takes a parent object to be contained within and a list of children object to contain
def __init__(self,parent,series,x_axis,y_axis): self.series = series self.x_axis = x_axis self.y_axis = y_axis GraphElement.__init__(self,parent)
def add_child(
self, child)
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def get_bbox(
self)
compute the bounding box
def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] if self.x_axis.modified: self.x_axis.get_bbox() if self.y_axis.modified: self.y_axis.get_bbox() x_min,x_max,x_scale,x_dx = self.x_axis.get_range() y_min,y_max,y_scale = self.y_axis.get_range() x_values = self.x_axis.get_values() x,y = self.get_location() width,height = self.get_size() y = y+height n_series = len(self.parent.get_series()) i_series = self.parent.get_series().index(self.series) bar_width = max(1.0,(x_dx / n_series)) series_x_offset = (n_series - (i_series+1)) * bar_width x += series_x_offset if self.parent.is_top(): top_indexes = self.parent.get_top_indexes() column = self.series.data.get_column(self.series.column) idx = 0 for c in data_table.ColumnIterator(column): if not self.parent.is_top() or idx in top_indexes: y_value = c.get_float_value() if self.parent.is_top(): x_value = x_values[top_indexes.index(idx)][0] else: x_value = x_values[idx][0] scaled_x = (x_value-x_min)*x_scale scaled_y = (y_value-y_min)*y_scale new_children.append(display_list.Rect(x+scaled_x-(bar_width/2),y,min(x+scaled_x+(bar_width/2),x+width),y-scaled_y,self.series.color,True)) idx += 1 self.set_children(new_children) return GraphElement.get_bbox(self)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_location(
self)
return the location of the graph element
def get_location( self ): """ return the location of the graph element """ return (self.x,self.y)
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_size(
self)
return the height and width of the graph element
def get_size( self ): """ return the height and width of the graph element """ return (self.width, self.height)
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
draw the object on the suppied canvas
def render(self): """ draw the object on the suppied canvas """ for c in self.children: c.render()
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to True or False to tell graph to render in focus mode
def set_focus( self, state ): """ set focus to True or False to tell graph to render in focus mode """ self.focus = state self.modified = True
def set_location(
self, location)
set the location of the graph element
def set_location( self, location ): """ set the location of the graph element """ self.x,self.y = location self.modified = True
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def set_size(
self, size)
set the size of the graph element
def set_size( self, size ): """ set the size of the graph element """ self.width,self.height = size self.modified = True
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
Instance variables
var series
var x_axis
var y_axis
class GraphElement
base of all of the graph children
class GraphElement( display_list.DisplayList ): """ base of all of the graph children """ def __init__(self, parent, x=0.0, y=0.0, width=0.0, height=0.0): display_list.DisplayList.__init__(self,parent) self.x = x self.y = y self.width = width self.height = height def get_location( self ): """ return the location of the graph element """ return (self.x,self.y) def get_size( self ): """ return the height and width of the graph element """ return (self.width, self.height) def set_location( self, location ): """ set the location of the graph element """ self.x,self.y = location self.modified = True def set_size( self, size ): """ set the size of the graph element """ self.width,self.height = size self.modified = True def get_bbox( self ): """ return the bounding box of this element if it has no children make it based on it's height and width """ ret = display_list.DisplayList.get_bbox(self) if not ret: ret = display_list.Bbox(self.x,self.y,self.x+self.width,self.y+self.height) return ret
Ancestors (in MRO)
- GraphElement
- char_draw.display_list.DisplayList
- builtins.object
Static methods
def __init__(
self, parent, x=0.0, y=0.0, width=0.0, height=0.0)
constructor, takes a parent object to be contained within and a list of children object to contain
def __init__(self, parent, x=0.0, y=0.0, width=0.0, height=0.0): display_list.DisplayList.__init__(self,parent) self.x = x self.y = y self.width = width self.height = height
def add_child(
self, child)
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def get_bbox(
self)
return the bounding box of this element if it has no children make it based on it's height and width
def get_bbox( self ): """ return the bounding box of this element if it has no children make it based on it's height and width """ ret = display_list.DisplayList.get_bbox(self) if not ret: ret = display_list.Bbox(self.x,self.y,self.x+self.width,self.y+self.height) return ret
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_location(
self)
return the location of the graph element
def get_location( self ): """ return the location of the graph element """ return (self.x,self.y)
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_size(
self)
return the height and width of the graph element
def get_size( self ): """ return the height and width of the graph element """ return (self.width, self.height)
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
draw the object on the suppied canvas
def render(self): """ draw the object on the suppied canvas """ for c in self.children: c.render()
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to True or False to tell graph to render in focus mode
def set_focus( self, state ): """ set focus to True or False to tell graph to render in focus mode """ self.focus = state self.modified = True
def set_location(
self, location)
set the location of the graph element
def set_location( self, location ): """ set the location of the graph element """ self.x,self.y = location self.modified = True
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def set_size(
self, size)
set the size of the graph element
def set_size( self, size ): """ set the size of the graph element """ self.width,self.height = size self.modified = True
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
Instance variables
var height
var width
var x
var y
class GraphLegend
A legend to be displayed on a graph
class GraphLegend(GraphElement): """ A legend to be displayed on a graph """ def __init__(self,parent,listoftext=None): GraphElement.__init__(self,parent) self.series_labels = listoftext r_height,r_width = self.canvas.from_rowcol(1,1) x = 0 y = 0 for l in self.series_labels: self.add_child(display_list.Text(x,y,l,self.canvas.white)) y += r_height def get_bbox(self): """ recompute and relayout the component and return it's bbox """ if self.modified: new_children = [] x,y = self.get_location() width,height = self.get_size() rows,cols = self.canvas.to_rowcol(width-4,height) r_height,r_width = self.canvas.from_rowcol(1,1) for text,color in self.series_labels: new_children.append(display_list.Rect(x,y,x+1,y+1,color)) text = text.strip() while text and rows: if len(text) > cols: s_idx = cols while s_idx > 0: if text[s_idx] == ' ': break s_idx -= 1 if s_idx <= 0: s_idx = cols else: s_idx = cols new_children.append(display_list.Text(x+4,y,text[:s_idx],self.canvas.white)) rows -= 1 y += r_height text = text[s_idx:].lstrip() self.set_children(new_children) return GraphElement.get_bbox(self)
Ancestors (in MRO)
- GraphLegend
- GraphElement
- char_draw.display_list.DisplayList
- builtins.object
Static methods
def __init__(
self, parent, listoftext=None)
constructor, takes a parent object to be contained within and a list of children object to contain
def __init__(self,parent,listoftext=None): GraphElement.__init__(self,parent) self.series_labels = listoftext r_height,r_width = self.canvas.from_rowcol(1,1) x = 0 y = 0 for l in self.series_labels: self.add_child(display_list.Text(x,y,l,self.canvas.white)) y += r_height
def add_child(
self, child)
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def get_bbox(
self)
recompute and relayout the component and return it's bbox
def get_bbox(self): """ recompute and relayout the component and return it's bbox """ if self.modified: new_children = [] x,y = self.get_location() width,height = self.get_size() rows,cols = self.canvas.to_rowcol(width-4,height) r_height,r_width = self.canvas.from_rowcol(1,1) for text,color in self.series_labels: new_children.append(display_list.Rect(x,y,x+1,y+1,color)) text = text.strip() while text and rows: if len(text) > cols: s_idx = cols while s_idx > 0: if text[s_idx] == ' ': break s_idx -= 1 if s_idx <= 0: s_idx = cols else: s_idx = cols new_children.append(display_list.Text(x+4,y,text[:s_idx],self.canvas.white)) rows -= 1 y += r_height text = text[s_idx:].lstrip() self.set_children(new_children) return GraphElement.get_bbox(self)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_location(
self)
return the location of the graph element
def get_location( self ): """ return the location of the graph element """ return (self.x,self.y)
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_size(
self)
return the height and width of the graph element
def get_size( self ): """ return the height and width of the graph element """ return (self.width, self.height)
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
draw the object on the suppied canvas
def render(self): """ draw the object on the suppied canvas """ for c in self.children: c.render()
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to True or False to tell graph to render in focus mode
def set_focus( self, state ): """ set focus to True or False to tell graph to render in focus mode """ self.focus = state self.modified = True
def set_location(
self, location)
set the location of the graph element
def set_location( self, location ): """ set the location of the graph element """ self.x,self.y = location self.modified = True
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def set_size(
self, size)
set the size of the graph element
def set_size( self, size ): """ set the size of the graph element """ self.width,self.height = size self.modified = True
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
Instance variables
var series_labels
class GraphLines
A line chart plot of a graph series to be displayed on a graph
class GraphLines(GraphElement): """ A line chart plot of a graph series to be displayed on a graph """ def __init__(self,parent,series,x_axis,y_axis,area=False): self.series = series self.x_axis = x_axis self.y_axis = y_axis self.area = area GraphElement.__init__(self,parent) def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] if self.x_axis.modified: self.x_axis.get_bbox() if self.y_axis.modified: self.y_axis.get_bbox() x_min,x_max,x_scale,x_dx = self.x_axis.get_range() y_min,y_max,y_scale = self.y_axis.get_range() x_values = self.x_axis.get_values() x,y = self.get_location() width,height = self.get_size() y = y+height column = self.series.data.get_column(self.series.column) idx = 0 points = [] for c in data_table.ColumnIterator(column): y_value = c.get_float_value() if idx < len(x_values): x_value = x_values[idx][0] scaled_x = (x_value-x_min)*x_scale scaled_y = (y_value-y_min)*y_scale points.append((x+scaled_x,y-scaled_y)) idx += 1 else: break if self.area: p1 = (points[-1][0],y) if p1 not in points: points.append(p1) p2 = (x,y) if p2 not in points: points.append(p2) new_children.append(display_list.Polygon(points,self.series.color,True)) else: new_children.append(display_list.PolyLine(points,self.series.color)) self.set_children(new_children) return GraphElement.get_bbox(self)
Ancestors (in MRO)
- GraphLines
- GraphElement
- char_draw.display_list.DisplayList
- builtins.object
Static methods
def __init__(
self, parent, series, x_axis, y_axis, area=False)
constructor, takes a parent object to be contained within and a list of children object to contain
def __init__(self,parent,series,x_axis,y_axis,area=False): self.series = series self.x_axis = x_axis self.y_axis = y_axis self.area = area GraphElement.__init__(self,parent)
def add_child(
self, child)
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def get_bbox(
self)
compute the bounding box
def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] if self.x_axis.modified: self.x_axis.get_bbox() if self.y_axis.modified: self.y_axis.get_bbox() x_min,x_max,x_scale,x_dx = self.x_axis.get_range() y_min,y_max,y_scale = self.y_axis.get_range() x_values = self.x_axis.get_values() x,y = self.get_location() width,height = self.get_size() y = y+height column = self.series.data.get_column(self.series.column) idx = 0 points = [] for c in data_table.ColumnIterator(column): y_value = c.get_float_value() if idx < len(x_values): x_value = x_values[idx][0] scaled_x = (x_value-x_min)*x_scale scaled_y = (y_value-y_min)*y_scale points.append((x+scaled_x,y-scaled_y)) idx += 1 else: break if self.area: p1 = (points[-1][0],y) if p1 not in points: points.append(p1) p2 = (x,y) if p2 not in points: points.append(p2) new_children.append(display_list.Polygon(points,self.series.color,True)) else: new_children.append(display_list.PolyLine(points,self.series.color)) self.set_children(new_children) return GraphElement.get_bbox(self)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_location(
self)
return the location of the graph element
def get_location( self ): """ return the location of the graph element """ return (self.x,self.y)
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_size(
self)
return the height and width of the graph element
def get_size( self ): """ return the height and width of the graph element """ return (self.width, self.height)
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
draw the object on the suppied canvas
def render(self): """ draw the object on the suppied canvas """ for c in self.children: c.render()
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to True or False to tell graph to render in focus mode
def set_focus( self, state ): """ set focus to True or False to tell graph to render in focus mode """ self.focus = state self.modified = True
def set_location(
self, location)
set the location of the graph element
def set_location( self, location ): """ set the location of the graph element """ self.x,self.y = location self.modified = True
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def set_size(
self, size)
set the size of the graph element
def set_size( self, size ): """ set the size of the graph element """ self.width,self.height = size self.modified = True
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
Instance variables
var area
var series
var x_axis
var y_axis
class GraphSeries
wrapper for data series to be graphed
class GraphSeries(): """ wrapper for data series to be graphed """ def __init__(self,data_table,coordinate,color): """ constructor takes a data table and a coordinate to choose the column """ self.data = data_table self.column = coordinate self.color = color
Ancestors (in MRO)
- GraphSeries
- builtins.object
Static methods
def __init__(
self, data_table, coordinate, color)
constructor takes a data table and a coordinate to choose the column
def __init__(self,data_table,coordinate,color): """ constructor takes a data table and a coordinate to choose the column """ self.data = data_table self.column = coordinate self.color = color
Instance variables
var color
var column
var data
class GraphSlices
A pie chart plot of a graph series to be displayed on a graph
class GraphSlices(GraphElement): """ A pie chart plot of a graph series to be displayed on a graph """ def __init__(self,parent,series): self.series = series GraphElement.__init__(self,parent) self.label_positions = [] self.angle = 0 def get_bbox(self): """ compute the bounding box """ if self.modified: label_series = self.parent.get_xvalues() label_column = label_series.data.get_column(label_series.column) data_column = self.series.data.get_column(self.series.column) x,y = self.get_location() width,height = self.get_size() data_idxs = [] data_total = 0 for idx in range(0,data_column.size()): cell = data_column.get(idx) value = cell.get_float_value() data_total += value data_idxs.append((value,idx,str(label_column.get(idx)))) data_idxs.sort(reverse=True) if data_total > 0: total_included = 0 for idx in range(0,len(data_idxs)): if data_idxs[idx][0]/data_total < 0.02: remaining = len(data_idxs) - idx remaining_idx = data_idxs[idx][1] data_idxs = data_idxs[:idx] data_idxs.append((data_total-total_included,remaining_idx,"%d < 2%%"%(remaining))) break else: total_included += data_idxs[idx][0] total_degrees = 0 self.set_children([]) label_children = [] lcx = x lcy = y l_height,l_width = self.canvas.from_rowcol(1,11) px = x+l_width pw = width - l_width py = y+l_height ph = height - (l_height*2) for idx in range(0,len(data_idxs)): data_percent = (data_idxs[idx][0]/data_total) data_degrees = round(360.0 * data_percent ) slice_color = curses.color_pair(self.canvas.color_min+(30+(idx*11)%((self.canvas.color_max-30)-self.canvas.color_min))) arc = display_list.Arc(px+pw/2, py+ph/2, min(ph,pw)/2, total_degrees, total_degrees+data_degrees, slice_color, True) self.add_child(arc) label = "(%.0f%%) %s"%(data_percent*100.00, data_idxs[idx][2][:11]) if lcy < y + height: label_children.append(display_list.Text(lcx,lcy,label,slice_color)) lcy += l_height total_degrees += data_degrees title = self.series.column l_height,l_width = self.canvas.from_rowcol(1,len(title)) lcx = x+width/2 - l_width/2 lcy = y+height-l_height label_children.append(display_list.Text(lcx,lcy,title,label_series.color)) for lc in label_children: self.add_child(lc) return GraphElement.get_bbox(self)
Ancestors (in MRO)
- GraphSlices
- GraphElement
- char_draw.display_list.DisplayList
- builtins.object
Static methods
def __init__(
self, parent, series)
constructor, takes a parent object to be contained within and a list of children object to contain
def __init__(self,parent,series): self.series = series GraphElement.__init__(self,parent) self.label_positions = [] self.angle = 0
def add_child(
self, child)
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def get_bbox(
self)
compute the bounding box
def get_bbox(self): """ compute the bounding box """ if self.modified: label_series = self.parent.get_xvalues() label_column = label_series.data.get_column(label_series.column) data_column = self.series.data.get_column(self.series.column) x,y = self.get_location() width,height = self.get_size() data_idxs = [] data_total = 0 for idx in range(0,data_column.size()): cell = data_column.get(idx) value = cell.get_float_value() data_total += value data_idxs.append((value,idx,str(label_column.get(idx)))) data_idxs.sort(reverse=True) if data_total > 0: total_included = 0 for idx in range(0,len(data_idxs)): if data_idxs[idx][0]/data_total < 0.02: remaining = len(data_idxs) - idx remaining_idx = data_idxs[idx][1] data_idxs = data_idxs[:idx] data_idxs.append((data_total-total_included,remaining_idx,"%d < 2%%"%(remaining))) break else: total_included += data_idxs[idx][0] total_degrees = 0 self.set_children([]) label_children = [] lcx = x lcy = y l_height,l_width = self.canvas.from_rowcol(1,11) px = x+l_width pw = width - l_width py = y+l_height ph = height - (l_height*2) for idx in range(0,len(data_idxs)): data_percent = (data_idxs[idx][0]/data_total) data_degrees = round(360.0 * data_percent ) slice_color = curses.color_pair(self.canvas.color_min+(30+(idx*11)%((self.canvas.color_max-30)-self.canvas.color_min))) arc = display_list.Arc(px+pw/2, py+ph/2, min(ph,pw)/2, total_degrees, total_degrees+data_degrees, slice_color, True) self.add_child(arc) label = "(%.0f%%) %s"%(data_percent*100.00, data_idxs[idx][2][:11]) if lcy < y + height: label_children.append(display_list.Text(lcx,lcy,label,slice_color)) lcy += l_height total_degrees += data_degrees title = self.series.column l_height,l_width = self.canvas.from_rowcol(1,len(title)) lcx = x+width/2 - l_width/2 lcy = y+height-l_height label_children.append(display_list.Text(lcx,lcy,title,label_series.color)) for lc in label_children: self.add_child(lc) return GraphElement.get_bbox(self)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_location(
self)
return the location of the graph element
def get_location( self ): """ return the location of the graph element """ return (self.x,self.y)
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_size(
self)
return the height and width of the graph element
def get_size( self ): """ return the height and width of the graph element """ return (self.width, self.height)
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
draw the object on the suppied canvas
def render(self): """ draw the object on the suppied canvas """ for c in self.children: c.render()
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to True or False to tell graph to render in focus mode
def set_focus( self, state ): """ set focus to True or False to tell graph to render in focus mode """ self.focus = state self.modified = True
def set_location(
self, location)
set the location of the graph element
def set_location( self, location ): """ set the location of the graph element """ self.x,self.y = location self.modified = True
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def set_size(
self, size)
set the size of the graph element
def set_size( self, size ): """ set the size of the graph element """ self.width,self.height = size self.modified = True
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
Instance variables
var angle
var label_positions
var series
class GraphTable
Element that lays out a table of text for the series
class GraphTable(GraphElement): """ Element that lays out a table of text for the series """ def __init__(self,parent): GraphElement.__init__(self,parent) def get_bbox(self): """ recompute and relayout the component and return it's bbox """ if self.modified: new_children = [] x,y = self.get_location() width,height = self.get_size() row_labels = self.parent.get_xvalues() columns = self.parent.get_series() n_columns = len(columns)+1 cw = width / n_columns ch = height rows,cols = self.canvas.to_rowcol(width,height) r_height,r_nothing = self.canvas.from_rowcol(1,1) col_width = cols // n_columns rlc = row_labels.data.get_column(row_labels.column) def pad( s, width ): if len(s) < width: return s+' '*(width-len(s)) else: return s new_children.append(display_list.Text(x,y,pad(row_labels.column[0:col_width],col_width),self.canvas.white|curses.A_STANDOUT)) for idx in range(len(columns)): new_children.append(display_list.Text(x+cw+idx*cw,y,pad(columns[idx].column[0:col_width],col_width),self.canvas.white|curses.A_STANDOUT)) for ridx in range(min(rows-1,rlc.size())): y += r_height new_children.append(display_list.Text(x,y,pad(str(rlc.get(ridx))[0:col_width],col_width),self.canvas.white)) for cidx in range(len(columns)): column = columns[cidx].data.get_column(columns[cidx].column) new_children.append(display_list.Text(x+cw+cidx*cw,y,pad(str(column.get(ridx))[0:col_width],col_width),self.canvas.white)) self.set_children(new_children) return GraphElement.get_bbox(self)
Ancestors (in MRO)
- GraphTable
- GraphElement
- char_draw.display_list.DisplayList
- builtins.object
Static methods
def __init__(
self, parent)
Inheritance:
GraphElement
.__init__
constructor, takes a parent object to be contained within and a list of children object to contain
def __init__(self,parent): GraphElement.__init__(self,parent)
def add_child(
self, child)
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def get_bbox(
self)
recompute and relayout the component and return it's bbox
def get_bbox(self): """ recompute and relayout the component and return it's bbox """ if self.modified: new_children = [] x,y = self.get_location() width,height = self.get_size() row_labels = self.parent.get_xvalues() columns = self.parent.get_series() n_columns = len(columns)+1 cw = width / n_columns ch = height rows,cols = self.canvas.to_rowcol(width,height) r_height,r_nothing = self.canvas.from_rowcol(1,1) col_width = cols // n_columns rlc = row_labels.data.get_column(row_labels.column) def pad( s, width ): if len(s) < width: return s+' '*(width-len(s)) else: return s new_children.append(display_list.Text(x,y,pad(row_labels.column[0:col_width],col_width),self.canvas.white|curses.A_STANDOUT)) for idx in range(len(columns)): new_children.append(display_list.Text(x+cw+idx*cw,y,pad(columns[idx].column[0:col_width],col_width),self.canvas.white|curses.A_STANDOUT)) for ridx in range(min(rows-1,rlc.size())): y += r_height new_children.append(display_list.Text(x,y,pad(str(rlc.get(ridx))[0:col_width],col_width),self.canvas.white)) for cidx in range(len(columns)): column = columns[cidx].data.get_column(columns[cidx].column) new_children.append(display_list.Text(x+cw+cidx*cw,y,pad(str(column.get(ridx))[0:col_width],col_width),self.canvas.white)) self.set_children(new_children) return GraphElement.get_bbox(self)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_location(
self)
return the location of the graph element
def get_location( self ): """ return the location of the graph element """ return (self.x,self.y)
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_size(
self)
return the height and width of the graph element
def get_size( self ): """ return the height and width of the graph element """ return (self.width, self.height)
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
draw the object on the suppied canvas
def render(self): """ draw the object on the suppied canvas """ for c in self.children: c.render()
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to True or False to tell graph to render in focus mode
def set_focus( self, state ): """ set focus to True or False to tell graph to render in focus mode """ self.focus = state self.modified = True
def set_location(
self, location)
set the location of the graph element
def set_location( self, location ): """ set the location of the graph element """ self.x,self.y = location self.modified = True
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def set_size(
self, size)
set the size of the graph element
def set_size( self, size ): """ set the size of the graph element """ self.width,self.height = size self.modified = True
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
class GraphTitle
A title to be displayed on a graph
class GraphTitle(GraphElement): """ A title to be displayed on a graph """ def __init__(self,parent,text=None): GraphElement.__init__(self,parent) self.text = text self.add_child(display_list.Text(0,0,self.text,self.canvas.white)) def get_bbox(self): """ recompute and relayout the component and return it's bbox """ if self.modified: new_children = [] x,y = self.get_location() width,height = self.get_size() rows,cols = self.canvas.to_rowcol(width,height) r_height,r_width = self.canvas.from_rowcol(1,1) text = self.text.strip() while text and rows: if len(text) > cols: s_idx = cols while s_idx > 0: if text[s_idx] == ' ': break s_idx -= 1 if s_idx <= 0: s_idx = cols else: s_idx = cols new_children.append(display_list.Text(x,y,text[:s_idx],self.canvas.white|(curses.A_STANDOUT if self.is_focus() else curses.A_NORMAL))) rows -= 1 y += r_height text = text[s_idx:].lstrip() self.set_children(new_children) return GraphElement.get_bbox(self)
Ancestors (in MRO)
- GraphTitle
- GraphElement
- char_draw.display_list.DisplayList
- builtins.object
Static methods
def __init__(
self, parent, text=None)
constructor, takes a parent object to be contained within and a list of children object to contain
def __init__(self,parent,text=None): GraphElement.__init__(self,parent) self.text = text self.add_child(display_list.Text(0,0,self.text,self.canvas.white))
def add_child(
self, child)
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def get_bbox(
self)
recompute and relayout the component and return it's bbox
def get_bbox(self): """ recompute and relayout the component and return it's bbox """ if self.modified: new_children = [] x,y = self.get_location() width,height = self.get_size() rows,cols = self.canvas.to_rowcol(width,height) r_height,r_width = self.canvas.from_rowcol(1,1) text = self.text.strip() while text and rows: if len(text) > cols: s_idx = cols while s_idx > 0: if text[s_idx] == ' ': break s_idx -= 1 if s_idx <= 0: s_idx = cols else: s_idx = cols new_children.append(display_list.Text(x,y,text[:s_idx],self.canvas.white|(curses.A_STANDOUT if self.is_focus() else curses.A_NORMAL))) rows -= 1 y += r_height text = text[s_idx:].lstrip() self.set_children(new_children) return GraphElement.get_bbox(self)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_location(
self)
return the location of the graph element
def get_location( self ): """ return the location of the graph element """ return (self.x,self.y)
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_size(
self)
return the height and width of the graph element
def get_size( self ): """ return the height and width of the graph element """ return (self.width, self.height)
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
draw the object on the suppied canvas
def render(self): """ draw the object on the suppied canvas """ for c in self.children: c.render()
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to True or False to tell graph to render in focus mode
def set_focus( self, state ): """ set focus to True or False to tell graph to render in focus mode """ self.focus = state self.modified = True
def set_location(
self, location)
set the location of the graph element
def set_location( self, location ): """ set the location of the graph element """ self.x,self.y = location self.modified = True
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def set_size(
self, size)
set the size of the graph element
def set_size( self, size ): """ set the size of the graph element """ self.width,self.height = size self.modified = True
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
Instance variables
var text
class GraphXAxis
An X-axis to be displayed on a graph
class GraphXAxis(GraphElement): """ An X-axis to be displayed on a graph """ def __init__(self,parent, horizontal = True): GraphElement.__init__(self,parent) self.horizontal = horizontal self.range_min = -1 self.range_max = -1 self.sx = 0 self.dx = 0 self.values = [] self.add_child(display_list.PolyLine([],self.canvas.green)) def get_range( self ): """ return range_min, range_max, sx """ return (self.range_min,self.range_max, self.sx, self.dx) def get_values( self ): """ return vector of x (value,label) """ return self.values def get_bbox( self ): """ compute the bounding box """ if self.modified: new_children = [] x_values = self.parent.get_xvalues() column = x_values.data.get_column(x_values.column) type = None for c in data_table.ColumnIterator(column): if not type or type == data_table.blank_type: type = c.get_type() elif type != c.get_type(): type = 'mixed' self.range_min = -1 self.range_max = -1 self.sx = 0 self.dx = 0 self.values = [] if self.parent.is_top(): top_indexes = self.parent.get_top_indexes() if type in [data_table.blank_type,data_table.string_type, 'mixed']: if self.parent.is_top(): self.range_min = 0 self.range_max = len(top_indexes) ii = 0 for ix in top_indexes: c = column.get(ix) self.values.append((ii,str(c))) ii += 1 else: self.range_min = 0 self.range_max = column.size() ix = 0 for c in data_table.ColumnIterator(column): self.values.append((ix,str(c))) ix += 1 else: self.range_min = None self.range_max = None if self.parent.is_top(): for ix in top_indexes: c = column.get(ix) value = c.get_float_value() if self.range_min == None or value < self.range_min: self.range_min = value if self.range_max == None or value > self.range_max: self.range_max = value self.values.append((value,str(c))) else: for c in data_table.ColumnIterator(column): value = c.get_float_value() if self.range_min == None or value < self.range_min: self.range_min = value if self.range_max == None or value > self.range_max: self.range_max = value self.values.append((value,str(c))) if len(self.values) >= 2: extra_value = self.values[-1][0] + (self.values[-1][0] - self.values[-2][0]) self.values.append((extra_value," ")) if extra_value > self.range_max: self.range_max = extra_value r_height,r_width = self.canvas.from_rowcol(1,1) width,height = self.get_size() ox,oy = self.get_location() self.sx = width / max(1.0,(self.range_max-self.range_min)) x = ox y = oy new_children.append(display_list.Rect(x,y,x+width,y+height,self.canvas.black,fill=True)) points = [(x,y)] labels = [] prev_scaled_x = None total_dx = 0 prev_label = None for v,label in self.values: if label.endswith(".00"): label=label[:-3] force = False if prev_label: prev_parts = prev_label.split(' ') cur_parts = label.split(' ') new_label = '' no_match = False idx = 0 while idx < min(len(prev_parts),len(cur_parts)): if no_match or prev_parts[idx] != cur_parts[idx]: if idx == 0: force = True new_label += cur_parts[idx] + ' ' no_match = True idx += 1 while idx < len(cur_parts): new_label += cur_parts[idx] + ' ' idx += 1 prev_label = label label = new_label else: prev_label = label scaled_x = (v-self.range_min)*self.sx if prev_scaled_x != None: total_dx += (scaled_x - prev_scaled_x) prev_scaled_x = scaled_x t_x,t_y = self.canvas.round_text_position(ox+scaled_x,y+1) if t_x >= x or force: points.append((t_x,y)) points.append((t_x,t_y)) points.append((t_x,y)) labels.append((t_x,t_y,label)) l_height,l_width = self.canvas.from_rowcol(1,len(label)+1) x = t_x + l_width if points[-1][0] < ox+width: points.append((ox+width,y)) self.dx = total_dx / len(self.values) new_children.append(display_list.PolyLine(points,self.canvas.green)) for x,y,label in labels: new_children.append(display_list.Text(x,y,label,self.canvas.green)) self.set_children(new_children) return GraphElement.get_bbox(self)
Ancestors (in MRO)
- GraphXAxis
- GraphElement
- char_draw.display_list.DisplayList
- builtins.object
Static methods
def __init__(
self, parent, horizontal=True)
constructor, takes a parent object to be contained within and a list of children object to contain
def __init__(self,parent, horizontal = True): GraphElement.__init__(self,parent) self.horizontal = horizontal self.range_min = -1 self.range_max = -1 self.sx = 0 self.dx = 0 self.values = [] self.add_child(display_list.PolyLine([],self.canvas.green))
def add_child(
self, child)
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def get_bbox(
self)
compute the bounding box
def get_bbox( self ): """ compute the bounding box """ if self.modified: new_children = [] x_values = self.parent.get_xvalues() column = x_values.data.get_column(x_values.column) type = None for c in data_table.ColumnIterator(column): if not type or type == data_table.blank_type: type = c.get_type() elif type != c.get_type(): type = 'mixed' self.range_min = -1 self.range_max = -1 self.sx = 0 self.dx = 0 self.values = [] if self.parent.is_top(): top_indexes = self.parent.get_top_indexes() if type in [data_table.blank_type,data_table.string_type, 'mixed']: if self.parent.is_top(): self.range_min = 0 self.range_max = len(top_indexes) ii = 0 for ix in top_indexes: c = column.get(ix) self.values.append((ii,str(c))) ii += 1 else: self.range_min = 0 self.range_max = column.size() ix = 0 for c in data_table.ColumnIterator(column): self.values.append((ix,str(c))) ix += 1 else: self.range_min = None self.range_max = None if self.parent.is_top(): for ix in top_indexes: c = column.get(ix) value = c.get_float_value() if self.range_min == None or value < self.range_min: self.range_min = value if self.range_max == None or value > self.range_max: self.range_max = value self.values.append((value,str(c))) else: for c in data_table.ColumnIterator(column): value = c.get_float_value() if self.range_min == None or value < self.range_min: self.range_min = value if self.range_max == None or value > self.range_max: self.range_max = value self.values.append((value,str(c))) if len(self.values) >= 2: extra_value = self.values[-1][0] + (self.values[-1][0] - self.values[-2][0]) self.values.append((extra_value," ")) if extra_value > self.range_max: self.range_max = extra_value r_height,r_width = self.canvas.from_rowcol(1,1) width,height = self.get_size() ox,oy = self.get_location() self.sx = width / max(1.0,(self.range_max-self.range_min)) x = ox y = oy new_children.append(display_list.Rect(x,y,x+width,y+height,self.canvas.black,fill=True)) points = [(x,y)] labels = [] prev_scaled_x = None total_dx = 0 prev_label = None for v,label in self.values: if label.endswith(".00"): label=label[:-3] force = False if prev_label: prev_parts = prev_label.split(' ') cur_parts = label.split(' ') new_label = '' no_match = False idx = 0 while idx < min(len(prev_parts),len(cur_parts)): if no_match or prev_parts[idx] != cur_parts[idx]: if idx == 0: force = True new_label += cur_parts[idx] + ' ' no_match = True idx += 1 while idx < len(cur_parts): new_label += cur_parts[idx] + ' ' idx += 1 prev_label = label label = new_label else: prev_label = label scaled_x = (v-self.range_min)*self.sx if prev_scaled_x != None: total_dx += (scaled_x - prev_scaled_x) prev_scaled_x = scaled_x t_x,t_y = self.canvas.round_text_position(ox+scaled_x,y+1) if t_x >= x or force: points.append((t_x,y)) points.append((t_x,t_y)) points.append((t_x,y)) labels.append((t_x,t_y,label)) l_height,l_width = self.canvas.from_rowcol(1,len(label)+1) x = t_x + l_width if points[-1][0] < ox+width: points.append((ox+width,y)) self.dx = total_dx / len(self.values) new_children.append(display_list.PolyLine(points,self.canvas.green)) for x,y,label in labels: new_children.append(display_list.Text(x,y,label,self.canvas.green)) self.set_children(new_children) return GraphElement.get_bbox(self)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_location(
self)
return the location of the graph element
def get_location( self ): """ return the location of the graph element """ return (self.x,self.y)
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_range(
self)
return range_min, range_max, sx
def get_range( self ): """ return range_min, range_max, sx """ return (self.range_min,self.range_max, self.sx, self.dx)
def get_size(
self)
return the height and width of the graph element
def get_size( self ): """ return the height and width of the graph element """ return (self.width, self.height)
def get_values(
self)
return vector of x (value,label)
def get_values( self ): """ return vector of x (value,label) """ return self.values
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
draw the object on the suppied canvas
def render(self): """ draw the object on the suppied canvas """ for c in self.children: c.render()
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to True or False to tell graph to render in focus mode
def set_focus( self, state ): """ set focus to True or False to tell graph to render in focus mode """ self.focus = state self.modified = True
def set_location(
self, location)
set the location of the graph element
def set_location( self, location ): """ set the location of the graph element """ self.x,self.y = location self.modified = True
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def set_size(
self, size)
set the size of the graph element
def set_size( self, size ): """ set the size of the graph element """ self.width,self.height = size self.modified = True
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
Instance variables
var dx
var horizontal
var range_max
var range_min
var sx
var values
class GraphXAxisTitle
A title to be displayed on the x-axis
class GraphXAxisTitle(GraphTitle): """ A title to be displayed on the x-axis """ def __init(self,parent,text): GraphTitle.__init__(self,parent,text)
Ancestors (in MRO)
- GraphXAxisTitle
- GraphTitle
- GraphElement
- char_draw.display_list.DisplayList
- builtins.object
Static methods
def __init__(
self, parent, text=None)
Inheritance:
GraphTitle
.__init__
constructor, takes a parent object to be contained within and a list of children object to contain
def __init__(self,parent,text=None): GraphElement.__init__(self,parent) self.text = text self.add_child(display_list.Text(0,0,self.text,self.canvas.white))
def add_child(
self, child)
Inheritance:
GraphElement
.add_child
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def get_bbox(
self)
recompute and relayout the component and return it's bbox
def get_bbox(self): """ recompute and relayout the component and return it's bbox """ if self.modified: new_children = [] x,y = self.get_location() width,height = self.get_size() rows,cols = self.canvas.to_rowcol(width,height) r_height,r_width = self.canvas.from_rowcol(1,1) text = self.text.strip() while text and rows: if len(text) > cols: s_idx = cols while s_idx > 0: if text[s_idx] == ' ': break s_idx -= 1 if s_idx <= 0: s_idx = cols else: s_idx = cols new_children.append(display_list.Text(x,y,text[:s_idx],self.canvas.white|(curses.A_STANDOUT if self.is_focus() else curses.A_NORMAL))) rows -= 1 y += r_height text = text[s_idx:].lstrip() self.set_children(new_children) return GraphElement.get_bbox(self)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_location(
self)
return the location of the graph element
def get_location( self ): """ return the location of the graph element """ return (self.x,self.y)
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_size(
self)
return the height and width of the graph element
def get_size( self ): """ return the height and width of the graph element """ return (self.width, self.height)
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
draw the object on the suppied canvas
def render(self): """ draw the object on the suppied canvas """ for c in self.children: c.render()
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to True or False to tell graph to render in focus mode
def set_focus( self, state ): """ set focus to True or False to tell graph to render in focus mode """ self.focus = state self.modified = True
def set_location(
self, location)
set the location of the graph element
def set_location( self, location ): """ set the location of the graph element """ self.x,self.y = location self.modified = True
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def set_size(
self, size)
set the size of the graph element
def set_size( self, size ): """ set the size of the graph element """ self.width,self.height = size self.modified = True
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
class GraphYAxis
An X-axis to be displayed on a graph
class GraphYAxis(GraphElement): """ An X-axis to be displayed on a graph """ def __init__(self,parent,vertical = True): GraphElement.__init__(self,parent) self.vertical = vertical self.add_child(display_list.PolyLine([],self.canvas.green)) self.range_min = -1 self.range_max = -1 self.sy = 0 def get_range( self ): """ return range_min, range_max, sy """ return (self.range_min,self.range_max, self.sy) def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] y_values = self.parent.get_series() self.range_min = -1 self.range_max = -1 self.dy = 0 if self.parent.is_top(): top_indexes = self.parent.get_top_indexes() for series in y_values: column = series.data.get_column(series.column) for idx in top_indexes: c = column.get(idx) value = c.get_float_value() if self.range_min < 0 or value < self.range_min: self.range_min = value if self.range_max < 0 or value > self.range_max: self.range_max = value else: for series in y_values: column = series.data.get_column(series.column) for c in data_table.ColumnIterator(column): value = c.get_float_value() if self.range_min < 0 or value < self.range_min: self.range_min = value if self.range_max < 0 or value > self.range_max: self.range_max = value if self.range_min <= 0: self.range_min = 0 if self.range_max <= 0: self.range_max = 1 tick_size = max(1.0,(self.range_max-self.range_min))/5 if tick_size > 1: tick_size = round(tick_size) self.range_max += tick_size r_height,r_width = self.canvas.from_rowcol(1,1) width,height = self.get_size() ox,oy = self.get_location() new_children.append(display_list.Rect(ox,oy,ox+width,oy+height,self.canvas.black,fill=True)) oy += height ox += (width- 1) self.sy = height / max(1.0,(self.range_max-self.range_min)) x = ox y = oy points = [(x,y)] labels = [] for data_y in float_range(self.range_min,self.range_max,tick_size): scaled_y = (data_y-self.range_min)*self.sy label = data_table.format_float(float(data_y)) if label.endswith(".00"): label=label[:-3] t_x,t_y = self.canvas.round_text_position(x-3,oy-scaled_y) if t_y <= y: l_height,l_width = self.canvas.from_rowcol(1,len(label)+1) points.append((x,t_y)) points.append((t_x,t_y)) points.append((x,t_y)) labels.append((t_x-l_width,t_y-(l_height/2),label)) y = t_y-l_height if points[-1][1] > oy-height: points.append((x,oy-height)) new_children.append(display_list.PolyLine(points,self.canvas.green)) for x,y,label in labels: new_children.append(display_list.Text(x,y,label,self.canvas.green)) self.set_children(new_children) return GraphElement.get_bbox(self)
Ancestors (in MRO)
- GraphYAxis
- GraphElement
- char_draw.display_list.DisplayList
- builtins.object
Static methods
def __init__(
self, parent, vertical=True)
constructor, takes a parent object to be contained within and a list of children object to contain
def __init__(self,parent,vertical = True): GraphElement.__init__(self,parent) self.vertical = vertical self.add_child(display_list.PolyLine([],self.canvas.green)) self.range_min = -1 self.range_max = -1 self.sy = 0
def add_child(
self, child)
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def get_bbox(
self)
compute the bounding box
def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] y_values = self.parent.get_series() self.range_min = -1 self.range_max = -1 self.dy = 0 if self.parent.is_top(): top_indexes = self.parent.get_top_indexes() for series in y_values: column = series.data.get_column(series.column) for idx in top_indexes: c = column.get(idx) value = c.get_float_value() if self.range_min < 0 or value < self.range_min: self.range_min = value if self.range_max < 0 or value > self.range_max: self.range_max = value else: for series in y_values: column = series.data.get_column(series.column) for c in data_table.ColumnIterator(column): value = c.get_float_value() if self.range_min < 0 or value < self.range_min: self.range_min = value if self.range_max < 0 or value > self.range_max: self.range_max = value if self.range_min <= 0: self.range_min = 0 if self.range_max <= 0: self.range_max = 1 tick_size = max(1.0,(self.range_max-self.range_min))/5 if tick_size > 1: tick_size = round(tick_size) self.range_max += tick_size r_height,r_width = self.canvas.from_rowcol(1,1) width,height = self.get_size() ox,oy = self.get_location() new_children.append(display_list.Rect(ox,oy,ox+width,oy+height,self.canvas.black,fill=True)) oy += height ox += (width- 1) self.sy = height / max(1.0,(self.range_max-self.range_min)) x = ox y = oy points = [(x,y)] labels = [] for data_y in float_range(self.range_min,self.range_max,tick_size): scaled_y = (data_y-self.range_min)*self.sy label = data_table.format_float(float(data_y)) if label.endswith(".00"): label=label[:-3] t_x,t_y = self.canvas.round_text_position(x-3,oy-scaled_y) if t_y <= y: l_height,l_width = self.canvas.from_rowcol(1,len(label)+1) points.append((x,t_y)) points.append((t_x,t_y)) points.append((x,t_y)) labels.append((t_x-l_width,t_y-(l_height/2),label)) y = t_y-l_height if points[-1][1] > oy-height: points.append((x,oy-height)) new_children.append(display_list.PolyLine(points,self.canvas.green)) for x,y,label in labels: new_children.append(display_list.Text(x,y,label,self.canvas.green)) self.set_children(new_children) return GraphElement.get_bbox(self)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_location(
self)
return the location of the graph element
def get_location( self ): """ return the location of the graph element """ return (self.x,self.y)
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_range(
self)
return range_min, range_max, sy
def get_range( self ): """ return range_min, range_max, sy """ return (self.range_min,self.range_max, self.sy)
def get_size(
self)
return the height and width of the graph element
def get_size( self ): """ return the height and width of the graph element """ return (self.width, self.height)
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
draw the object on the suppied canvas
def render(self): """ draw the object on the suppied canvas """ for c in self.children: c.render()
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to True or False to tell graph to render in focus mode
def set_focus( self, state ): """ set focus to True or False to tell graph to render in focus mode """ self.focus = state self.modified = True
def set_location(
self, location)
set the location of the graph element
def set_location( self, location ): """ set the location of the graph element """ self.x,self.y = location self.modified = True
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def set_size(
self, size)
set the size of the graph element
def set_size( self, size ): """ set the size of the graph element """ self.width,self.height = size self.modified = True
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
Instance variables
var range_max
var range_min
var sy
var vertical
class GraphYAxisTitle
A title to be displayed on the y-axis
class GraphYAxisTitle(GraphTitle): """ A title to be displayed on the y-axis """ def __init(self,parent,text): GraphTitle.__init__(self,parent,text)
Ancestors (in MRO)
- GraphYAxisTitle
- GraphTitle
- GraphElement
- char_draw.display_list.DisplayList
- builtins.object
Static methods
def __init__(
self, parent, text=None)
Inheritance:
GraphTitle
.__init__
constructor, takes a parent object to be contained within and a list of children object to contain
def __init__(self,parent,text=None): GraphElement.__init__(self,parent) self.text = text self.add_child(display_list.Text(0,0,self.text,self.canvas.white))
def add_child(
self, child)
Inheritance:
GraphElement
.add_child
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def get_bbox(
self)
recompute and relayout the component and return it's bbox
def get_bbox(self): """ recompute and relayout the component and return it's bbox """ if self.modified: new_children = [] x,y = self.get_location() width,height = self.get_size() rows,cols = self.canvas.to_rowcol(width,height) r_height,r_width = self.canvas.from_rowcol(1,1) text = self.text.strip() while text and rows: if len(text) > cols: s_idx = cols while s_idx > 0: if text[s_idx] == ' ': break s_idx -= 1 if s_idx <= 0: s_idx = cols else: s_idx = cols new_children.append(display_list.Text(x,y,text[:s_idx],self.canvas.white|(curses.A_STANDOUT if self.is_focus() else curses.A_NORMAL))) rows -= 1 y += r_height text = text[s_idx:].lstrip() self.set_children(new_children) return GraphElement.get_bbox(self)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_location(
self)
return the location of the graph element
def get_location( self ): """ return the location of the graph element """ return (self.x,self.y)
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_size(
self)
return the height and width of the graph element
def get_size( self ): """ return the height and width of the graph element """ return (self.width, self.height)
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
draw the object on the suppied canvas
def render(self): """ draw the object on the suppied canvas """ for c in self.children: c.render()
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to True or False to tell graph to render in focus mode
def set_focus( self, state ): """ set focus to True or False to tell graph to render in focus mode """ self.focus = state self.modified = True
def set_location(
self, location)
set the location of the graph element
def set_location( self, location ): """ set the location of the graph element """ self.x,self.y = location self.modified = True
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def set_size(
self, size)
set the size of the graph element
def set_size( self, size ): """ set the size of the graph element """ self.width,self.height = size self.modified = True
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
class LineGraph
LineGraph that displays a data table as a line graph
class LineGraph(Graph): """LineGraph that displays a data table as a line graph""" def __init__(self,data_table=None,x_values=None,y_values=None,y_unit="",parent=None,canvas=None,area=False,title=None): """ constructor takes a data_table which contains values to be graphed, x_values is a column reference in the data table for the xaxis values, y_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on """ Graph.__init__(self,data_table,x_values,y_values,y_unit,parent,canvas,title=title) self.title = None self.legend = None self.x_axis_title = None self.y_axis_title = None self.x_axis = None self.y_axis = None self.chart_area = None self.chart_series = [] self.area = area if self.canvas: self.init() def init(self): """ create the children for all of the graph components """ if not self.initialized: Graph.init(self) self.title = GraphTitle(self,self.get_title()) self.legend = GraphLegend(self,[(s.column,s.color) for s in self.get_series()]) self.x_axis_title = GraphXAxisTitle(self,self.get_xvalues().column) self.y_axis_title = GraphYAxisTitle(self,self.get_series_unit()) self.x_axis = GraphXAxis(self, horizontal = True ) self.y_axis = GraphYAxis(self, vertical = True ) self.chart_area = GraphArea(self) self.chart_series = [GraphLines(self,series,self.x_axis,self.y_axis,area=self.area) for series in self.get_series()] self.add_child(self.title) self.add_child(self.legend) self.add_child(self.x_axis_title) self.add_child(self.y_axis_title) self.add_child(self.chart_area) for cs in self.chart_series: self.add_child(cs) self.add_child(self.x_axis) self.add_child(self.y_axis) self.initialized = True def set_focus( self, state ): """ set focus to this graph, in this case tell the title about it so it will highlight """ if self.title: self.title.set_focus(state) Graph.set_focus(self,state) def get_bbox(self): """ arrange the children of the graph based on size of graph """ if self.modified: min_x,min_y,max_x,max_y = self.bounds() width = (max_x-min_x) - 4 height = (max_y-min_y) - 4 x = 2 y = 2 self.title.set_location((x,y)) self.title.set_size((width,height*0.10)) y = y + height*0.10 self.legend.set_location((x,y)) self.legend.set_size((width,height*0.10)) y = y + height*0.10 self.y_axis_title.set_location((x,y+height*0.35)) self.y_axis_title.set_size((width*0.05,height*0.35)) self.y_axis.set_location((x+(width*0.05),y)) self.y_axis.set_size((width*0.05,height*0.70)) self.x_axis.set_location((x+(width*0.10),y+(height*0.70)+1.0)) self.x_axis.set_size((width*0.80,height*0.07)) ya_bbox = self.y_axis.get_bbox() yat_bbox = self.y_axis_title.get_bbox() if ya_bbox.x0 < yat_bbox.x1: self.y_axis.set_location((self.canvas.round_text_x_position(yat_bbox.x1),ya_bbox.y0)) self.y_axis.set_size(((ya_bbox.x1-ya_bbox.x0),height*0.70)) ya_x,ya_y = self.y_axis.get_location() ya_w,ya_h = self.y_axis.get_size() xa_x,xa_y = self.x_axis.get_location() xa_w,xa_h = self.x_axis.get_size() self.x_axis.set_location((ya_x+ya_w,ya_y+ya_h)) self.x_axis.set_size((xa_w - ((ya_x+ya_w)-xa_x),xa_h)) xa_x,xa_y = self.x_axis.get_location() xa_w,xa_h = self.x_axis.get_size() self.chart_area.set_location((ya_x+ya_w,ya_y)) self.chart_area.set_size((xa_w,ya_h)) for cs in self.chart_series: cs.set_location((ya_x+ya_w+1,ya_y)) cs.set_size((xa_w,ya_h)) self.x_axis_title.set_location((xa_x,xa_y+xa_h)) self.x_axis_title.set_size((xa_w,xa_h)) return Graph.get_bbox(self)
Ancestors (in MRO)
Static methods
def __init__(
self, data_table=None, x_values=None, y_values=None, y_unit='', parent=None, canvas=None, area=False, title=None)
constructor takes a data_table which contains values to be graphed, x_values is a column reference in the data table for the xaxis values, y_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on
def __init__(self,data_table=None,x_values=None,y_values=None,y_unit="",parent=None,canvas=None,area=False,title=None): """ constructor takes a data_table which contains values to be graphed, x_values is a column reference in the data table for the xaxis values, y_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on """ Graph.__init__(self,data_table,x_values,y_values,y_unit,parent,canvas,title=title) self.title = None self.legend = None self.x_axis_title = None self.y_axis_title = None self.x_axis = None self.y_axis = None self.chart_area = None self.chart_series = [] self.area = area if self.canvas: self.init()
def add_child(
self, child)
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def data_changed(
self, data_table)
listener that gets called if the data table is changed
def data_changed(self,data_table): """ listener that gets called if the data table is changed """ self.modified = True
def get_bbox(
self)
arrange the children of the graph based on size of graph
def get_bbox(self): """ arrange the children of the graph based on size of graph """ if self.modified: min_x,min_y,max_x,max_y = self.bounds() width = (max_x-min_x) - 4 height = (max_y-min_y) - 4 x = 2 y = 2 self.title.set_location((x,y)) self.title.set_size((width,height*0.10)) y = y + height*0.10 self.legend.set_location((x,y)) self.legend.set_size((width,height*0.10)) y = y + height*0.10 self.y_axis_title.set_location((x,y+height*0.35)) self.y_axis_title.set_size((width*0.05,height*0.35)) self.y_axis.set_location((x+(width*0.05),y)) self.y_axis.set_size((width*0.05,height*0.70)) self.x_axis.set_location((x+(width*0.10),y+(height*0.70)+1.0)) self.x_axis.set_size((width*0.80,height*0.07)) ya_bbox = self.y_axis.get_bbox() yat_bbox = self.y_axis_title.get_bbox() if ya_bbox.x0 < yat_bbox.x1: self.y_axis.set_location((self.canvas.round_text_x_position(yat_bbox.x1),ya_bbox.y0)) self.y_axis.set_size(((ya_bbox.x1-ya_bbox.x0),height*0.70)) ya_x,ya_y = self.y_axis.get_location() ya_w,ya_h = self.y_axis.get_size() xa_x,xa_y = self.x_axis.get_location() xa_w,xa_h = self.x_axis.get_size() self.x_axis.set_location((ya_x+ya_w,ya_y+ya_h)) self.x_axis.set_size((xa_w - ((ya_x+ya_w)-xa_x),xa_h)) xa_x,xa_y = self.x_axis.get_location() xa_w,xa_h = self.x_axis.get_size() self.chart_area.set_location((ya_x+ya_w,ya_y)) self.chart_area.set_size((xa_w,ya_h)) for cs in self.chart_series: cs.set_location((ya_x+ya_w+1,ya_y)) cs.set_size((xa_w,ya_h)) self.x_axis_title.set_location((xa_x,xa_y+xa_h)) self.x_axis_title.set_size((xa_w,xa_h)) return Graph.get_bbox(self)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_data(
self)
return reference to the data table
def get_data(self): """ return reference to the data table """ return self.data
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_series(
self)
return list of GraphSeries objects that describe the data series to be graphed
def get_series( self ): """ return list of GraphSeries objects that describe the data series to be graphed """ return self.y_values
def get_series_unit(
self)
get the name of the units for the y axis
def get_series_unit( self ): """ get the name of the units for the y axis """ return self.y_unit
def get_title(
self)
return the title for this graph
def get_title( self ): """ return the title for this graph """ if self.graph_title: return self.graph_title else: return self.get_data().get_name()
def get_top_indexes(
self)
get the indexes of the self.top items in the series
def get_top_indexes(self): """ get the indexes of the self.top items in the series """ top_values = [] for series in self.y_values: column = series.data.get_column(series.column) for idx in range(column.size()): top_values.append((column.get(idx).get_float_value(),idx)) top_values.sort(reverse=True) top_indexes = [] for idx in range(self.top): top_indexes.append(top_values[idx][1]) return top_indexes
def get_xvalues(
self)
return the series for the x-values
def get_xvalues( self ): """ return the series for the x-values """ return self.x_values
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def init(
self)
create the children for all of the graph components
def init(self): """ create the children for all of the graph components """ if not self.initialized: Graph.init(self) self.title = GraphTitle(self,self.get_title()) self.legend = GraphLegend(self,[(s.column,s.color) for s in self.get_series()]) self.x_axis_title = GraphXAxisTitle(self,self.get_xvalues().column) self.y_axis_title = GraphYAxisTitle(self,self.get_series_unit()) self.x_axis = GraphXAxis(self, horizontal = True ) self.y_axis = GraphYAxis(self, vertical = True ) self.chart_area = GraphArea(self) self.chart_series = [GraphLines(self,series,self.x_axis,self.y_axis,area=self.area) for series in self.get_series()] self.add_child(self.title) self.add_child(self.legend) self.add_child(self.x_axis_title) self.add_child(self.y_axis_title) self.add_child(self.chart_area) for cs in self.chart_series: self.add_child(cs) self.add_child(self.x_axis) self.add_child(self.y_axis) self.initialized = True
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def is_top(
self)
are we justing just the self.top highest items
def is_top(self): """ are we justing just the self.top highest items """ return self.top > 0
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def refresh_data(
self)
force a refresh on the data backing this graph
def refresh_data(self): """ force a refresh on the data backing this graph """ self.data.refresh()
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
override render to force initialization and layout
def render(self): """ override render to force initialization and layout""" if self.canvas: self.init() self.get_bbox() self.canvas.clear() display_list.DisplayList.render(self)
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to this graph, in this case tell the title about it so it will highlight
def set_focus( self, state ): """ set focus to this graph, in this case tell the title about it so it will highlight """ if self.title: self.title.set_focus(state) Graph.set_focus(self,state)
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
Instance variables
var area
var chart_area
var chart_series
var legend
var title
var x_axis
var x_axis_title
var y_axis
var y_axis_title
class PieGraph
PieGraph that displays a data table as a pie chart
class PieGraph(Graph): """PieGraph that displays a data table as a pie chart""" def __init__(self,data_table=None,pie_labels=None,slice_values=None,parent=None,canvas=None,title=None): """ constructor takes a data_table which contains values to be graphed, pie_labels is a column reference in the data table for the pie slice labels, slice_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on """ Graph.__init__(self,data_table,pie_labels,slice_values,"",parent,canvas,title=title) self.title = None self.chart_area = None self.chart_series = [] if self.canvas: self.init() def init(self): """ create the children for all of the graph components """ if not self.initialized: Graph.init(self) self.title = GraphTitle(self,self.get_title()) self.chart_area = GraphArea(self) self.chart_series = [GraphSlices(self,series) for series in self.get_series()] self.add_child(self.title) self.add_child(self.chart_area) for cs in self.chart_series: self.add_child(cs) self.initialized = True def set_focus( self, state ): """ set focus to this graph, in this case tell the title about it so it will highlight """ if self.title: self.title.set_focus(state) Graph.set_focus(self,state) def get_bbox(self): """ arrange the children of the graph based on size of graph """ if self.modified: min_x,min_y,max_x,max_y = self.bounds() width = (max_x-min_x) - 4 height = (max_y-min_y) - 4 x = 2 y = 2 self.title.set_location((x,y)) self.title.set_size((width,height*0.10)) y = y + height*0.15 self.chart_area.set_location((x,y)) self.chart_area.set_size((width,height*0.80)) n_series = len(self.chart_series) if n_series > 1: split = 1 while split*split < n_series: split += 1 sx = width / split sy = (height*0.80) / split ix = 0 gx = x gy = y for cs in self.chart_series: cs.set_location((gx,gy)) cs.set_size((sx,sy)) ix += 1 if ix == split: ix = 0 gx = x gy += sy else: gx += sx else: for cs in self.chart_series: cs.set_location((x,y)) cs.set_size((width,height*0.80)) return Graph.get_bbox(self)
Ancestors (in MRO)
Static methods
def __init__(
self, data_table=None, pie_labels=None, slice_values=None, parent=None, canvas=None, title=None)
constructor takes a data_table which contains values to be graphed, pie_labels is a column reference in the data table for the pie slice labels, slice_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on
def __init__(self,data_table=None,pie_labels=None,slice_values=None,parent=None,canvas=None,title=None): """ constructor takes a data_table which contains values to be graphed, pie_labels is a column reference in the data table for the pie slice labels, slice_values is a list of column references to series of numerical data to be graphed, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on """ Graph.__init__(self,data_table,pie_labels,slice_values,"",parent,canvas,title=title) self.title = None self.chart_area = None self.chart_series = [] if self.canvas: self.init()
def add_child(
self, child)
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def data_changed(
self, data_table)
listener that gets called if the data table is changed
def data_changed(self,data_table): """ listener that gets called if the data table is changed """ self.modified = True
def get_bbox(
self)
arrange the children of the graph based on size of graph
def get_bbox(self): """ arrange the children of the graph based on size of graph """ if self.modified: min_x,min_y,max_x,max_y = self.bounds() width = (max_x-min_x) - 4 height = (max_y-min_y) - 4 x = 2 y = 2 self.title.set_location((x,y)) self.title.set_size((width,height*0.10)) y = y + height*0.15 self.chart_area.set_location((x,y)) self.chart_area.set_size((width,height*0.80)) n_series = len(self.chart_series) if n_series > 1: split = 1 while split*split < n_series: split += 1 sx = width / split sy = (height*0.80) / split ix = 0 gx = x gy = y for cs in self.chart_series: cs.set_location((gx,gy)) cs.set_size((sx,sy)) ix += 1 if ix == split: ix = 0 gx = x gy += sy else: gx += sx else: for cs in self.chart_series: cs.set_location((x,y)) cs.set_size((width,height*0.80)) return Graph.get_bbox(self)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_data(
self)
return reference to the data table
def get_data(self): """ return reference to the data table """ return self.data
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_series(
self)
return list of GraphSeries objects that describe the data series to be graphed
def get_series( self ): """ return list of GraphSeries objects that describe the data series to be graphed """ return self.y_values
def get_series_unit(
self)
get the name of the units for the y axis
def get_series_unit( self ): """ get the name of the units for the y axis """ return self.y_unit
def get_title(
self)
return the title for this graph
def get_title( self ): """ return the title for this graph """ if self.graph_title: return self.graph_title else: return self.get_data().get_name()
def get_top_indexes(
self)
get the indexes of the self.top items in the series
def get_top_indexes(self): """ get the indexes of the self.top items in the series """ top_values = [] for series in self.y_values: column = series.data.get_column(series.column) for idx in range(column.size()): top_values.append((column.get(idx).get_float_value(),idx)) top_values.sort(reverse=True) top_indexes = [] for idx in range(self.top): top_indexes.append(top_values[idx][1]) return top_indexes
def get_xvalues(
self)
return the series for the x-values
def get_xvalues( self ): """ return the series for the x-values """ return self.x_values
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def init(
self)
create the children for all of the graph components
def init(self): """ create the children for all of the graph components """ if not self.initialized: Graph.init(self) self.title = GraphTitle(self,self.get_title()) self.chart_area = GraphArea(self) self.chart_series = [GraphSlices(self,series) for series in self.get_series()] self.add_child(self.title) self.add_child(self.chart_area) for cs in self.chart_series: self.add_child(cs) self.initialized = True
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def is_top(
self)
are we justing just the self.top highest items
def is_top(self): """ are we justing just the self.top highest items """ return self.top > 0
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def refresh_data(
self)
force a refresh on the data backing this graph
def refresh_data(self): """ force a refresh on the data backing this graph """ self.data.refresh()
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
override render to force initialization and layout
def render(self): """ override render to force initialization and layout""" if self.canvas: self.init() self.get_bbox() self.canvas.clear() display_list.DisplayList.render(self)
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to this graph, in this case tell the title about it so it will highlight
def set_focus( self, state ): """ set focus to this graph, in this case tell the title about it so it will highlight """ if self.title: self.title.set_focus(state) Graph.set_focus(self,state)
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
Instance variables
var chart_area
var chart_series
var title
class TableGraph
TableGraph that displays a data table as a formatted table
class TableGraph(Graph): """TableGraph that displays a data table as a formatted table""" def __init__(self,data_table=None,row_labels=None,column_values=None,parent=None,canvas=None,title=None): """ constructor takes a data_table which contains values to be graphed, row_labels is a column reference in the data table for the table row labels, column_values is a list of column references to series of numerical or text data to be displayed in the table, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on """ Graph.__init__(self,data_table,row_labels,column_values,"",parent,canvas,title=title) self.title = None self.chart_area = None self.graph_table = None if self.canvas: self.init() def init(self): """ create the children for all of the graph components """ if not self.initialized: Graph.init(self) self.title = GraphTitle(self,self.get_title()) self.chart_area = GraphArea(self) self.graph_table = GraphTable(self) self.add_child(self.title) self.add_child(self.chart_area) self.add_child(self.graph_table) self.initialized = True def set_focus( self, state ): """ set focus to this graph, in this case tell the title about it so it will highlight """ if self.title: self.title.set_focus(state) Graph.set_focus(self,state) def get_bbox(self): """ arrange the children of the graph based on size of graph """ if self.modified: min_x,min_y,max_x,max_y = self.bounds() width = (max_x-min_x) - 4 height = (max_y-min_y) - 4 x = 2 y = 2 self.title.set_location((x,y)) self.title.set_size((width,height*0.10)) y = y + height*0.15 self.chart_area.set_location((x,y)) self.chart_area.set_size((width,height*0.80)) self.graph_table.set_location((x,y)) self.graph_table.set_size((width,height*0.80)) return Graph.get_bbox(self)
Ancestors (in MRO)
- TableGraph
- Graph
- char_draw.display_list.DisplayList
- builtins.object
Static methods
def __init__(
self, data_table=None, row_labels=None, column_values=None, parent=None, canvas=None, title=None)
constructor takes a data_table which contains values to be graphed, row_labels is a column reference in the data table for the table row labels, column_values is a list of column references to series of numerical or text data to be displayed in the table, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on
def __init__(self,data_table=None,row_labels=None,column_values=None,parent=None,canvas=None,title=None): """ constructor takes a data_table which contains values to be graphed, row_labels is a column reference in the data table for the table row labels, column_values is a list of column references to series of numerical or text data to be displayed in the table, parent is a reference to an enclosing display list, canvas is a reference to a canvas to render on """ Graph.__init__(self,data_table,row_labels,column_values,"",parent,canvas,title=title) self.title = None self.chart_area = None self.graph_table = None if self.canvas: self.init()
def add_child(
self, child)
append a child to the list of children of this object
def add_child(self, child ): """ append a child to the list of children of this object """ self.children.append(child) child.set_parent(self) child.set_canvas(self.get_canvas()) self.invalidate()
def bounds(
self)
return the bounds of the current drawing surface
def bounds(self): """ return the bounds of the current drawing surface """ max_x,max_y = self.canvas.get_maxxy() return (0.0,0.0,max_x/self.xform[0],max_y/self.xform[1])
def data_changed(
self, data_table)
listener that gets called if the data table is changed
def data_changed(self,data_table): """ listener that gets called if the data table is changed """ self.modified = True
def get_bbox(
self)
arrange the children of the graph based on size of graph
def get_bbox(self): """ arrange the children of the graph based on size of graph """ if self.modified: min_x,min_y,max_x,max_y = self.bounds() width = (max_x-min_x) - 4 height = (max_y-min_y) - 4 x = 2 y = 2 self.title.set_location((x,y)) self.title.set_size((width,height*0.10)) y = y + height*0.15 self.chart_area.set_location((x,y)) self.chart_area.set_size((width,height*0.80)) self.graph_table.set_location((x,y)) self.graph_table.set_size((width,height*0.80)) return Graph.get_bbox(self)
def get_canvas(
self)
get the canvas for this display list
def get_canvas(self): """ get the canvas for this display list """ return self.canvas
def get_children(
self)
return the children of this object if any
def get_children(self): """ return the children of this object if any """ return self.children
def get_data(
self)
return reference to the data table
def get_data(self): """ return reference to the data table """ return self.data
def get_parent(
self)
get the parent of this object
def get_parent(self): """ get the parent of this object """ return(self.parent)
def get_series(
self)
return list of GraphSeries objects that describe the data series to be graphed
def get_series( self ): """ return list of GraphSeries objects that describe the data series to be graphed """ return self.y_values
def get_series_unit(
self)
get the name of the units for the y axis
def get_series_unit( self ): """ get the name of the units for the y axis """ return self.y_unit
def get_title(
self)
return the title for this graph
def get_title( self ): """ return the title for this graph """ if self.graph_title: return self.graph_title else: return self.get_data().get_name()
def get_top_indexes(
self)
get the indexes of the self.top items in the series
def get_top_indexes(self): """ get the indexes of the self.top items in the series """ top_values = [] for series in self.y_values: column = series.data.get_column(series.column) for idx in range(column.size()): top_values.append((column.get(idx).get_float_value(),idx)) top_values.sort(reverse=True) top_indexes = [] for idx in range(self.top): top_indexes.append(top_values[idx][1]) return top_indexes
def get_xvalues(
self)
return the series for the x-values
def get_xvalues( self ): """ return the series for the x-values """ return self.x_values
def handle(
self, event)
handle an input event, return None if handled, event if not
def handle(self, event ): """ handle an input event, return None if handled, event if not """ return event
def init(
self)
create the children for all of the graph components
def init(self): """ create the children for all of the graph components """ if not self.initialized: Graph.init(self) self.title = GraphTitle(self,self.get_title()) self.chart_area = GraphArea(self) self.graph_table = GraphTable(self) self.add_child(self.title) self.add_child(self.chart_area) self.add_child(self.graph_table) self.initialized = True
def invalidate(
self)
mark this object and it's parent as invalidated
def invalidate(self): """ mark this object and it's parent as invalidated """ self.modified = True if self.parent: self.parent.invalidate()
def is_focus(
self)
return the current focus state
def is_focus( self ): """ return the current focus state """ return self.focus
def is_modified(
self)
does this display list contain modified objects
def is_modified(self): """ does this display list contain modified objects """ modified = self.modified for c in self.children: modified = modified or c.is_modified() return modified
def is_top(
self)
are we justing just the self.top highest items
def is_top(self): """ are we justing just the self.top highest items """ return self.top > 0
def pick(
self, row, col)
return the topmost opject at row,col for mouse selection
def pick(self, row, col): """ return the topmost opject at row,col for mouse selection """ for c in self.children: o = c.pick(row,col) if o: return o b = self.get_bbox() ulrow,ulcol = self.canvas.to_rowcol(*self.transform(b.x0,b.y0)) lrrow,lrcol = self.canvas.to_rowcol(*self.transform(b.x1,b.y1)) if row >= ulrow and row <= lrrow and col >= ulcol and col <= lrcol: return self else: return None
def refresh_data(
self)
force a refresh on the data backing this graph
def refresh_data(self): """ force a refresh on the data backing this graph """ self.data.refresh()
def remove_child(
self, child)
remove this child from the list of children of this object
def remove_child(self, child ): """ remove this child from the list of children of this object """ self.children.remove(child) child.set_parent(None)
def render(
self)
override render to force initialization and layout
def render(self): """ override render to force initialization and layout""" if self.canvas: self.init() self.get_bbox() self.canvas.clear() display_list.DisplayList.render(self)
def set_canvas(
self, canvas)
set the canvas and the scaling transformation
def set_canvas(self,canvas): """ set the canvas and the scaling transformation """ self.xform = [1.0,1.0] self.canvas = canvas self.modified = True for c in self.children: c.set_canvas(canvas)
def set_children(
self, children)
set the children of this object to a new list of children
def set_children(self, children): """ set the children of this object to a new list of children """ self.children = children for c in children: c.set_parent(self) c.set_canvas(self.get_canvas()) self.invalidate()
def set_focus(
self, state)
set focus to this graph, in this case tell the title about it so it will highlight
def set_focus( self, state ): """ set focus to this graph, in this case tell the title about it so it will highlight """ if self.title: self.title.set_focus(state) Graph.set_focus(self,state)
def set_parent(
self, parent)
set the parent of this object
def set_parent(self,parent): """ set the parent of this object """ self.parent = parent self.set_canvas(parent.get_canvas())
def transform(
self, x, y)
apply current transform to point
def transform(self, x, y ): """ apply current transform to point """ return (x*self.xform[0], y*self.xform[1])
Instance variables
var chart_area
var graph_table
var title