From: Jamil K. <jam...@ca...> - 2005-07-27 04:02:36
|
Hello, A few posts back, I included source code to some gauges I had whipped = together. After some constructive advice from John Hunter (Thanks!), = I've had time to polish them a bit and include the logarithmic ones as = promised. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D #!/usr/bin/env python """ The Meter widget draws a linear meter, either horizontally or = vertically. You supply the direction, limits, shaded regions, names and the current value, and invoke it like this: from pylab import figure, show =20 raw_value =3D -4.0 raw_limits =3D [-10.0,10.0,5,1] raw_zones =3D [[-10.0,0.0,'r'],[0.0,5.0,'y'],[5.0,10.0,'g']] attribute_name =3D "Rx MOS (24h)" =20 s_length =3D 0.3 p_length =3D 2.0 fig_height =3D s_length + 1.0 fig_width =3D p_length + 0.4 fig =3D figure( figsize=3D(fig_width, fig_height) ) =20 rect =3D [(0.2/fig_width), (0.5/fig_height), (p_length/fig_width), (s_length/fig_height)] =20 meter =3D H_Meter(fig, rect, xlim=3D( -0.1, p_length+0.1 ), ylim=3D( -0.4, s_length+0.1 ), xticks=3D[], yticks=3D[], ) meter.set_axis_off() fig.add_axes(meter) show() """ from __future__ import division from matplotlib.figure import Figure from matplotlib.axes import Axes import math import types from math import pi class Meter(Axes): def __init__(self, vertical, raw_value, raw_limits, raw_zones, = attribute_name, field_names, file_name, resolution, p_length, s_length, = *args, **kwargs): Axes.__init__(self, *args, **kwargs) #Perform Checking if( raw_limits[0] =3D=3D raw_limits[1] ): raise ValueError('identical_limits_exception: %s' % = raw_limits) if( raw_limits[1] > raw_limits[0] ): self.graph_positive =3D True else: #Swap the limits around self.graph_positive =3D False raw_limits[0], raw_limits[1] =3D raw_limits[1] =3D = raw_limits[0] =20 if not( ((raw_limits[2]/raw_limits[3]) % 1.0) * raw_limits[3] = =3D=3D 0 ): #There must be an integer number of minor ticks for each = major tick raise ValueError('bad_tick_spacing_exception') if( raw_limits[2] <=3D 0 or raw_limits[3] <=3D 0 or = raw_limits[2] < raw_limits[3] or raw_limits[3] > = abs(raw_limits[1]-raw_limits[0]) ): raise ValueError('bad_limits_exception:%s' % raw_limits) for zone in raw_zones: if( zone[0] > zone[1] ): #Swap the zones so zone[1] > = zone[0] zone[0], zone[1] =3D zone[1] =3D zone[0] if( zone[1] < raw_limits[0] or zone[0] > raw_limits[1] = ): raise ValueError('bad_zone_exception'%zone) if( zone[0] < raw_limits[0] ): zone[0] =3D raw_limits[0] if( zone[1] > raw_limits[1] ): zone[1] =3D raw_limits[1] =20 #Adjust the scaling self.scaled_limits =3D [] for limit in raw_limits: self.scaled_limits.append( limit * p_length / = (raw_limits[1]-raw_limits[0])) =20 =20 #Stuff all of the variables into self. self.vertical =3D vertical self.raw_value =3D raw_value self.raw_limits =3D raw_limits self.raw_zones =3D raw_zones self.attribute_name =3D attribute_name self.field_names =3D field_names self.file_name =3D file_name self.resolution =3D resolution self.p_length =3D p_length self.s_length =3D s_length =20 #Draw the meter self.graph_center =3D = ((self.scaled_limits[1]+self.scaled_limits[0])/2) for zone in raw_zones: self.draw_bar( zone, False) self.draw_bar( None, True) self.draw_ticks() self.draw_needle() if( self.vertical ): self.text( self.s_length/2, self.scaled_limits[0]-0.1, = self.attribute_name, size=3D12, va=3D'top', ha=3D'center') else: self.text( self.graph_center, self.s_length+0.25, = self.attribute_name, size=3D12, va=3D'bottom', ha=3D'center') =20 def draw_bar( self, zone, border): if( border ): start =3D self.scaled_limits[0] end =3D self.scaled_limits[1] else: start =3D (zone[0] * self.p_length / = (self.raw_limits[1]-self.raw_limits[0])) end =3D (zone[1] * self.p_length / = (self.raw_limits[1]-self.raw_limits[0])) colour =3D zone[2] =20 if( not self.graph_positive ): start =3D -start end =3D -end =20 s_vect =3D [ 0.0, 0.0, self.s_length, self.s_length ] p_vect =3D [ start, end, end, start ] =20 if( border ): #Close the loop p_vect.append(start) s_vect.append(0.0) if( self.vertical ): p =3D self.plot(s_vect, p_vect, 'b-', color=3D'black', = linewidth=3D1.5) else: p =3D self.plot(p_vect, s_vect, 'b-', color=3D'black', = linewidth=3D1.5) else: if( self.vertical ): p =3D self.fill(s_vect, p_vect, colour, linewidth=3D0.0, = alpha=3D0.4) else: p =3D self.fill(p_vect, s_vect, colour, linewidth=3D0.0, = alpha=3D0.4) def draw_needle( self ): =20 if( self.raw_value =3D=3D None ): if( self.vertical ): self.text( (self.s_length + 0.05), self.graph_center, = "N/A", size=3D10, va=3D'center', ha=3D'left') else: self.text( self.graph_center, (self.s_length + 0.05), = "N/A", size=3D10, va=3D'bottom', ha=3D'center') else: #Clamp the value to the limits value =3D self.raw_value * self.p_length / = (self.raw_limits[1]-self.raw_limits[0]) if( self.raw_value < self.raw_limits[0] ): value =3D self.raw_limits[0] * self.p_length / = (self.raw_limits[1]-self.raw_limits[0]) if( self.raw_value > self.raw_limits[1] ): value =3D self.raw_limits[1] * self.p_length / = (self.raw_limits[1]-self.raw_limits[0]) =20 if( self.vertical ): self.text( (self.s_length + 0.05), value, "%.2f" % = self.raw_value, size=3D10, va=3D'center', ha=3D'left')=20 else: self.text( value, (self.s_length + 0.05), "%.2f" % = self.raw_value, size=3D10, va=3D'bottom', ha=3D'center')=20 =20 if( not self.graph_positive ): value =3D -value s_vect =3D [ self.s_length/2, self.s_length, self.s_length ] p_vect =3D [ value + 0.00, value - 0.05, value + 0.05 ] =20 if( self.vertical ): self.fill(s_vect, p_vect, 'black') else: self.fill(p_vect, s_vect, 'black') =20 =20 def draw_ticks( self ): if( self.graph_positive ): offset =3D self.scaled_limits[0] else: offset =3D self.scaled_limits[1] i =3D 0 j =3D self.raw_limits[0] while( i*self.scaled_limits[3] + self.scaled_limits[0] <=3D = self.scaled_limits[1] ): if( i % (self.scaled_limits[2]/self.scaled_limits[3]) =3D=3D = 0): tick_length =3D self.s_length if( self.vertical ): if( type(self.raw_limits[2]) is types.FloatType ): self.text( -0.05, offset, "%.2f" % j, size=3D10, = va=3D'center', ha=3D'right')=20 else: self.text( -0.05, offset, "%d" % int(j), = size=3D10, va=3D'center', ha=3D'right') else: =20 tick_length =3D self.s_length if( type(self.raw_limits[2]) is types.FloatType ): self.text( offset, -0.05, "%.2f" % j, size=3D10, = va=3D'top', ha=3D'center')=20 else: self.text( offset, -0.05, "%d" % int(j), = size=3D10, va=3D'top', ha=3D'center')=20 j +=3D self.raw_limits[2] else: tick_length =3D self.s_length * 0.2 =20 s_vect =3D [ 0.0, tick_length ] p_vect =3D [ offset, offset ] =20 if( self.vertical ): p =3D self.plot(s_vect, p_vect, 'b-', linewidth=3D1, = color=3D'black', alpha=3D0.2) else: p =3D self.plot(p_vect, s_vect, 'b-', linewidth=3D1, = color=3D'black', alpha=3D0.2) i +=3D 1 if( self.graph_positive ): offset +=3D self.scaled_limits[3] else: offset -=3D self.scaled_limits[3] =20 if( i % (self.scaled_limits[2]/self.scaled_limits[3]) =3D=3D 0): if( self.vertical ): if( type(self.raw_limits[2]) is types.FloatType ): self.text( -0.01, offset, "%.2f" % j, size=3D10, = va=3D'top', ha=3D'center')=20 else: self.text( -0.01, offset, "%d" % int(j), size=3D10, = va=3D'top', ha=3D'center')=20 else: if( type(self.raw_limits[2]) is types.FloatType ): self.text( offset, -0.1, "%.2f" % j, size=3D10, = va=3D'top', ha=3D'center')=20 else: self.text( offset, -0.1, "%d" % int(j), size=3D10, = va=3D'top', ha=3D'center')=20 =20 def make_widget( vertical, raw_value, raw_limits, raw_zones, = attribute_name, field_names, file_name, resolution=3D72 ): from pylab import figure, show, savefig =20 p_length =3D 2.0 # Length of the Primary axis s_length =3D 0.3 # Length of the Secondary axis =20 if( vertical ):=20 fig_height =3D p_length + 0.6 fig_width =3D s_length + 1.0 fig =3D figure( figsize=3D(fig_width, fig_height) ) rect =3D [(0.5/fig_width), (0.4/fig_height), = (s_length/fig_width), (p_length/fig_height)] meter =3D Meter(vertical, raw_value,=20 raw_limits, raw_zones,=20 attribute_name, field_names,=20 file_name, resolution,=20 p_length, s_length, fig, rect, xlim=3D( -0.2, s_length+0.1 ), ylim=3D( -0.1, p_length+0.1 ), xticks=3D[], yticks=3D[] ) else: fig_height =3D s_length + 1.0 fig_width =3D p_length + 0.4 fig =3D figure( figsize=3D(fig_width, fig_height) ) rect =3D [(0.2/fig_width), (0.5/fig_height), = (p_length/fig_width), (s_length/fig_height)] meter =3D Meter(vertical, raw_value,=20 raw_limits, raw_zones,=20 attribute_name, field_names,=20 file_name, resolution, p_length, s_length, fig, rect, xlim=3D( -0.1, p_length+0.1 ), ylim=3D( -0.4, s_length+0.1 ), xticks=3D[], yticks=3D[], ) =20 meter.set_axis_off() fig.add_axes(meter) # show() fig.canvas.print_figure( file_name,dpi=3Dresolution ) =20 =20 =20 #make_widget( False, -3.0, [-10.0,10.0,5,1], = [[-10.0,0.0,'r'],[0.0,5.0,'y'],[5.0,10.0,'g']], "Rx MOS (24h)", ['WLL to = LAS','LAS to WLL','WLL to LAS','LAS to WLL'], 'meter.png', 100) =20 ''' =20 if __name__=3D=3D'__main__': from pylab import figure, show, savefig =20 vertical =3D True =20 =20 raw_value =3D None raw_limits =3D [-10.0,10.0,5,1] raw_zones =3D [[-10.0,0.0,'r'],[0.0,5.0,'y'],[5.0,10.0,'g']] attribute_name =3D "Rx MOS (24h)" =20 p_length =3D 2.0 # Length of the Primary axis s_length =3D 0.3 # Length of the Secondary axis =20 if( vertical ):=20 fig_height =3D p_length + 0.6 fig_width =3D s_length + 1.0 fig =3D figure( figsize=3D(fig_width, fig_height) ) rect =3D [(0.5/fig_width), (0.4/fig_height), = (s_length/fig_width), (p_length/fig_height)] meter =3D Meter(fig, rect, xlim=3D( -0.2, s_length+0.1 ), ylim=3D( -0.1, p_length+0.1 ), xticks=3D[], yticks=3D[], ) else: fig_height =3D s_length + 1.0 fig_width =3D p_length + 0.4 fig =3D figure( figsize=3D(fig_width, fig_height) ) rect =3D [(0.2/fig_width), (0.5/fig_height), = (p_length/fig_width), (s_length/fig_height)] meter =3D Meter(fig, rect, xlim=3D( -0.1, p_length+0.1 ), ylim=3D( -0.4, s_length+0.1 ), xticks=3D[], yticks=3D[], ) =20 meter.set_axis_off() fig.add_axes(meter) # show() fig.canvas.print_figure('meter',dpi=3D72) ''' |