Package gmisclib :: Module pylab_starplot
[frames] | no frames]

Source Code for Module gmisclib.pylab_starplot

  1  """This makes a little 'star' of error bars, using pylab/matplotlib. 
  2  """ 
  3   
  4  import math 
  5   
  6  import pylab 
  7  import matplotlib 
  8   
  9  Grey = (0.7,0.7,0.7) 
 10   
11 -class errorbar_maker(object):
12 """This is a class that makes error bars, tilted at various angles.""" 13
14 - def __init__(self, cx, cy, n, **kwargs):
15 self.cx = cx 16 self.cy = cy 17 self.n = n 18 self.kwargs = {'marker': 'o', 'linestyle': '-', 19 'mec': 'r', 'color': 'k', 'zorder': 2 20 } 21 self.kwargs.update(kwargs)
22 23
24 - def make(self, i, xl, xc, xh, **kwargs):
25 kwa = self.kwargs.copy() 26 kwa.update(kwargs) 27 assert xl <= xc <= xh 28 theta = (math.pi/2.0) * (1 + (i-0.5*(self.n-1))/float(self.n)) 29 W = 0.12*(abs(xl)+abs(xh))/float(self.n) 30 w = kwa.get('w', W) 31 x1, y1 = self._xf(theta, (xl, 0.0), (xh, 0.0)) 32 x2, y2 = self._xf(theta, (xl, -w), (xl, w)) 33 x3, y3 = self._xf(theta, (xh, -w), (xh, w)) 34 if (xl>0)==(xh>0): 35 zo = 2 36 else: 37 mcolor = kwa.get('mucolor', Grey) 38 color = kwa.get('lucolor', Grey) 39 zo = 1 40 zorder = kwa['zorder'] 41 mcolor = kwa['mec'] 42 color = kwa['color'] 43 linestyle = kwa['linestyle'] 44 pylab.plot(x1, y1, linestyle=linestyle, color=color, zorder=zorder) 45 pylab.plot(x2, y2, linestyle=linestyle, color=color, zorder=zorder) 46 pylab.plot(x3, y3, linestyle=linestyle, color=color, zorder=zorder) 47 if min(xl, xh) > 0.0: 48 x5, y5 = self._xf(theta, (0.0, 0.0), (min(xl, xh), 0.0)) 49 pylab.plot(x5, y5, linestyle=':', color=color, zorder=100) 50 if max(xl, xh) < 0.0: 51 x5, y5 = self._xf(theta, (0.0, 0.0), (max(xl, xh), 0.0)) 52 pylab.plot(x5, y5, linestyle=':', color=color, zorder=100) 53 x4, y4 = self._xf(theta, (xc, 0)) 54 pylab.plot(x4, y4, marker=kwa['marker'], linestyle='', mec=mcolor, mew=0.0, 55 color=mcolor, zorder=zorder)
56 57
58 - def _xf(self, theta, *xy):
59 ox = [] 60 oy = [] 61 for (x,y) in xy: 62 xx = self.cx + math.cos(theta)*x - math.sin(theta)*y 63 yy = self.cy + math.sin(theta)*x + math.cos(theta)*y 64 ox.append(xx) 65 oy.append(yy) 66 return (ox, oy)
67 68 69
70 -def grey_out(c):
71 r, g, b = matplotlib.colors.colorConverter.to_rgb(c) 72 return (0.2*r+0.6, 0.2*g+0.6, 0.2*b+0.6)
73 74 75
76 -class errorbar(object):
77 - def __init__(self, l, c, h, dim=False, sortorder=None, **kwargs):
78 self.l = l 79 self.c = c 80 self.h = h 81 self.dim = dim 82 self.order = sortorder 83 self.kwargs = kwargs
84
85 - def __mul__(self, other):
86 return errorbar(self.l*other, self.c*other, self.h*other, self.dim, **(self.kwargs))
87
88 - def __cmp__(self, other):
89 return cmp(self.order, other.order)
90 91
92 -def star(cx, cy, lch, lcolormap=None, mcolormap=None, dimmer=grey_out, **kwargs):
93 """This makes a star of error bars. 94 @param cx: x-coordinate of the star center 95 @param cy: y-coordinate of the star center 96 @param lch: list of error bars to create about the center. 97 @type lch: list(errorbar). 98 """ 99 e = errorbar_maker(cx, cy, len(lch), **kwargs) 100 for (i, ebar) in enumerate(lch): 101 kwa = {} 102 if lcolormap is not None: 103 kwa['color'] = lcolormap[i] 104 elif mcolormap is not None: 105 kwa['color'] = mcolormap[i] 106 if mcolormap is not None: 107 kwa['mec'] = mcolormap[i] 108 elif lcolormap is not None: 109 kwa['mec'] = lcolormap[i] 110 kwa.update(ebar.kwargs) 111 if ebar.dim: 112 kwa['color'] = dimmer(kwa['color']) 113 kwa['mec'] = dimmer(kwa['mec']) 114 kwa['zorder'] = 1 115 e.make(i, ebar.l, ebar.c, ebar.h, **kwa)
116 # pylab.plot([cx], [cy], 'ro') 117 118
119 -def plot(xlch, **kwargs):
120 assert xlch 121 sz = 0.0 122 n = 0 123 dx = 0.0 124 xlast = None 125 for (x, llch) in xlch: 126 for lch in llch: 127 if lch is not None: 128 sz += max(abs(lch.l), abs(lch.h))**2 129 n += 1 130 if xlast is not None: 131 dx += abs(x-xlast) 132 xlast = x 133 if n == 0: 134 return 135 f = 0.5*(dx/(len(xlch)-1))/math.sqrt(sz/float(n)) 136 for (x, llch) in xlch: 137 star(x, 0.0, 138 [lch*f for lch in llch if lch is not None ], 139 **kwargs)
140 141 142 if __name__ == '__main__': 143 plot( [(0.0, [errorbar(0, 1, 2), errorbar(0, 2, 3), errorbar(0, 2, 3), errorbar(0, 1, 2)]), 144 (1.0, [errorbar(0, 1, 2), errorbar(1, 2, 3), errorbar(1, 2, 3), errorbar(0, 1, 2)]), 145 (2.0, [errorbar(-1, 1, 2, dim=True), errorbar(-1, 0, 1, dim=True), errorbar(-1, -0.5, 0), errorbar(-1, -0.5, -0.25)]) 146 ], 147 lcolormap = ['r', 'g', 'b', 'c', 'm', 'k'] 148 ) 149 pylab.show() 150