SourceForge logo
SourceForge logo
Menu

matplotlib-devel

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)
'''
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 によって変換されたページ (->オリジナル) /