1616# I think currently, tick visibility will override settings from other setters... need to fix that
1717# implement allowed_params check like started in layout_v1
1818# find solution for tick_labels
19- # parse_axis_params needs better input filtering... currently everything goes through
2019
2120
2221def layout_v2 (
@@ -56,7 +55,7 @@ def layout_v2(
5655 x_label_params , x_tick_params , x_params = compile_axis_settings (axis_params , axis = 'x' )
5756 y_label_params , y_tick_params , y_params = compile_axis_settings (axis_params , axis = 'y' )
5857
59- title_settings = get_hook_dict (static_kwargs , 'title_' , remove_hook = True )
58+ title_settings = utils . get_hook_dict_v2 (static_kwargs , 'title_' , remove_hook = True )
6059
6160 # ensure axs is a list
6261 if not isinstance (axs , Iterable ):
@@ -113,9 +112,25 @@ def viz(
113112 * ,
114113 ticks : _tick_vis = None ,
115114 grid : _grid_vis = None ,
116- minor : bool = None ,
115+ minor : _tick_vis = None ,
117116 ** kwargs ,
118117):
118+ def value_check (param , value ):
119+ if value is None :
120+ return
121+ if type (value ) is bool :
122+ return
123+ if value not in [v for v in _tick_vis .__args__ if type (v ) is str ]:
124+ raise ValueError (f'Invalid { param } param: { value } ' )
125+
126+ value_check ('ticks' , ticks )
127+ value_check ('minor' , minor )
128+ for k , v in kwargs .items ():
129+ if k .endswith ('_ticks' ):
130+ value_check (k , v )
131+ if k .endswith ('_minor' ):
132+ value_check (k , v )
133+
119134 viz_args = {
120135 k : v
121136 for k , v in {
@@ -135,35 +150,17 @@ def viz(
135150
136151 # break down merged into x_ and y_ specific params
137152 viz_params = parse_axis_params (params = merged )
138- xviz = get_hook_dict (viz_params , 'x_' , remove_hook = True )
139- yviz = get_hook_dict (viz_params , 'y_' , remove_hook = True )
153+ xviz = utils . get_hook_dict_v2 (viz_params , 'x_' , remove_hook = True , check = False )
154+ yviz = utils . get_hook_dict_v2 (viz_params , 'y_' , remove_hook = True , check = False )
140155
141156 # apply settings
142157 set_tick_grid_visibility (ax , axis = 'x' , ** xviz )
143158 set_tick_grid_visibility (ax , axis = 'y' , ** yviz )
144159
145160
146- def parse_grid_visibility (
147- grid : _grid_vis | None = None ,
148- minor : bool | None = None ,
149- ):
150- if grid is None :
151- return None , None
152-
153- if isinstance (grid , bool ):
154- if not grid :
155- major_setter = minor_setter = False
156- else :
157- major_setter = grid
158- minor_setter = grid if minor is None else minor
159- elif isinstance (grid , str ):
160- major_setter = True if grid in ('both' , 'major' ) else False
161- minor_setter = True if grid in ('both' , 'minor' ) else False
162-
163- return major_setter , minor_setter
164-
165-
166161def set_tick_grid_visibility (ax , * , axis = 'x' , ticks = None , minor = None , grid = None ):
162+ axis_obj = getattr (ax , f'{ axis } axis' )
163+
167164 # mapping for tick visibility in x/y axis
168165 p1 = 'bottom' if axis == 'x' else 'left'
169166 p2 = 'top' if axis == 'x' else 'right'
@@ -172,13 +169,6 @@ def set_tick_grid_visibility(ax, *, axis='x', ticks=None, minor=None, grid=None)
172169 def apply_logic (value ):
173170 logic_1 = True if value in ('1' , 'both' , 'all' , True ) else False
174171 logic_2 = True if value in ('2' , 'both' , 'all' ) else False
175- return logic_1 , logic_2
176-
177- if ticks is None :
178- viz = {}
179- # viz_min = {}
180- else :
181- logic_1 , logic_2 = apply_logic (ticks )
182172
183173 viz = {
184174 p1 : logic_1 ,
@@ -187,37 +177,49 @@ def apply_logic(value):
187177 f'label{ p2 } ' : logic_2 ,
188178 }
189179
190- logic_1 , logic_2 = apply_logic ( minor )
180+ return viz
191181
192- viz_min = {
193- p1 : viz .get (p1 , logic_1 ),
194- f'label{ p1 } ' : viz .get (f'label{ p1 } ' , logic_1 ),
195- p2 : viz .get (p2 , logic_2 ),
196- f'label{ p2 } ' : viz .get (f'label{ p2 } ' , logic_2 ),
197- }
182+ if ticks is None :
183+ viz = {}
184+ else :
185+ viz = apply_logic (ticks )
186+
187+ if minor is None and ticks is None :
188+ viz_min = {}
189+ elif minor is None and ticks :
190+ viz_min = {}
191+ elif minor is True :
192+ # axis_obj.minorticks_on()
193+ viz_min = viz .copy ()
194+ else :
195+ # axis_obj.minorticks_on()
196+ viz_min = apply_logic (minor )
198197
198+ axis_obj .minorticks_on ()
199199 grid_maj , grid_min = parse_grid_visibility (grid = grid , minor = minor )
200200
201- axis_obj = getattr (ax , f'{ axis } axis' )
202-
203201 axis_obj .set_tick_params (which = 'major' , gridOn = grid_maj , ** viz )
204- axis_obj .minorticks_on ()
205202 axis_obj .set_tick_params (which = 'minor' , gridOn = grid_min , ** viz_min )
206203
207204
208- def get_hook_dict (params , hook , remove_hook : bool = True ) -> dict :
209- hook_params = {}
210- if params == {}:
211- return hook_params
205+ def parse_grid_visibility (
206+ grid : _grid_vis | None = None ,
207+ minor : bool | None = None ,
208+ ):
209+ if grid is None :
210+ return None , None
212211
213- for key , value in params .items ():
214- if not key .startswith (hook ):
215- continue
216- param = key .removeprefix (hook ) if remove_hook else key
217- d = {param : value }
218- hook_params .update (d )
212+ if isinstance (grid , bool ):
213+ if not grid :
214+ major_setter = minor_setter = False
215+ else :
216+ major_setter = grid
217+ minor_setter = grid if minor is None else minor
218+ elif isinstance (grid , str ):
219+ major_setter = True if grid in ('both' , 'major' ) else False
220+ minor_setter = True if grid in ('both' , 'minor' ) else False
219221
220- return hook_params
222+ return major_setter , minor_setter
221223
222224
223225def parse_axis_params (params : dict ):
@@ -241,7 +243,8 @@ def parse_axis_params(params: dict):
241243 # 4: check for duplicates and merge
242244 duplicate_keys = set (specific_axis_params .keys ()) & set (axis_global .keys ())
243245 if duplicate_keys :
244- raise ValueError (f'Duplicate keys found: { duplicate_keys } ' )
246+ param_names = [p .removeprefix ('x_' ) if p .startswith ('x_' ) else p .removeprefix ('y_' ) for p in duplicate_keys ]
247+ raise ValueError (f'Duplicate axis param for: { duplicate_keys } and { param_names } ' )
245248
246249 axis_params = {** specific_axis_params , ** axis_global }
247250
@@ -265,10 +268,10 @@ def merge_axis_kwargs(kwargs):
265268
266269
267270def compile_axis_settings (axis_params , axis : str ) -> dict :
268- settings = get_hook_dict (axis_params , f'{ axis } _' , remove_hook = True )
269- tick_settings = get_hook_dict (settings , 'tick_' , remove_hook = True )
270- grid_settings = get_hook_dict (settings , 'grid_' , remove_hook = False )
271- label_settings = get_hook_dict (settings , 'label_' , remove_hook = True )
271+ settings = utils . get_hook_dict_v2 (axis_params , f'{ axis } _' , remove_hook = True , check = False )
272+ tick_settings = utils . get_hook_dict_v2 (settings , 'tick_' , remove_hook = True )
273+ grid_settings = utils . get_hook_dict_v2 (settings , 'grid_' , remove_hook = False )
274+ label_settings = utils . get_hook_dict_v2 (settings , 'label_' , remove_hook = True )
272275 tick_settings .update (grid_settings )
273276 other_params = {k : v for k , v in settings .items () if not (k .startswith ('tick_' ) or k .startswith ('grid_' ))}
274277
0 commit comments