@@ -44,12 +44,70 @@ def default_units(x, axis):
44
44
from __future__ import (absolute_import , division , print_function ,
45
45
unicode_literals )
46
46
47
-
47
+ import inspect
48
48
import six
49
49
from matplotlib .cbook import iterable , is_numlike , safe_first_element
50
50
import numpy as np
51
51
52
52
53
+ def _accepts_units (convert_x , convert_y ):
54
+ """
55
+ A decorator for functions and methods that accept units. The parameters
56
+ indicated in *convert_x* and *convert_y* are used to update the axis
57
+ unit information, are converted, and then handed on to the decorated
58
+ function.
59
+
60
+ Parameters
61
+ ----------
62
+ convert_x, convert_y : list
63
+ A list of integers or strings (can be mixed). Integers denote
64
+ non-keyword arguments to be converted, and strings denote keyword
65
+ arguments to be converted.
66
+ """
67
+ def decorator (func ):
68
+ def wrapper (* args , ** kwargs ):
69
+ axes = args [0 ]
70
+ bound_args = inspect .signature (func ).bind (* args , ** kwargs )
71
+ arguments = bound_args .arguments
72
+ has_data = (('data' in arguments ) and
73
+ (arguments ['data' ] is not None ))
74
+ if has_data :
75
+ data = arguments ['data' ]
76
+
77
+ for arg in convert_x :
78
+ if has_data and arg in data :
79
+ original_data = data [arg ]
80
+ axes ._process_unit_info (xdata = original_data , kwargs = kwargs )
81
+ converted_data = axes .convert_xunits (original_data )
82
+ data [arg ] = converted_data
83
+ else :
84
+ original_data = arguments [arg ]
85
+ axes ._process_unit_info (xdata = original_data , kwargs = kwargs )
86
+ converted_data = axes .convert_xunits (original_data )
87
+ arguments [arg ] = converted_data
88
+
89
+ for arg in convert_y :
90
+ if has_data and arg in data :
91
+ original_data = data [arg ]
92
+ axes ._process_unit_info (ydata = original_data , kwargs = kwargs )
93
+ converted_data = axes .convert_yunits (original_data )
94
+ data [arg ] = converted_data
95
+ else :
96
+ original_data = arguments [arg ]
97
+ axes ._process_unit_info (ydata = original_data , kwargs = kwargs )
98
+ converted_data = axes .convert_yunits (original_data )
99
+ arguments [arg ] = converted_data
100
+
101
+ if has_data :
102
+ arguments ['data' ] = data
103
+ bound_args .arguments = arguments
104
+ args = bound_args .args
105
+ kwargs = bound_args .kwargs
106
+ return func (* args , ** kwargs )
107
+ return wrapper
108
+ return decorator
109
+
110
+
53
111
class AxisInfo (object ):
54
112
"""
55
113
Information to support default axis labeling, tick labeling, and
0 commit comments