diff --git a/ultraplot/config.py b/ultraplot/config.py index a3c332ff9..b3270a492 100644 --- a/ultraplot/config.py +++ b/ultraplot/config.py @@ -1314,15 +1314,19 @@ def _get_ticklabel_props(self, axis=None, native=True, rebuild=False): Return the tick label properties, optionally filtering the output dictionary based on the context. """ - # NOTE: 'tick.label' properties are now synonyms of 'grid.label' properties + # Geographic gridline labels use the ultraplot-only grid.label* settings, + # while native matplotlib tick labels use x/y tick rcParams. sprefix = axis or "" cprefix = sprefix if _version_mpl >= "3.4" else "" # new settings context = not rebuild and (native or self._context_mode == 2) + color_key = f"{cprefix}tick.labelcolor" if native else "grid.labelcolor" + size_key = f"{sprefix}tick.labelsize" if native else "grid.labelsize" + weight_key = "tick.labelweight" if native else "grid.labelweight" kwtext = self.fill( { - "color": f"{cprefix}tick.labelcolor", # native setting sometimes avail - "size": f"{sprefix}tick.labelsize", # native setting always avail - "weight": "tick.labelweight", # native setting never avail + "color": color_key, # native setting sometimes avail + "size": size_key, + "weight": weight_key, # native setting never avail "family": "font.family", # apply manually }, context=context, diff --git a/ultraplot/figure.py b/ultraplot/figure.py index 0aa887ff0..c99adb0ab 100644 --- a/ultraplot/figure.py +++ b/ultraplot/figure.py @@ -3623,7 +3623,19 @@ def format( # Initiate context block axs = axs or self._subplot_dict.values() skip_axes = kwargs.pop("skip_axes", False) # internal keyword arg + # Preserve explicit projection-specific format keywords that also happen to + # be valid rc aliases (e.g. GeoAxes/PolarAxes `labelsize`). Otherwise + # `_pop_rc()` removes them before the per-axes format dispatch below. + original_kwargs = kwargs.copy() + axis_param_names = set() + for ax in axs: + for cls, sig in paxes.Axes._format_signatures.items(): + if isinstance(ax, cls): + axis_param_names.update(sig.parameters) + axis_param_names.discard("self") rc_kw, rc_mode = _pop_rc(kwargs) + for key in axis_param_names & original_kwargs.keys(): + kwargs.setdefault(key, original_kwargs[key]) with rc.context(rc_kw, mode=rc_mode): # Update background patch kw = rc.fill({"facecolor": "figure.facecolor"}, context=True) diff --git a/ultraplot/gridspec.py b/ultraplot/gridspec.py index e742df0a0..1c7cd3860 100644 --- a/ultraplot/gridspec.py +++ b/ultraplot/gridspec.py @@ -2114,7 +2114,19 @@ def _supports_implicit_label_share(target): else: shared_title_loc = None shared_title_pad = None + # Preserve explicit projection-specific format keywords that also happen to + # be valid rc aliases (e.g. GeoAxes/PloarAxes `labelsize`). Otherwise + # `_pop_rc()` removes them before Figure.format() can delegate to axes. + original_kwargs = kwargs.copy() + axis_param_names = set() + for ax in axes: + for cls, sig in paxes.Axes._format_signatures.items(): + if isinstance(ax, cls): + axis_param_names.update(sig.parameters) + axis_param_names.discard("self") rc_kw, rc_mode = _pop_rc(kwargs) + for key in axis_param_names & original_kwargs.keys(): + kwargs.setdefault(key, original_kwargs[key]) with rc.context(rc_kw, mode=rc_mode): implicit_share_xlabels = ( is_subset diff --git a/ultraplot/tests/test_geographic.py b/ultraplot/tests/test_geographic.py index 1d917f201..7a3c27844 100644 --- a/ultraplot/tests/test_geographic.py +++ b/ultraplot/tests/test_geographic.py @@ -188,6 +188,35 @@ def test_geoticks_label_shorthand_lb_no_warning(recwarn): uplt.close(fig) +def test_geo_labelsize_updates_gridliner_labels(): + fig, ax = uplt.subplots(proj="cyl") + ax = ax[0] + ax.format(labels=True, lonlines=30, latlines=30, labelsize=30) + fig.canvas.draw() + + labels = ( + ax.gridlines_major.bottom_label_artists + ax.gridlines_major.left_label_artists + ) + assert labels + assert {label.get_fontsize() for label in labels} == {30} + uplt.close(fig) + + +def test_subplotgrid_geo_labelsize_updates_gridliner_labels(): + fig, ax = uplt.subplots(proj="cyl") + ax.format(labels=True, lonlines=30, latlines=30, labelsize=30) + fig.canvas.draw() + + geo = ax[0] + labels = ( + geo.gridlines_major.bottom_label_artists + + geo.gridlines_major.left_label_artists + ) + assert labels + assert {label.get_fontsize() for label in labels} == {30} + uplt.close(fig) + + def test_toggle_ticks_supports_bool_and_sequence_specs(): fig, ax = uplt.subplots(proj="cyl") geo = ax[0]