@@ -2490,14 +2490,15 @@ def _parse_level_list(
2490
2490
# However want to apply these to manual-input levels as well.
2491
2491
def _restrict_levels (levels ):
2492
2492
kw = {}
2493
+ levels = np .asarray (levels )
2493
2494
if len (levels ) > 2 :
2494
2495
kw ['atol' ] = 1e-5 * np .min (np .diff (levels ))
2495
2496
if nozero :
2496
- levels = [ lev for lev in levels if not np .isclose (lev , 0 , ** kw )]
2497
+ levels = levels [ ~ np .isclose (levels , 0 , ** kw )]
2497
2498
if positive :
2498
- levels = [ lev for lev in levels if lev > 0 or np .isclose (lev , 0 , ** kw )]
2499
+ levels = levels [( levels > 0 ) | np .isclose (levels , 0 , ** kw )]
2499
2500
if negative :
2500
- levels = [ lev for lev in levels if lev < 0 or np .isclose (lev , 0 , ** kw )]
2501
+ levels = levels [( levels < 0 ) | np .isclose (levels , 0 , ** kw )]
2501
2502
return levels
2502
2503
2503
2504
# Helper function to sanitize input levels
@@ -2570,26 +2571,29 @@ def _sanitize_levels(key, array, minsize):
2570
2571
pop = _pop_params (kwargs , self ._parse_level_count , ignore_internal = True )
2571
2572
if pop :
2572
2573
warnings ._warn_proplot (f'Ignoring unused keyword arg(s): { pop } ' )
2573
- if not np . iterable ( levels ) and not skip_autolev :
2574
+ elif not skip_autolev :
2574
2575
levels , kwargs = self ._parse_level_count (
2575
2576
* args , levels = levels , norm = norm , norm_kw = norm_kw , extend = extend ,
2576
2577
negative = negative , positive = positive , ** kwargs
2577
2578
)
2579
+ else :
2580
+ levels = values = None
2578
2581
2579
2582
# Determine default colorbar locator and norm and apply filters
2580
2583
# NOTE: DiscreteNorm does not currently support vmin and
2581
2584
# vmax different from level list minimum and maximum.
2582
2585
# NOTE: The level restriction should have no effect if levels were generated
2583
2586
# automatically. However want to apply these to manual-input levels as well.
2584
- locator = values if np .iterable (values ) else levels
2585
- if np .iterable (locator ):
2587
+ if levels is not None :
2588
+ # Apply default locator
2589
+ locator = values if np .iterable (values ) else levels
2586
2590
locator = _restrict_levels (locator )
2587
2591
if norm in ('segments' , 'segmented' ) or isinstance (norm , pcolors .SegmentedNorm ): # noqa: E501
2588
2592
locator = mticker .FixedLocator (locator )
2589
2593
else :
2590
2594
locator = pticker .DiscreteLocator (locator )
2591
2595
guides ._add_guide_kw ('colorbar' , kwargs , locator = locator )
2592
- if np . iterable ( levels ):
2596
+ # Apply default norm
2593
2597
levels = _restrict_levels (levels )
2594
2598
if len (levels ) == 0 : # skip
2595
2599
pass
@@ -2602,14 +2606,6 @@ def _sanitize_levels(key, array, minsize):
2602
2606
if norm in ('segments' , 'segmented' ):
2603
2607
norm_kw ['levels' ] = levels
2604
2608
2605
- # Filter the level boundaries
2606
- if np .iterable (levels ):
2607
- if nozero :
2608
- levels = levels [levels != 0 ]
2609
- if positive :
2610
- levels = levels [levels >= 0 ]
2611
- if negative :
2612
- levels = levels [levels <= 0 ]
2613
2609
return levels , vmin , vmax , norm , norm_kw , kwargs
2614
2610
2615
2611
def _parse_level_lim (
0 commit comments