You can subscribe to this list here.
2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
(33) |
Dec
(20) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
(7) |
Feb
(44) |
Mar
(51) |
Apr
(43) |
May
(43) |
Jun
(36) |
Jul
(61) |
Aug
(44) |
Sep
(25) |
Oct
(82) |
Nov
(97) |
Dec
(47) |
2005 |
Jan
(77) |
Feb
(143) |
Mar
(42) |
Apr
(31) |
May
(93) |
Jun
(93) |
Jul
(35) |
Aug
(78) |
Sep
(56) |
Oct
(44) |
Nov
(72) |
Dec
(75) |
2006 |
Jan
(116) |
Feb
(99) |
Mar
(181) |
Apr
(171) |
May
(112) |
Jun
(86) |
Jul
(91) |
Aug
(111) |
Sep
(77) |
Oct
(72) |
Nov
(57) |
Dec
(51) |
2007 |
Jan
(64) |
Feb
(116) |
Mar
(70) |
Apr
(74) |
May
(53) |
Jun
(40) |
Jul
(519) |
Aug
(151) |
Sep
(132) |
Oct
(74) |
Nov
(282) |
Dec
(190) |
2008 |
Jan
(141) |
Feb
(67) |
Mar
(69) |
Apr
(96) |
May
(227) |
Jun
(404) |
Jul
(399) |
Aug
(96) |
Sep
(120) |
Oct
(205) |
Nov
(126) |
Dec
(261) |
2009 |
Jan
(136) |
Feb
(136) |
Mar
(119) |
Apr
(124) |
May
(155) |
Jun
(98) |
Jul
(136) |
Aug
(292) |
Sep
(174) |
Oct
(126) |
Nov
(126) |
Dec
(79) |
2010 |
Jan
(109) |
Feb
(83) |
Mar
(139) |
Apr
(91) |
May
(79) |
Jun
(164) |
Jul
(184) |
Aug
(146) |
Sep
(163) |
Oct
(128) |
Nov
(70) |
Dec
(73) |
2011 |
Jan
(235) |
Feb
(165) |
Mar
(147) |
Apr
(86) |
May
(74) |
Jun
(118) |
Jul
(65) |
Aug
(75) |
Sep
(162) |
Oct
(94) |
Nov
(48) |
Dec
(44) |
2012 |
Jan
(49) |
Feb
(40) |
Mar
(88) |
Apr
(35) |
May
(52) |
Jun
(69) |
Jul
(90) |
Aug
(123) |
Sep
(112) |
Oct
(120) |
Nov
(105) |
Dec
(116) |
2013 |
Jan
(76) |
Feb
(26) |
Mar
(78) |
Apr
(43) |
May
(61) |
Jun
(53) |
Jul
(147) |
Aug
(85) |
Sep
(83) |
Oct
(122) |
Nov
(18) |
Dec
(27) |
2014 |
Jan
(58) |
Feb
(25) |
Mar
(49) |
Apr
(17) |
May
(29) |
Jun
(39) |
Jul
(53) |
Aug
(52) |
Sep
(35) |
Oct
(47) |
Nov
(110) |
Dec
(27) |
2015 |
Jan
(50) |
Feb
(93) |
Mar
(96) |
Apr
(30) |
May
(55) |
Jun
(83) |
Jul
(44) |
Aug
(8) |
Sep
(5) |
Oct
|
Nov
(1) |
Dec
(1) |
2016 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
(2) |
Jul
|
Aug
(3) |
Sep
(1) |
Oct
(3) |
Nov
|
Dec
|
2017 |
Jan
|
Feb
(5) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(3) |
Aug
|
Sep
(7) |
Oct
|
Nov
|
Dec
|
2018 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(2) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
|
|
|
|
|
1
(1) |
2
|
3
|
4
|
5
(1) |
6
(3) |
7
(1) |
8
(5) |
9
|
10
|
11
|
12
|
13
(1) |
14
(2) |
15
(1) |
16
|
17
|
18
|
19
|
20
(1) |
21
(1) |
22
(1) |
23
|
24
(1) |
25
(3) |
26
(2) |
27
(5) |
28
(1) |
29
(5) |
30
|
31
|
|
|
|
|
|
|
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_values, raw_limits, raw_zones, = attribute_name, field_names, file_name, resolution, p_length, s_length, = *args, **kwargs): =20 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 #Stuff all of the variables into self. self.vertical =3D vertical self.raw_values =3D raw_values 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_dividers() self.draw_ticks() self.draw_needle() if( vertical ): self.text( self.s_length/2, self.scaled_limits[1]+0.05, = self.attribute_name, size=3D12, va=3D'bottom', ha=3D'center') else: self.text( self.graph_center, self.s_length+0.05, = 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_dividers( self ): i =3D 1 num_fields =3D len(self.raw_values) while( i < num_fields ): s_vect =3D [ (i * self.s_length)/num_fields, (i * self.s_length)/num_fields, ] p_vect =3D [ self.scaled_limits[0], self.scaled_limits[1], ] if( self.vertical ): self.plot(s_vect, p_vect, 'b-', color=3D'black', = linewidth=3D1.0) else: self.plot(p_vect, s_vect, 'b-', color=3D'black', = linewidth=3D1.0) i +=3D 1=20 =20 def draw_needle( self ): i =3D 0 =20 for raw_value in self.raw_values: =20 if( raw_value =3D=3D None ): if( self.vertical ): self.text( ((i + 1) * = self.s_length)/len(self.raw_values),(self.scaled_limits[0]-0.05), "%s : = N/A" % self.field_names[i], size=3D10, va=3D'top', ha=3D'right', = rotation=3D45) else: self.text( (self.scaled_limits[0] - 0.05), ((i + = 0.5) * self.s_length)/len(self.raw_values), "%s : N/A" % = self.field_names[i], size=3D10, va=3D'center', ha=3D'right') else: =20 #Clamp the value to the limits value =3D raw_value * self.p_length / = (self.raw_limits[1]-self.raw_limits[0]) if( raw_value < self.raw_limits[0] ): value =3D self.raw_limits[0] * self.p_length / = (self.raw_limits[1]-self.raw_limits[0]) if( 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( ((i + 1) * = self.s_length)/len(self.raw_values),(self.scaled_limits[0] - 0.05), "%s = : %.2f" % (self.field_names[i], raw_value), size=3D10, va=3D'top', = ha=3D'right', rotation=3D45)=20 else: self.text( (self.scaled_limits[0] - 0.05), ((i + = 0.5) * self.s_length)/len(self.raw_values), "%s : %.2f" % = (self.field_names[i], raw_value), size=3D10, va=3D'center', = ha=3D'right')=20 =20 if( not self.graph_positive ): value =3D -value =20 s_vect =3D [ ((i + 0 ) * self.s_length)/len(self.raw_values), ((i + 0.5) * self.s_length)/len(self.raw_values), ((i + 1 ) * self.s_length)/len(self.raw_values), ((i + 0.5) * self.s_length)/len(self.raw_values), ] p_vect =3D [ value, value - 0.05, value, value + 0.05, ] =20 if( self.vertical ): self.fill(s_vect, p_vect, 'b', alpha=3D0.4) else: self.fill(p_vect, s_vect, 'b', alpha=3D0.4) i +=3D 1 =20 =20 def draw_ticks( self ): num_fields =3D len(self.raw_values) 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: 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/num_fields) * 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_values, raw_limits, raw_zones, = attribute_name, field_names, file_name, resolution=3D72 ): from pylab import figure, show, savefig =20 p_length =3D 4.0 # Length of the Primary axis s_length =3D 0.3 * len(raw_values) # Length of the Secondary axis =20 if( vertical ):=20 fig_height =3D p_length + 1.6 fig_width =3D s_length + 1.1 fig =3D figure( figsize=3D(fig_width, fig_height) ) rect =3D [(0.9/fig_width), (1.3/fig_height), = (s_length/fig_width), (p_length/fig_height)] meter =3D Meter(vertical, raw_values,=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 + 0.5 fig_width =3D p_length + 1.9 fig =3D figure( figsize=3D(fig_width, fig_height) ) rect =3D [(1.7/fig_width), (0.2/fig_height), = (p_length/fig_width), (s_length/fig_height)] meter =3D Meter(vertical, raw_values,=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, 6.0, None, 0.25], [-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'], 'multimeter.png', 100) ''' =20 =20 if __name__=3D=3D'__main__': from pylab import figure, show, savefig =20 vertical =3D False =20 =20 raw_values =3D [-3.0, 6.0, None, 0.25] 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)" field_names =3D ['WLL to LAS','LAS to WLL','WLL to LAS','LAS to = WLL'] =20 p_length =3D 4.0 # Length of the Primary axis s_length =3D 0.3 * len(raw_values) # Length of the Secondary axis =20 if( vertical ):=20 fig_height =3D p_length + 1.6 fig_width =3D s_length + 1.1 fig =3D figure( figsize=3D(fig_width, fig_height) ) rect =3D [(0.9/fig_width), (1.3/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 + 0.5 fig_width =3D p_length + 1.9 fig =3D figure( figsize=3D(fig_width, fig_height) ) rect =3D [(1.7/fig_width), (0.2/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('multimeter',dpi=3D72) '''
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 Log_Gauge widget draws a semi-circular gauge. You supply limits, shaded regions, names and the current value, and invoke it like this: from pylab import figure, show raw_value =3D -4.0 limits =3D [ left, right ] zone_colour =3D [[-1.0,0.0,'r'],[0.0,0.5,'y'],[0.5,1.0,'g']] attribute_name =3D "Rx MOS (24h)" =20 graph_height =3D 1.6 graph_width =3D 2.4 fig_height =3D graph_height fig_width =3D graph_width fig =3D figure(figsize=3D(fig_width, fig_height )) =20 rect =3D [(0.0/fig_width), (0.2/fig_height), (graph_width/fig_width), (graph_height/fig_height)] =20 gauge =3D Gauge(fig, rect, xlim=3D( -0.1, graph_width+0.1 ), ylim=3D( -0.4, graph_height+0.1 ), xticks=3D[], yticks=3D[], ) gauge.set_axis_off() fig.add_axes(gauge) show() =20 NOTE: The limits you specify must be of this form for any value of 'n': 1.0*10^n ''' from __future__ import division from matplotlib.figure import Figure from matplotlib.axes import Axes import math import types from math import pi class Log_Gauge(Axes): def __init__(self, raw_value, raw_limits, raw_zones, attribute_name, = field_names, file_name, resolution, x_length, y_length, *args, = **kwargs): Axes.__init__(self, *args, **kwargs) =20 #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( math.log10(raw_limits[0]) % 1.0 =3D=3D 0 and = math.log10(raw_limits[1]) % 1.0 =3D=3D 0 ): raise ValueError('bad_limits_exception:%s' % raw_limits) =20 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], 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 #Stuff all of the variables into self. 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.x_length =3D x_length self.y_length =3D y_length =20 =20 #Draw the arch for zone in raw_zones: self.draw_arch( zone, False ) self.draw_arch( None, True ) self.draw_ticks() self.draw_needle() self.draw_bounding_box() self.text(0.0, 0.3, attribute_name, size=3D10, va=3D'center', = ha=3D'center') =20 #The black dot p =3D self.plot([0.0],[0.0],'.', color=3D'#000000') =20 =20 def draw_arch( self, zone, border ): if( border ): start =3D self.raw_limits[0] end =3D self.raw_limits[1] else: start =3D zone[0] end =3D zone[1] colour =3D zone[2] =20 x_vect =3D [] y_vect =3D [] if( self.graph_positive ): start_value =3D int(180 - (start - self.raw_limits[0]) * = (180.0/(self.raw_limits[1]-self.raw_limits[0]))) end_value =3D int(180 - (end - self.raw_limits[0]) * = (180.0/(self.raw_limits[1]-self.raw_limits[0]))) else: start_value =3D int( (end - self.raw_limits[0]) * = (180.0/(self.raw_limits[1]-self.raw_limits[0]))) end_value =3D int( (start - self.raw_limits[0]) * = (180.0/(self.raw_limits[1]-self.raw_limits[0]))) =20 =20 if( self.graph_positive ): start_value =3D (math.log10(start) - = math.log10(self.raw_limits[1])) * 180.00 / = -(math.log10(self.raw_limits[1]) - math.log10(self.raw_limits[0])) end_value =3D (math.log10(end) - = math.log10(self.raw_limits[1])) * 180.00 / = -(math.log10(self.raw_limits[1]) - math.log10(self.raw_limits[0])) else: start_value =3D (math.log10(end) - = math.log10(self.raw_limits[0])) * 180.00 / = +(math.log10(self.raw_limits[1]) - math.log10(self.raw_limits[0])) end_value =3D (math.log10(start) - = math.log10(self.raw_limits[0])) * 180.00 / = +(math.log10(self.raw_limits[1]) - math.log10(self.raw_limits[0])) =20 #Draw the arch theta =3D start_value radius =3D 0.85 while (theta >=3D end_value): x_vect.append( radius * math.cos(theta * (pi/180)) ) y_vect.append( radius * math.sin(theta * (pi/180)) ) theta -=3D 1 =20 theta =3D end_value radius =3D 1.0 while (theta <=3D start_value): x_vect.append( radius * math.cos(theta * (pi/180)) ) y_vect.append( radius * math.sin(theta * (pi/180)) ) theta +=3D 1 =20 if( border ): #Close the loop x_vect.append(-0.85) y_vect.append(0.0) =20 p =3D self.plot(x_vect, y_vect, 'b-', color=3D'black', = linewidth=3D1.0) else: p =3D self.fill(x_vect, y_vect, colour, linewidth=3D0.0, = alpha=3D0.4) =20 =20 def draw_needle( self ): x_vect =3D [] y_vect =3D [] =20 if self.raw_value =3D=3D None: self.text(0.0, 0.4, "N/A", size=3D10, va=3D'bottom', = ha=3D'center') else: self.text(0.0, 0.4, "%.2f" % self.raw_value, size=3D10, = va=3D'bottom', ha=3D'center') =20 #Clamp the value to the limits if( self.raw_value < self.raw_limits[0] ): self.raw_value =3D self.raw_limits[0] if( self.raw_value > self.raw_limits[1] ): self.raw_value =3D self.raw_limits[1] =20 theta =3D 0 length =3D 0.95 if( self.graph_positive ): angle =3D (math.log10(self.raw_value) - = math.log10(self.raw_limits[1])) * 180.00 / = -(math.log10(self.raw_limits[1]) - math.log10(self.raw_limits[0])) else: angle =3D (math.log10(self.raw_value) - = math.log10(self.raw_limits[0])) * 180.00 / = +(math.log10(self.raw_limits[1]) - math.log10(self.raw_limits[0])) =20 while (theta <=3D 270): x_vect.append( length * math.cos((theta + angle) * = (pi/180)) ) y_vect.append( length * math.sin((theta + angle) * = (pi/180)) ) length =3D 0.05 theta +=3D 90 p =3D self.fill(x_vect, y_vect, 'b', alpha=3D0.4) =20 =20 =20 def draw_ticks( self ): if( self.graph_positive ): angle =3D 180.0 else: angle =3D 0.0 =20 i =3D self.raw_limits[0] step =3D self.raw_limits[0] x_vect =3D [] y_vect =3D [] while( i < self.raw_limits[1] ): while( i < (step * 10) ): x_vect =3D [] y_vect =3D [] value =3D math.log10(i) if( self.graph_positive ): angle =3D (value - math.log10(self.raw_limits[1])) * = 180.00 / -(math.log10(self.raw_limits[1]) - = math.log10(self.raw_limits[0])) else: angle =3D (value - math.log10(self.raw_limits[0])) * = 180.00 / +(math.log10(self.raw_limits[1]) - = math.log10(self.raw_limits[0])) x_pos =3D 1.1 * math.cos( angle * (pi/180.0)) y_pos =3D 1.1 * math.sin( angle * (pi/180.0)) mantissa =3D int(i / math.pow(10, = math.ceil(math.log10(i))-1)) if( mantissa =3D=3D 10 or mantissa =3D=3D 1 ): if( type(self.raw_limits[2]) is types.FloatType ): self.text( x_pos, y_pos, "%.2f" % j, size=3D10, = va=3D'center', ha=3D'center', rotation=3D(angle - 90)) else: self.text( x_pos, y_pos, "%d" % int(j), = size=3D10, va=3D'center', ha=3D'center', rotation=3D(angle - 90)) tick_length =3D 0.15 else: tick_length =3D 0.05 x_vect.append( 1.0 * math.cos( angle * (pi/180.0))) x_vect.append( (1.0 - tick_length) * math.cos( angle * = (pi/180.0))) y_vect.append( 1.0 * math.sin( angle * (pi/180.0))) y_vect.append( (1.0 - tick_length) * math.sin( angle * = (pi/180.0))) p =3D self.plot(x_vect, y_vect, 'b-', linewidth=3D1, = alpha=3D0.4, color=3D"black") =20 i +=3D step i =3D step * 10 step =3D step * 10 i =3D self.raw_limits[1] value =3D math.log10(i) if( self.graph_positive ): angle =3D (value - math.log10(self.raw_limits[1])) * 180.00 = / -(math.log10(self.raw_limits[1]) - math.log10(self.raw_limits[0])) else: angle =3D (value - math.log10(self.raw_limits[0])) * 180.00 = / +(math.log10(self.raw_limits[1]) - math.log10(self.raw_limits[0])) x_pos =3D 1.1 * math.cos( angle * (pi/180.0)) y_pos =3D 1.1 * math.sin( angle * (pi/180.0)) mantissa =3D int(i / math.pow(10, math.ceil(math.log10(i))-1)) if( mantissa =3D=3D 10 ): if( type(self.raw_limits[2]) is types.FloatType ): self.text( x_pos, y_pos, "%.2f" % j, size=3D10, = va=3D'center', ha=3D'center', rotation=3D(angle - 90)) else: self.text( x_pos, y_pos, "%d" % int(j), size=3D10, = va=3D'center', ha=3D'center', rotation=3D(angle - 90)) =20 =わ20 =わ20 =わ20 def draw_bounding_box( self ): x_vect =3D [ self.x_length/2, self.x_length/2, -self.x_length/2, -self.x_length/2, self.x_length/2, ] y_vect =3D [ -0.1, self.y_length, self.y_length, -0.1, -0.1, ] p =3D self.plot(x_vect, y_vect, 'r-', linewidth=3D0) =20 =20 =20 def make_widget( raw_value, raw_limits, raw_zones, attribute_name, = field_names, file_name, resolution=3D72 ): =20 from pylab import figure, show, savefig x_length =3D 2.4 # Length of the Primary axis y_length =3D 1.6 # Length of the Secondary axis =20 fig_height =3D y_length fig_width =3D x_length fig =3D figure( figsize=3D(fig_width, fig_height) ) rect =3D [(0.0/fig_width), (0.2/fig_height), (x_length/fig_width), = (y_length/fig_height)] gauge =3D Log_Gauge( raw_value,=20 raw_limits, raw_zones,=20 attribute_name, field_names,=20 file_name, resolution, x_length, y_length, fig, rect, xlim=3D( -0.1, x_length+0.1 ), ylim=3D( -0.4, y_length+0.1 ), xticks=3D[], yticks=3D[], ) =20 gauge.set_axis_off() fig.add_axes(gauge) # show() fig.canvas.print_figure( file_name,dpi=3Dresolution ) =20 =20 =20 #make_widget( 0.01, [0.001,10.0], = [[0.001,0.01,'r'],[0.01,0.1,'y'],[0.1,10.0,'g']], "Rx MOS (24h)", ['WLL = to LAS','LAS to WLL','WLL to LAS','LAS to WLL'], 'log_gauge.png', 100) =20 =20 =20 ''' =20 if __name__=3D=3D'__main__': from pylab import figure, show =20 raw_value =3D -4.0 limits =3D [0.0001,1.0] zone_colour =3D [[0.0001,0.001,'r'],[0.001,0.1,'y'],[0.1,1.0,'g']] attribute_name =3D "Rx MOS (24h)" =20 graph_height =3D 1.6 graph_width =3D 2.4 fig_height =3D graph_height fig_width =3D graph_width fig =3D figure( figsize=3D(fig_width, fig_height) ) =20 rect =3D [(0.0/fig_width), (0.2/fig_height), (graph_width/fig_width), (graph_height/fig_height)] =20 gauge =3D Log_Gauge(fig, rect, xlim=3D( -0.1, graph_width+0.1 ), ylim=3D( -0.4, graph_height+0.1 ), xticks=3D[], yticks=3D[], ) gauge.set_axis_off() fig.add_axes(gauge) =20 #show() fig.canvas.print_figure('log_gauge',dpi=3D72) ''' =20 =20
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 Gauge widget draws a semi-circular gauge. You supply raw_limits, shaded regions, names and the current value, and invoke it like this: from pylab import figure, show raw_value =3D -4.0 raw_limits =3D [-1.0,1.0,1,0.1] raw_zones =3D [[-1.0,0.0,'r'],[0.0,0.5,'y'],[0.5,1.0,'g']] attribute_name =3D "Rx MOS (24h)" =20 graph_height =3D 1.6 graph_width =3D 2.4 fig_height =3D graph_height fig_width =3D graph_width fig =3D figure(figsize=3D(fig_width, fig_height )) =20 rect =3D [(0.0/fig_width), (0.2/fig_height), (graph_width/fig_width), (graph_height/fig_height)] =20 gauge =3D Gauge(fig, rect, xlim=3D( -0.1, graph_width+0.1 ), ylim=3D( -0.4, graph_height+0.1 ), xticks=3D[], yticks=3D[], ) gauge.set_axis_off() fig.add_axes(gauge) show() """ from __future__ import division from matplotlib.figure import Figure from matplotlib.axes import Axes import math import types from math import pi =20 class Gauge(Axes): def __init__(self, raw_value, raw_limits, raw_zones, attribute_name, = field_names, file_name, resolution, x_length, y_length, *args, = **kwargs): Axes.__init__(self, *args, **kwargs) #Perform Checking if( raw_limits[0] =3D=3D raw_limits[1] ): raise ValueError('identical_raw_limits_exception: = %s'%raw_limits) if( raw_limits[1] > raw_limits[0] ): self.graph_positive =3D True else: #Swap the raw_limits around self.graph_positive =3D False raw_limits[0], raw_limits[1] =3D raw_limits[1] =3D = raw_limits[0] #There must be an integer number of minor ticks for each major = tick if not( ((raw_limits[2]/raw_limits[3]) % 1.0) * raw_limits[3] = =3D=3D 0 ): =20 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_raw_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], 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] #Stuff all of the variables into self. 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.x_length =3D x_length self.y_length =3D y_length =20 =20 #Draw the gauge for zone in raw_zones: self.draw_arch( zone, False ) self.draw_arch( None, True ) self.draw_ticks() self.draw_needle() self.draw_bounding_box() self.text(0.0, 0.2, self.attribute_name, size=3D10, = va=3D'bottom', ha=3D'center') #The black dot p =3D self.plot([0.0],[0.0],'.', color=3D'#000000') def draw_arch( self, zone, border ): if( border ): start =3D self.raw_limits[0] end =3D self.raw_limits[1] else: start =3D zone[0] end =3D zone[1] colour =3D zone[2] =20 x_vect =3D [] y_vect =3D [] if( self.graph_positive ): start_value =3D int(180 - (start - self.raw_limits[0]) * = (180.0/(self.raw_limits[1]-self.raw_limits[0]))) end_value =3D int(180 - (end - self.raw_limits[0]) * = (180.0/(self.raw_limits[1]-self.raw_limits[0]))) else: start_value =3D int( (end - self.raw_limits[0]) * = (180.0/(self.raw_limits[1]-self.raw_limits[0]))) end_value =3D int( (start - self.raw_limits[0]) * = (180.0/(self.raw_limits[1]-self.raw_limits[0]))) #Draw the arch theta =3D start_value radius =3D 0.85 while (theta >=3D end_value): x_vect.append( radius * math.cos(theta * (pi/180)) ) y_vect.append( radius * math.sin(theta * (pi/180)) ) theta -=3D 1 theta =3D end_value radius =3D 1.0 while (theta <=3D start_value): x_vect.append( radius * math.cos(theta * (pi/180)) ) y_vect.append( radius * math.sin(theta * (pi/180)) ) theta +=3D 1 if( border ): #Close the loop x_vect.append(-0.85) y_vect.append(0.0) p =3D self.plot(x_vect, y_vect, 'b-', color=3D'black', = linewidth=3D1.0) else: p =3D self.fill(x_vect, y_vect, colour, linewidth=3D0.0, = alpha=3D0.4) def draw_needle( self ): x_vect =3D [] y_vect =3D [] if self.raw_value =3D=3D None: self.text(0.0, 0.4, "N/A", size=3D10, va=3D'bottom', = ha=3D'center') else: self.text(0.0, 0.4, "%.2f" % self.raw_value, size=3D10, = va=3D'bottom', ha=3D'center') #Clamp the value to the raw_limits if( self.raw_value < self.raw_limits[0] ): self.raw_value =3D self.raw_limits[0] if( self.raw_value > self.raw_limits[1] ): self.raw_value =3D self.raw_limits[1] theta =3D 0 length =3D 0.95 if( self.graph_positive ): angle =3D 180.0 - (self.raw_value - self.raw_limits[0]) = *(180.0/abs(self.raw_limits[1]-self.raw_limits[0])) else: angle =3D (self.raw_value - self.raw_limits[0]) = *(180.0/abs(self.raw_limits[1]-self.raw_limits[0])) while (theta <=3D 270): x_vect.append( length * math.cos((theta + angle) * = (pi/180)) ) y_vect.append( length * math.sin((theta + angle) * = (pi/180)) ) length =3D 0.05 theta +=3D 90 p =3D self.fill(x_vect, y_vect, 'b', alpha=3D0.4) def draw_ticks( self ): if( self.graph_positive ): angle =3D 180.0 else: angle =3D 0.0 i =3D 0 j =3D self.raw_limits[0] while( i*self.raw_limits[3] + self.raw_limits[0] <=3D = self.raw_limits[1] ): x_vect =3D [] y_vect =3D [] if( i % (self.raw_limits[2]/self.raw_limits[3]) =3D=3D 0 ): x_pos =3D 1.1 * math.cos( angle * (pi/180.0)) y_pos =3D 1.1 * math.sin( angle * (pi/180.0)) if( type(self.raw_limits[2]) is types.FloatType ): self.text( x_pos, y_pos, "%.2f" % j, size=3D10, = va=3D'center', ha=3D'center', rotation=3D(angle - 90)) else: self.text( x_pos, y_pos, "%d" % int(j), size=3D10, = va=3D'center', ha=3D'center', rotation=3D(angle - 90)) tick_length =3D 0.15 j +=3D self.raw_limits[2] else: tick_length =3D 0.05 i +=3D 1 x_vect.append( 1.0 * math.cos( angle * (pi/180.0))) x_vect.append( (1.0 - tick_length) * math.cos( angle * = (pi/180.0))) y_vect.append( 1.0 * math.sin( angle * (pi/180.0))) y_vect.append( (1.0 - tick_length) * math.sin( angle * = (pi/180.0))) p =3D self.plot(x_vect, y_vect, 'b-', linewidth=3D1, = alpha=3D0.4, color=3D"black") if( self.graph_positive ): angle -=3D self.raw_limits[3] * = (180.0/abs(self.raw_limits[1]-self.raw_limits[0])) else: angle +=3D self.raw_limits[3] * = (180.0/abs(self.raw_limits[1]-self.raw_limits[0])) if( i % (self.raw_limits[2]/self.raw_limits[3]) =3D=3D 0 ): x_pos =3D 1.1 * math.cos( angle * (pi/180.0)) y_pos =3D 1.1 * math.sin( angle * (pi/180.0)) if( type(self.raw_limits[2]) is types.FloatType ): self.text( x_pos, y_pos, "%.2f" % j, size=3D10, = va=3D'center', ha=3D'center', rotation=3D(angle - 90)) else: self.text( x_pos, y_pos, "%d" % int(j), size=3D10, = va=3D'center', ha=3D'center', rotation=3D(angle - 90)) =20 def draw_bounding_box( self ): x_vect =3D [ self.x_length/2, self.x_length/2, -self.x_length/2, -self.x_length/2, self.x_length/2, ] y_vect =3D [ -0.1, self.y_length, self.y_length, -0.1, -0.1, ] p =3D self.plot(x_vect, y_vect, 'r-', linewidth=3D0) def make_widget( raw_value, raw_limits, raw_zones, attribute_name, = field_names, file_name, resolution=3D72 ): from pylab import figure, show, savefig =20 x_length =3D 2.4 # Length of the Primary axis y_length =3D 1.6 # Length of the Secondary axis =20 fig_height =3D y_length fig_width =3D x_length fig =3D figure( figsize=3D(fig_width, fig_height) ) rect =3D [(0.0/fig_width), (0.2/fig_height), (x_length/fig_width), = (y_length/fig_height)] gauge =3D Gauge( raw_value,=20 raw_limits, raw_zones,=20 attribute_name, field_names,=20 file_name, resolution, x_length, y_length, fig, rect, xlim=3D( -0.1, x_length+0.1 ), ylim=3D( -0.4, y_length+0.1 ), xticks=3D[], yticks=3D[], ) =20 gauge.set_axis_off() fig.add_axes(gauge) # show() fig.canvas.print_figure( file_name,dpi=3Dresolution ) =20 =20 =20 #make_widget( -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'], 'gauge.png', 100) =20 =20 ''' if __name__=3D=3D'__main__': from pylab import figure, show =20 raw_value =3D -4.0 raw_limits =3D [-1.0,1.0,1,0.1] raw_zones =3D [[-1.0,0.0,'r'],[0.0,0.5,'y'],[0.5,1.0,'g']] attribute_name =3D "Rx MOS (24h)" =20 graph_height =3D 1.6 graph_width =3D 2.4 fig_height =3D graph_height fig_width =3D graph_width fig =3D figure( figsize=3D(fig_width, fig_height) ) =20 rect =3D [(0.0/fig_width), (0.2/fig_height), (graph_width/fig_width), (graph_height/fig_height)] =20 gauge =3D Gauge(fig, rect, xlim=3D( -0.1, graph_width+0.1 ), ylim=3D( -0.4, graph_height+0.1 ), xticks=3D[], yticks=3D[], ) gauge.set_axis_off() fig.add_axes(gauge) show() fig.canvas.print_figure('gauge',dpi=3D72) =20 ''' =20
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 Log_Meter widget draws a logarithmic 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 Log_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( math.log10(raw_limits[0]) % 1.0 =3D=3D 0 and = math.log10(raw_limits[1]) % 1.0 =3D=3D 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 =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 = ((math.log10(self.raw_limits[0])+math.log10(self.raw_limits[1]))/2) for zone in raw_zones: self.draw_bar( zone, False) self.draw_bar( None, True) self.draw_ticks() self.draw_needle() if( vertical ): self.text( self.s_length/2, = math.log10(self.raw_limits[0])-0.2, 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.raw_limits[0] end =3D self.raw_limits[1] else: start =3D zone[0] end =3D zone[1] colour =3D zone[2] =20 if( self.graph_positive ): start =3D math.log10(start) end =3D math.log10(end) else: start =3D -math.log10(start) end =3D -math.log10(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 ): 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 math.log10(self.raw_value) if( self.raw_value < self.raw_limits[0] ): value =3D math.log10(self.raw_limits[0]) if( self.raw_value > self.raw_limits[1] ): value =3D math.log10(self.raw_limits[1]) =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.1, value + 0.1 ] =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 ): i =3D self.raw_limits[0] step =3D self.raw_limits[0] while( i < self.raw_limits[1] ): while( i < (step * 10) ): value =3D math.log10(i) if( not self.graph_positive ): value =3D -value mantissa =3D int(i / math.pow(10, = math.ceil(math.log10(i))-1)) if( mantissa =3D=3D 10 or mantissa =3D=3D 1 ): if( self.vertical ): self.text( -0.05, value, "%g" % i, size=3D10, = va=3D'center', ha=3D'right') else: =20 self.text( value, -0.05, "%g" % i, size=3D10, = va=3D'top', ha=3D'center')=20 tick_length =3D self.s_length else: tick_length =3D self.s_length * 0.2 s_vect =3D [ 0.0, tick_length ] p_vect =3D [ value, value ] 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 step i =3D step * 10 step =3D step * 10 i =3D self.raw_limits[1] value =3D math.log10(i) if( not self.graph_positive ): value =3D -value mantissa =3D int(i / math.pow(10, math.ceil(math.log10(i))-1)) if( mantissa =3D=3D 10 ): if( self.vertical ): self.text( -0.05, value, "%g" % i, size=3D10, = va=3D'center', ha=3D'right') else: =20 self.text( value, -0.05, "%g" % i, size=3D10, = va=3D'top', ha=3D'center')=20 =20 =20 def make_widget( vertical, raw_value, raw_limits, raw_zones, = attribute_name, field_names, file_name, resolution=3D72 ): =20 from pylab import figure, show, savefig 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( True, 0.01, [0.001,10.0], = [[0.001,0.01,'r'],[0.01,0.1,'y'],[0.1,10.0,'g']], "Rx MOS (24h)", ['WLL = to LAS','LAS to WLL','WLL to LAS','LAS to WLL'], 'log_meter.png', 100) =20 ''' =20 =20 if __name__=3D=3D'__main__': from pylab import figure, show, savefig =20 vertical =3D True =20 =20 raw_value =3D 0.1 raw_limits =3D [0.0001,10.0,5,1] raw_zones =3D [[0.0001,0.001,'r'],[0.001,0.1,'y'],[0.1,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('log_meter',dpi=3D72) '''
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) '''