forked from matplotlib/matplotlib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
boilerplate.py
250 lines (227 loc) · 6.76 KB
/
boilerplate.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
# Wrap the plot commands defined in axes. The code generated by this
# file is pasted into pyplot.py. We did try to do this the smart way,
# with callable functions and new.function, but could never get the
# docstrings right for python2.2. See
# http://groups.google.com/group/comp.lang.python/browse_frm/thread/dcd63ec13096a0f6/1b14640f3a4ad3dc?#1b14640f3a4ad3dc
# For some later history, see
# http://thread.gmane.org/gmane.comp.python.matplotlib.devel/7068
import inspect
import random
import re
import sys
import types
# import the local copy of matplotlib, not the installed one
#sys.path.insert(0, './lib')
from matplotlib.axes import Axes
from matplotlib.cbook import dedent
_fmtplot = """\
# This function was autogenerated by boilerplate.py. Do not edit as
# changes will be lost
@autogen_docstring(Axes.%(func)s)
def %(func)s(%(argspec)s):
%(ax)s = gca()
# allow callers to override the hold state by passing hold=True|False
%(washold)s = %(ax)s.ishold()
%(sethold)s
if hold is not None:
%(ax)s.hold(hold)
try:
%(ret)s = %(ax)s.%(func)s(%(call)s)
draw_if_interactive()
finally:
%(ax)s.hold(%(washold)s)
%(mappable)s
return %(ret)s
"""
_fmtmisc = """\
# This function was autogenerated by boilerplate.py. Do not edit as
# changes will be lost
@docstring.copy_dedent(Axes.%(func)s)
def %(func)s(%(argspec)s):
%(ret)s = gca().%(func)s(%(call)s)
draw_if_interactive()
return %(ret)s
"""
# these methods are all simple wrappers of Axes methods by the same
# name.
_plotcommands = (
'acorr',
'arrow',
'axhline',
'axhspan',
'axvline',
'axvspan',
'bar',
'barh',
'broken_barh',
'boxplot',
'cohere',
'clabel',
'contour',
'contourf',
'csd',
'errorbar',
'fill',
'fill_between',
'fill_betweenx',
'hexbin',
'hist',
'hlines',
'imshow',
'loglog',
'pcolor',
'pcolormesh',
'pie',
'plot',
'plot_date',
'psd',
'quiver',
'quiverkey',
'scatter',
'semilogx',
'semilogy',
'specgram',
#'spy',
'stem',
'step',
'streamplot',
'tricontour',
'tricontourf',
'tripcolor',
'triplot',
'vlines',
'xcorr',
'barbs',
)
_misccommands = (
'cla',
'grid',
'legend',
'table',
'text',
'annotate',
'ticklabel_format',
'locator_params',
'tick_params',
'margins',
'autoscale',
)
cmappable = {
'contour' : 'if %(ret)s._A is not None: sci(%(ret)s)',
'contourf': 'if %(ret)s._A is not None: sci(%(ret)s)',
'hexbin' : 'sci(%(ret)s)',
'scatter' : 'sci(%(ret)s)',
'pcolor' : 'sci(%(ret)s)',
'pcolormesh': 'sci(%(ret)s)',
'imshow' : 'sci(%(ret)s)',
#'spy' : 'sci(%(ret)s)', ### may return image or Line2D
'quiver' : 'sci(%(ret)s)',
'specgram' : 'sci(%(ret)s[-1])',
'streamplot' : 'sci(%(ret)s)',
'tricontour' : 'if %(ret)s._A is not None: sci(%(ret)s)',
'tricontourf': 'if %(ret)s._A is not None: sci(%(ret)s)',
'tripcolor' : 'sci(%(ret)s)',
}
def format_value(value):
"""
Format function default values as needed for inspect.formatargspec.
The interesting part is a hard-coded list of functions used
as defaults in pyplot methods.
"""
if isinstance(value, types.FunctionType):
if value.func_name in ('detrend_none', 'window_hanning'):
return '=mlab.' + value.func_name
if value.func_name == 'mean':
return '=np.' + value.func_name
raise ValueError, ('default value %s unknown to boilerplate.formatvalue'
% value)
return '='+repr(value)
def remove_final_whitespace(string):
"""
Return a copy of *string* with final whitespace removed from each line.
"""
return '\n'.join(x.rstrip() for x in string.split('\n'))
for fmt,cmdlist in (_fmtplot,_plotcommands),(_fmtmisc,_misccommands):
for func in cmdlist:
# For some commands, an additional line is needed to set the
# color map
if func in cmappable:
mappable = cmappable[func] % locals()
else:
mappable = ''
# Get argspec of wrapped function
args, varargs, varkw, defaults = inspect.getargspec(getattr(Axes, func))
args.pop(0) # remove 'self' argument
if defaults is None:
defaults = ()
# How to call the wrapped function
call = map(str, args)
if varargs is not None:
call.append('*'+varargs)
if varkw is not None:
call.append('**'+varkw)
call = ', '.join(call)
# Add a hold keyword argument if needed (fmt is _fmtplot) and
# possible (if *args is used, we can't just add a hold
# argument in front of it since it would gobble one of the
# arguments the user means to pass via *args)
if varargs:
sethold = "hold = %(varkw)s.pop('hold', None)" % locals()
elif fmt is _fmtplot:
args.append('hold')
defaults = defaults + (None,)
sethold = ''
# Now we can build the argspec for defining the wrapper
argspec = inspect.formatargspec(args, varargs, varkw, defaults,
formatvalue=format_value)
argspec = argspec[1:-1] # remove parens
# A gensym-like facility in case some function takes an
# argument named washold, ax, or ret
washold,ret,ax = 'washold', 'ret', 'ax'
bad = set(args) | set((varargs, varkw))
while washold in bad or ret in bad or ax in bad:
washold = 'washold' + str(random.randrange(10**12))
ret = 'ret' + str(random.randrange(10**12))
ax = 'ax' + str(random.randrange(10**12))
# Since we can't avoid using some function names,
# bail out if they are used as argument names
for reserved in ('gca', 'gci', 'draw_if_interactive'):
if reserved in bad:
raise ValueError, \
'Axes method %s has kwarg named %s' % (func, reserved)
print remove_final_whitespace(fmt%locals())
# define the colormap functions
_fmtcmap = """\
# This function was autogenerated by boilerplate.py. Do not edit as
# changes will be lost
def %(name)s():
'''
set the default colormap to %(name)s and apply to current image if any.
See help(colormaps) for more information
'''
rc('image', cmap='%(name)s')
im = gci()
if im is not None:
im.set_cmap(cm.%(name)s)
draw_if_interactive()
"""
cmaps = (
'autumn',
'bone',
'cool',
'copper',
'flag',
'gray' ,
'hot',
'hsv',
'jet' ,
'pink',
'prism',
'spring',
'summer',
'winter',
'spectral'
)
# add all the colormaps (autumn, hsv, ....)
for name in cmaps:
print _fmtcmap%locals()