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

Skip to content

Commit 3e4af57

Browse files
committed
Make kwargs names in scale.py not include the axis direction.
- Make names of kwargs to Scale subclasses independent of whether the underlying axis is x or y (so that after the deprecation period, one can just have a normal signature -- `def __init__(self, *, base=10, ...)`. We could possibly also change semilogx and semilogy to use the unsuffixed names (with deprecation), leaving only loglog with the suffixed names, or even also make loglog use unsuffixed names, in which case it would become impossible to set separate x and y bases directly in loglog -- one should then do `gca().set_xscale("log", base=...)` which doesn't seem too onerous. (loglog is the only case where the suffixed names has *some* utility.) In general, note that having kwargs that depend on the axis direction doesn't really scale -- for example, if we were to finally add log-scale support to mplot3d, should scale.py know about it and add `basez`? Should we have `baser` for log-scale polar plots? (at least in the radial direction, they make sense) - Move argument validation up the the Transform subclasses. - Make SymmetricalLogScale.{base,linthresh,linscale} properties mapping to the underlying transform so that they can't go out of sync.
1 parent cf6c569 commit 3e4af57

File tree

9 files changed

+88
-100
lines changed

9 files changed

+88
-100
lines changed

doc/api/next_api_changes/deprecations.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,13 @@ Case-insensitive capstyles and joinstyles
5252
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5353
Please pass capstyles ("miter", "round", "bevel") and joinstyles ("butt",
5454
"round", "projecting") as lowercase.
55+
56+
Signature of `.LogScale` and `.SymLogScale`
57+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
58+
These classes used to take keyword arguments that depends on the axis
59+
orientation ("basex" vs "basey", "nonposx" vs "nonposy"); these parameter
60+
names are now deprecated in favor of "base", "nonpos", etc. This deprecation
61+
also affects e.g. ``ax.set_yscale("log", basey=...)`` which must now be
62+
spelled ``ax.set_yscale("log", base=...)``. The only place where "basex", etc.
63+
remain in use is in the helper functions `~.Axes.loglog`, `~.Axes.semilogx`,
64+
and `~.Axes.semilogy` (because `~.Axes.loglog` takes both "basex" and "basey").

examples/scales/log_demo.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
ax2.grid()
2727

2828
# log x and y axis
29-
ax3.loglog(t, 20 * np.exp(-t / 10.0), basex=2)
29+
ax3.loglog(t, 20 * np.exp(-t / 10.0))
30+
ax3.set_xscale('log', base=2)
3031
ax3.set(title='loglog base 2 on x')
3132
ax3.grid()
3233

@@ -35,8 +36,8 @@
3536
x = 10.0**np.linspace(0.0, 2.0, 20)
3637
y = x**2.0
3738

38-
ax4.set_xscale("log", nonposx='clip')
39-
ax4.set_yscale("log", nonposy='clip')
39+
ax4.set_xscale("log", nonpos='clip')
40+
ax4.set_yscale("log", nonpos='clip')
4041
ax4.set(title='Errorbars go negative')
4142
ax4.errorbar(x, y, xerr=0.1 * x, yerr=5.0 + 0.75 * y)
4243
# ylim must be set after errorbar to allow errorbar to autoscale limits

examples/scales/scales.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
# symmetric log
4646
ax = axs[1, 1]
4747
ax.plot(x, y - y.mean())
48-
ax.set_yscale('symlog', linthreshy=0.02)
48+
ax.set_yscale('symlog', linthresh=0.02)
4949
ax.set_title('symlog')
5050
ax.grid(True)
5151

examples/scales/symlog_demo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
plt.subplot(313)
2828
plt.plot(x, np.sin(x / 3.0))
2929
plt.xscale('symlog')
30-
plt.yscale('symlog', linthreshy=0.015)
30+
plt.yscale('symlog', linthresh=0.015)
3131
plt.grid(True)
3232
plt.ylabel('symlog both')
3333

lib/matplotlib/axes/_axes.py

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1791,16 +1791,13 @@ def loglog(self, *args, **kwargs):
17911791
**kwargs
17921792
All parameters supported by `.plot`.
17931793
"""
1794-
dx = {k: kwargs.pop(k) for k in ['basex', 'subsx', 'nonposx']
1794+
dx = {k[:-1]: kwargs.pop(k) for k in ['basex', 'subsx', 'nonposx']
17951795
if k in kwargs}
1796-
dy = {k: kwargs.pop(k) for k in ['basey', 'subsy', 'nonposy']
1797-
if k in kwargs}
1798-
17991796
self.set_xscale('log', **dx)
1797+
dy = {k[:-1]: kwargs.pop(k) for k in ['basey', 'subsy', 'nonposy']
1798+
if k in kwargs}
18001799
self.set_yscale('log', **dy)
1801-
1802-
l = self.plot(*args, **kwargs)
1803-
return l
1800+
return self.plot(*args, **kwargs)
18041801

18051802
# @_preprocess_data() # let 'plot' do the unpacking..
18061803
@docstring.dedent_interpd
@@ -1844,12 +1841,10 @@ def semilogx(self, *args, **kwargs):
18441841
**kwargs
18451842
All parameters supported by `.plot`.
18461843
"""
1847-
d = {k: kwargs.pop(k) for k in ['basex', 'subsx', 'nonposx']
1844+
d = {k[:-1]: kwargs.pop(k) for k in ['basex', 'subsx', 'nonposx']
18481845
if k in kwargs}
1849-
18501846
self.set_xscale('log', **d)
1851-
l = self.plot(*args, **kwargs)
1852-
return l
1847+
return self.plot(*args, **kwargs)
18531848

18541849
# @_preprocess_data() # let 'plot' do the unpacking..
18551850
@docstring.dedent_interpd
@@ -1893,12 +1888,10 @@ def semilogy(self, *args, **kwargs):
18931888
**kwargs
18941889
All parameters supported by `.plot`.
18951890
"""
1896-
d = {k: kwargs.pop(k) for k in ['basey', 'subsy', 'nonposy']
1891+
d = {k[:-1]: kwargs.pop(k) for k in ['basey', 'subsy', 'nonposy']
18971892
if k in kwargs}
18981893
self.set_yscale('log', **d)
1899-
l = self.plot(*args, **kwargs)
1900-
1901-
return l
1894+
return self.plot(*args, **kwargs)
19021895

19031896
@_preprocess_data(replace_names=["x"], label_namer="x")
19041897
def acorr(self, x, **kwargs):
@@ -2339,11 +2332,11 @@ def bar(self, x, height, width=0.8, bottom=None, *, align="center",
23392332
if orientation == 'vertical':
23402333
self._process_unit_info(xdata=x, ydata=height, kwargs=kwargs)
23412334
if log:
2342-
self.set_yscale('log', nonposy='clip')
2335+
self.set_yscale('log', nonpos='clip')
23432336
elif orientation == 'horizontal':
23442337
self._process_unit_info(xdata=width, ydata=y, kwargs=kwargs)
23452338
if log:
2346-
self.set_xscale('log', nonposx='clip')
2339+
self.set_xscale('log', nonpos='clip')
23472340

23482341
# lets do some conversions now since some types cannot be
23492342
# subtracted uniformly
@@ -6755,9 +6748,9 @@ def hist(self, x, bins=None, range=None, density=False, weights=None,
67556748

67566749
if log:
67576750
if orientation == 'horizontal':
6758-
self.set_xscale('log', nonposx='clip')
6751+
self.set_xscale('log', nonpos='clip')
67596752
else: # orientation == 'vertical'
6760-
self.set_yscale('log', nonposy='clip')
6753+
self.set_yscale('log', nonpos='clip')
67616754

67626755
if align == 'left':
67636756
x -= 0.5*(bins[1]-bins[0])

lib/matplotlib/scale.py

Lines changed: 50 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,11 @@ class LogTransform(Transform):
280280

281281
def __init__(self, base, nonpos='clip'):
282282
Transform.__init__(self)
283+
if base <= 0 or base == 1:
284+
raise ValueError('The log base cannot be <= 0 or == 1')
283285
self.base = base
284-
self._clip = {"clip": True, "mask": False}[nonpos]
286+
self._clip = cbook._check_getitem(
287+
{"clip": True, "mask": False}, nonpos=nonpos)
285288

286289
def __str__(self):
287290
return "{}(base={}, nonpos={!r})".format(
@@ -353,41 +356,28 @@ def __init__(self, axis, **kwargs):
353356
----------
354357
axis : `~matplotlib.axis.Axis`
355358
The axis for the scale.
356-
basex, basey : float, default: 10
359+
base : float, default: 10
357360
The base of the logarithm.
358-
nonposx, nonposy : {'clip', 'mask'}, default: 'clip'
361+
nonpos : {'clip', 'mask'}, default: 'clip'
359362
Determines the behavior for non-positive values. They can either
360363
be masked as invalid, or clipped to a very small positive number.
361-
subsx, subsy : sequence of int, default: None
362-
Where to place the subticks between each major tick.
363-
For example, in a log10 scale: ``[2, 3, 4, 5, 6, 7, 8, 9]``
364-
will place 8 logarithmically spaced minor ticks between
365-
each major tick.
364+
subs : sequence of int, default: None
365+
Where to place the subticks between each major tick. For example,
366+
in a log10 scale, ``[2, 3, 4, 5, 6, 7, 8, 9]`` will place 8
367+
logarithmically spaced minor ticks between each major tick.
366368
"""
367-
if axis.axis_name == 'x':
368-
base = kwargs.pop('basex', 10.0)
369-
subs = kwargs.pop('subsx', None)
370-
nonpos = kwargs.pop('nonposx', 'clip')
371-
cbook._check_in_list(['mask', 'clip'], nonposx=nonpos)
372-
else:
373-
base = kwargs.pop('basey', 10.0)
374-
subs = kwargs.pop('subsy', None)
375-
nonpos = kwargs.pop('nonposy', 'clip')
376-
cbook._check_in_list(['mask', 'clip'], nonposy=nonpos)
377-
378-
if kwargs:
379-
raise TypeError(f"LogScale got an unexpected keyword "
380-
f"argument {next(iter(kwargs))!r}")
381-
382-
if base <= 0 or base == 1:
383-
raise ValueError('The log base cannot be <= 0 or == 1')
384-
369+
axis_name = getattr(axis, "axis_name", "x")
370+
@cbook._rename_parameter("3.3", f"base{axis_name}", "base")
371+
@cbook._rename_parameter("3.3", f"subs{axis_name}", "subs")
372+
@cbook._rename_parameter("3.3", f"nonpos{axis_name}", "nonpos")
373+
def __init__(*, base=10, subs=None, nonpos='clip'):
374+
return base, subs, nonpos
375+
376+
base, subs, nonpos = __init__(**kwargs)
385377
self._transform = LogTransform(base, nonpos)
386378
self.subs = subs
387379

388-
@property
389-
def base(self):
390-
return self._transform.base
380+
base = property(lambda self: self._transform.base)
391381

392382
def set_default_locators_and_formatters(self, axis):
393383
# docstring inherited
@@ -454,6 +444,12 @@ class SymmetricalLogTransform(Transform):
454444

455445
def __init__(self, base, linthresh, linscale):
456446
Transform.__init__(self)
447+
if base <= 1.0:
448+
raise ValueError("'base' must be larger than 1")
449+
if linthresh <= 0.0:
450+
raise ValueError("'linthresh' must be positive")
451+
if linscale <= 0.0:
452+
raise ValueError("'linscale' must be positive")
457453
self.base = base
458454
self.linthresh = linthresh
459455
self.linscale = linscale
@@ -514,19 +510,19 @@ class SymmetricalLogScale(ScaleBase):
514510
515511
Parameters
516512
----------
517-
basex, basey : float, default: 10
513+
base : float, default: 10
518514
The base of the logarithm.
519515
520-
linthreshx, linthreshy : float, default: 2
516+
linthresh : float, default: 2
521517
Defines the range ``(-x, x)``, within which the plot is linear.
522518
This avoids having the plot go to infinity around zero.
523519
524-
subsx, subsy : sequence of int
520+
subs : sequence of int
525521
Where to place the subticks between each major tick.
526522
For example, in a log10 scale: ``[2, 3, 4, 5, 6, 7, 8, 9]`` will place
527523
8 logarithmically spaced minor ticks between each major tick.
528524
529-
linscalex, linscaley : float, optional
525+
linscale : float, optional
530526
This allows the linear range ``(-linthresh, linthresh)`` to be
531527
stretched relative to the logarithmic range. Its value is the number of
532528
decades to use for each half of the linear range. For example, when
@@ -540,40 +536,30 @@ class SymmetricalLogScale(ScaleBase):
540536
InvertedSymmetricalLogTransform = InvertedSymmetricalLogTransform
541537

542538
def __init__(self, axis, **kwargs):
543-
if axis.axis_name == 'x':
544-
base = kwargs.pop('basex', 10.0)
545-
linthresh = kwargs.pop('linthreshx', 2.0)
546-
subs = kwargs.pop('subsx', None)
547-
linscale = kwargs.pop('linscalex', 1.0)
548-
else:
549-
base = kwargs.pop('basey', 10.0)
550-
linthresh = kwargs.pop('linthreshy', 2.0)
551-
subs = kwargs.pop('subsy', None)
552-
linscale = kwargs.pop('linscaley', 1.0)
553-
if kwargs:
554-
warn_deprecated(
555-
'3.2.0',
556-
message=(
557-
f"SymmetricalLogScale got an unexpected keyword "
558-
f"argument {next(iter(kwargs))!r}. "
559-
'In the future this will raise TypeError')
560-
)
561-
# raise TypeError(f"SymmetricalLogScale got an unexpected keyword "
562-
# f"argument {next(iter(kwargs))!r}")
563-
564-
if base <= 1.0:
565-
raise ValueError("'basex/basey' must be larger than 1")
566-
if linthresh <= 0.0:
567-
raise ValueError("'linthreshx/linthreshy' must be positive")
568-
if linscale <= 0.0:
569-
raise ValueError("'linscalex/linthreshy' must be positive")
570-
539+
axis_name = getattr(axis, "axis_name", "x")
540+
@cbook._rename_parameter("3.3", f"base{axis_name}", "base")
541+
@cbook._rename_parameter("3.3", f"linthresh{axis_name}", "linthresh")
542+
@cbook._rename_parameter("3.3", f"subs{axis_name}", "subs")
543+
@cbook._rename_parameter("3.3", f"linscale{axis_name}", "linscale")
544+
def __init__(*, base=10, linthresh=2, subs=None, linscale=1, **kwargs):
545+
if kwargs:
546+
warn_deprecated(
547+
"3.2.0",
548+
message=(
549+
f"SymmetricalLogScale got an unexpected keyword "
550+
f"argument {next(iter(kwargs))!r}; in the future, "
551+
f"this will raise a TypeError")
552+
)
553+
return base, linthresh, subs, linscale
554+
555+
base, linthresh, subs, linscale = __init__(**kwargs)
571556
self._transform = SymmetricalLogTransform(base, linthresh, linscale)
572-
self.base = base
573-
self.linthresh = linthresh
574-
self.linscale = linscale
575557
self.subs = subs
576558

559+
base = property(lambda self: self._transform.base)
560+
linthresh = property(lambda self: self._transform.linthresh)
561+
linscale = property(lambda self: self._transform.linscale)
562+
577563
def set_default_locators_and_formatters(self, axis):
578564
# docstring inherited
579565
axis.set_major_locator(SymmetricalLogLocator(self.get_transform()))

lib/matplotlib/tests/test_axes.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,9 +1118,9 @@ def test_symlog2():
11181118
x = np.arange(-50, 50, 0.001)
11191119

11201120
fig, axs = plt.subplots(5, 1)
1121-
for ax, linthreshx in zip(axs, [20., 2., 1., 0.1, 0.01]):
1121+
for ax, linthresh in zip(axs, [20., 2., 1., 0.1, 0.01]):
11221122
ax.plot(x, x)
1123-
ax.set_xscale('symlog', linthreshx=linthreshx)
1123+
ax.set_xscale('symlog', linthresh=linthresh)
11241124
ax.grid(True)
11251125
axs[-1].set_ylim(-0.1, 0.1)
11261126

@@ -2187,9 +2187,9 @@ def test_log_scales():
21872187
fig = plt.figure()
21882188
ax = fig.add_subplot(1, 1, 1)
21892189
ax.plot(np.log(np.linspace(0.1, 100)))
2190-
ax.set_yscale('log', basey=5.5)
2190+
ax.set_yscale('log', base=5.5)
21912191
ax.invert_yaxis()
2192-
ax.set_xscale('log', basex=9.0)
2192+
ax.set_xscale('log', base=9.0)
21932193

21942194

21952195
def test_log_scales_no_data():

lib/matplotlib/tests/test_scale.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def test_log_scatter():
8888

8989
def test_logscale_subs():
9090
fig, ax = plt.subplots()
91-
ax.set_yscale('log', subsy=np.array([2, 3, 4]))
91+
ax.set_yscale('log', subs=np.array([2, 3, 4]))
9292
# force draw
9393
fig.canvas.draw()
9494

@@ -108,16 +108,14 @@ def test_logscale_mask():
108108
def test_extra_kwargs_raise_or_warn():
109109
fig, ax = plt.subplots()
110110

111-
# with pytest.raises(TypeError):
112111
with pytest.warns(MatplotlibDeprecationWarning):
113-
ax.set_yscale('linear', nonpos='mask')
112+
ax.set_yscale('linear', foo='mask')
114113

115114
with pytest.raises(TypeError):
116-
ax.set_yscale('log', nonpos='mask')
115+
ax.set_yscale('log', foo='mask')
117116

118-
# with pytest.raises(TypeError):
119117
with pytest.warns(MatplotlibDeprecationWarning):
120-
ax.set_yscale('symlog', nonpos='mask')
118+
ax.set_yscale('symlog', foo='mask')
121119

122120

123121
def test_logscale_invert_transform():
@@ -150,7 +148,7 @@ def test_logscale_nonpos_values():
150148
ax1.hist(xs, range=(-5, 5), bins=10)
151149
ax1.set_yscale('log')
152150
ax2.hist(xs, range=(-5, 5), bins=10)
153-
ax2.set_yscale('log', nonposy='mask')
151+
ax2.set_yscale('log', nonpos='mask')
154152

155153
xdata = np.arange(0, 10, 0.01)
156154
ydata = np.exp(-xdata)

tutorials/introductory/pyplot.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ def f(t):
449449
# symmetric log
450450
plt.subplot(223)
451451
plt.plot(x, y - y.mean())
452-
plt.yscale('symlog', linthreshy=0.01)
452+
plt.yscale('symlog', linthresh=0.01)
453453
plt.title('symlog')
454454
plt.grid(True)
455455

0 commit comments

Comments
 (0)