@@ -44,12 +44,68 @@ 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, indicating the arguments to be converted
64
+ """
65
+ def decorator (func ):
66
+ def wrapper (* args , ** kwargs ):
67
+ axes = args [0 ]
68
+ bound_args = inspect .signature (func ).bind (* args , ** kwargs )
69
+ arguments = bound_args .arguments
70
+ has_data = (('data' in arguments ) and
71
+ (arguments ['data' ] is not None ))
72
+ if has_data :
73
+ data = arguments ['data' ]
74
+
75
+ for arg in convert_x :
76
+ if has_data and arg in data :
77
+ original_data = data [arg ]
78
+ axes ._process_unit_info (xdata = original_data , kwargs = kwargs )
79
+ converted_data = axes .convert_xunits (original_data )
80
+ data [arg ] = converted_data
81
+ else :
82
+ original_data = arguments [arg ]
83
+ axes ._process_unit_info (xdata = original_data , kwargs = kwargs )
84
+ converted_data = axes .convert_xunits (original_data )
85
+ arguments [arg ] = converted_data
86
+
87
+ for arg in convert_y :
88
+ if has_data and arg in data :
89
+ original_data = data [arg ]
90
+ axes ._process_unit_info (ydata = original_data , kwargs = kwargs )
91
+ converted_data = axes .convert_yunits (original_data )
92
+ data [arg ] = converted_data
93
+ else :
94
+ original_data = arguments [arg ]
95
+ axes ._process_unit_info (ydata = original_data , kwargs = kwargs )
96
+ converted_data = axes .convert_yunits (original_data )
97
+ arguments [arg ] = converted_data
98
+
99
+ if has_data :
100
+ arguments ['data' ] = data
101
+ bound_args .arguments = arguments
102
+ args = bound_args .args
103
+ kwargs = bound_args .kwargs
104
+ return func (* args , ** kwargs )
105
+ return wrapper
106
+ return decorator
107
+
108
+
53
109
class AxisInfo (object ):
54
110
"""
55
111
Information to support default axis labeling, tick labeling, and
0 commit comments