Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 32b5da6

Browse files
committed
Make the signature of Axes.draw() consistent with Artist.draw().
... i.e. draw(renderer) instead of draw(renderer=None, inframe=False) (with a deprecation period).
1 parent 4412114 commit 32b5da6

File tree

6 files changed

+74
-22
lines changed

6 files changed

+74
-22
lines changed

doc/api/next_api_changes/deprecations.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,3 +173,15 @@ variables is deprecated. Additional fonts may be registered using
173173
``matplotlib.compat``
174174
~~~~~~~~~~~~~~~~~~~~~
175175
This module is deprecated.
176+
177+
Signatures of `.Artist.draw` and `.Axes.draw`
178+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
179+
The *inframe* parameter to `.Axes.draw` is deprecated. Use
180+
`.Axes.redraw_in_frame` instead.
181+
182+
Not passing the *renderer* parameter to `.Axes.draw` is deprecated. Use
183+
``axes.draw_artist(axes)`` instead.
184+
185+
These changes make the signature of the ``draw`` (``artist.draw(renderer)``)
186+
method consistent across all artists; thus, additional parameters to
187+
`.Artist.draw` are deprecated.

lib/matplotlib/artist.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ def allow_rasterization(draw):
2626
renderer.
2727
"""
2828

29-
# the axes class has a second argument inframe for its draw method.
29+
# Axes has a second (deprecated) argument inframe for its draw method.
30+
# args and kwargs are deprecated, but we don't wrap this in
31+
# cbook._delete_parameter for performance; the relevant deprecation
32+
# warning will be emitted by the inner draw() call.
3033
@wraps(draw)
3134
def draw_wrapper(artist, renderer, *args, **kwargs):
3235
try:
@@ -895,6 +898,8 @@ def set_agg_filter(self, filter_func):
895898
self._agg_filter = filter_func
896899
self.stale = True
897900

901+
@cbook._delete_parameter("3.3", "args")
902+
@cbook._delete_parameter("3.3", "kwargs")
898903
def draw(self, renderer, *args, **kwargs):
899904
"""
900905
Draw the Artist (and its children) using the given renderer.

lib/matplotlib/axes/_base.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from collections import OrderedDict
2+
from contextlib import ExitStack
23
import itertools
34
import logging
45
import math
@@ -2607,9 +2608,16 @@ def _update_title_position(self, renderer):
26072608

26082609
# Drawing
26092610
@martist.allow_rasterization
2611+
@cbook._delete_parameter(
2612+
"3.3", "inframe", alternative="Axes.redraw_in_frame()")
26102613
def draw(self, renderer=None, inframe=False):
26112614
# docstring inherited
26122615
if renderer is None:
2616+
cbook.warn_deprecated(
2617+
"3.3", message="Support for not passing the 'renderer' "
2618+
"paramater to Axes.draw() is deprecated since %(since)s and "
2619+
"will be removed %(removal)s. Use axes.draw_artist(axes) "
2620+
"instead.")
26132621
renderer = self.figure._cachedRenderer
26142622
if renderer is None:
26152623
raise RuntimeError('No renderer defined')
@@ -2690,7 +2698,7 @@ def draw_artist(self, a):
26902698
"""
26912699
This method can only be used after an initial draw which
26922700
caches the renderer. It is used to efficiently update Axes
2693-
data (axis ticks, labels, etc are not updated)
2701+
data (axis ticks, labels, etc are not updated).
26942702
"""
26952703
if self.figure._cachedRenderer is None:
26962704
raise AttributeError("draw_artist can only be used after an "
@@ -2701,12 +2709,17 @@ def redraw_in_frame(self):
27012709
"""
27022710
This method can only be used after an initial draw which
27032711
caches the renderer. It is used to efficiently update Axes
2704-
data (axis ticks, labels, etc are not updated)
2712+
data (axis ticks, labels, etc are not updated).
27052713
"""
27062714
if self.figure._cachedRenderer is None:
27072715
raise AttributeError("redraw_in_frame can only be used after an "
27082716
"initial draw which caches the renderer")
2709-
self.draw(self.figure._cachedRenderer, inframe=True)
2717+
with ExitStack() as stack:
2718+
for artist in [*self._get_axis_list(),
2719+
self.title, self._left_title, self._right_title]:
2720+
stack.push(artist.set_visible, artist.get_visible())
2721+
artist.set_visible(False)
2722+
self.draw(self.figure._cachedRenderer)
27102723

27112724
def get_renderer_cache(self):
27122725
return self.figure._cachedRenderer

lib/matplotlib/axes/_secondary_axes.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,9 @@ def set_functions(self, functions):
225225
# need to invert the roles here for the ticks to line up.
226226
set_scale(defscale, functions=self._functions[::-1])
227227

228-
def draw(self, renderer=None, inframe=False):
228+
# Should be changed to draw(self, renderer) once the deprecation of
229+
# renderer=None and of inframe expires.
230+
def draw(self, *args, **kwargs):
229231
"""
230232
Draw the secondary axes.
231233
@@ -237,7 +239,7 @@ def draw(self, renderer=None, inframe=False):
237239
self._set_lims()
238240
# this sets the scale in case the parent has set its scale.
239241
self._set_scale()
240-
super().draw(renderer=renderer, inframe=inframe)
242+
super().draw(*args, **kwargs)
241243

242244
def _set_scale(self):
243245
"""

lib/matplotlib/cbook/deprecation.py

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ def __repr__(self):
310310
_deprecated_parameter = _deprecated_parameter_class()
311311

312312

313-
def _delete_parameter(since, name, func=None):
313+
def _delete_parameter(since, name, func=None, **kwargs):
314314
"""
315315
Decorator indicating that parameter *name* of *func* is being deprecated.
316316
@@ -323,6 +323,8 @@ def _delete_parameter(since, name, func=None):
323323
such after the deprecation period has passed and the deprecated parameter
324324
is removed.
325325
326+
Additional kwargs are passed to `.warn_deprecated`.
327+
326328
Examples
327329
--------
328330
::
@@ -332,29 +334,45 @@ def func(used_arg, other_arg, unused, more_args): ...
332334
"""
333335

334336
if func is None:
335-
return functools.partial(_delete_parameter, since, name)
337+
return functools.partial(_delete_parameter, since, name, **kwargs)
336338

337339
signature = inspect.signature(func)
338340
assert name in signature.parameters, (
339341
f"Matplotlib internal error: {name!r} must be a parameter for "
340342
f"{func.__name__}()")
341-
func.__signature__ = signature.replace(parameters=[
342-
param.replace(default=_deprecated_parameter) if param.name == name
343-
else param
344-
for param in signature.parameters.values()])
343+
kind = signature.parameters[name].kind
344+
is_varargs = kind is inspect.Parameter.VAR_POSITIONAL
345+
is_varkwargs = kind is inspect.Parameter.VAR_KEYWORD
346+
if not is_varargs and not is_varkwargs:
347+
func.__signature__ = signature = signature.replace(parameters=[
348+
param.replace(default=_deprecated_parameter) if param.name == name
349+
else param
350+
for param in signature.parameters.values()])
345351

346352
@functools.wraps(func)
347-
def wrapper(*args, **kwargs):
348-
arguments = func.__signature__.bind(*args, **kwargs).arguments
353+
def wrapper(*inner_args, **inner_kwargs):
354+
arguments = signature.bind(*inner_args, **inner_kwargs).arguments
355+
if is_varargs and arguments.get(name):
356+
warn_deprecated(
357+
since, message=f"Additional positional arguments to "
358+
f"{func.__name__}() are deprecated since %(since)s and "
359+
f"support for them will be removed %(removal)s.")
360+
elif is_varkwargs and arguments.get(name):
361+
warn_deprecated(
362+
since, message=f"Additional keyword arguments to "
363+
f"{func.__name__}() are deprecated since %(since)s and "
364+
f"support for them will be removed %(removal)s.")
349365
# We cannot just check `name not in arguments` because the pyplot
350366
# wrappers always pass all arguments explicitly.
351-
if name in arguments and arguments[name] != _deprecated_parameter:
367+
elif name in arguments and arguments[name] != _deprecated_parameter:
352368
warn_deprecated(
353-
since, message=f"The {name!r} parameter of {func.__name__}() "
354-
f"is deprecated since Matplotlib {since} and will be removed "
355-
f"%(removal)s. If any parameter follows {name!r}, they "
356-
f"should be pass as keyword, not positionally.")
357-
return func(*args, **kwargs)
369+
since,
370+
name=repr(name),
371+
obj_type=f"parameter of {func.__name__}()",
372+
addendum=(f"If any parameter follows {name!r}, they should be "
373+
f"passed as keyword, not positionally."),
374+
**kwargs)
375+
return func(*inner_args, **inner_kwargs)
358376

359377
return wrapper
360378

lib/matplotlib/projections/polar.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -931,7 +931,9 @@ def get_yaxis_text2_transform(self, pad):
931931
pad_shift = _ThetaShift(self, pad, 'min')
932932
return self._yaxis_text_transform + pad_shift, 'center', halign
933933

934-
def draw(self, *args, **kwargs):
934+
@cbook._delete_parameter("3.3", "args")
935+
@cbook._delete_parameter("3.3", "kwargs")
936+
def draw(self, renderer, *args, **kwargs):
935937
thetamin, thetamax = np.rad2deg(self._realViewLim.intervalx)
936938
if thetamin > thetamax:
937939
thetamin, thetamax = thetamax, thetamin
@@ -974,7 +976,7 @@ def draw(self, *args, **kwargs):
974976
self.yaxis.reset_ticks()
975977
self.yaxis.set_clip_path(self.patch)
976978

977-
Axes.draw(self, *args, **kwargs)
979+
Axes.draw(self, renderer, *args, **kwargs)
978980

979981
def _gen_axes_patch(self):
980982
return mpatches.Wedge((0.5, 0.5), 0.5, 0.0, 360.0)

0 commit comments

Comments
 (0)