SourceForge logo
SourceForge logo
Menu

matplotlib-devel — matplotlib developers

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






Showing 5 results of 5

From: Jamil K. <jam...@ca...> - 2005年07月27日 04:05:58
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)
'''
From: Jamil K. <jam...@ca...> - 2005年07月27日 04:04:46
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
From: Jamil K. <jam...@ca...> - 2005年07月27日 04:04:16
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
From: Jamil K. <jam...@ca...> - 2005年07月27日 04:03:16
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)
'''
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)
'''

Showing 5 results of 5

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.
Thanks for helping keep SourceForge clean.
X





Briefly describe the problem (required):
Upload screenshot of ad (required):
Select a file, or drag & drop file here.
Screenshot instructions:

Click URL instructions:
Right-click on the ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)

More information about our ad policies

Ad destination/click URL:

AltStyle によって変換されたページ (->オリジナル) /