Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3ed82d0

Browse files
committed
Merge SubplotBase into AxesBase.
1 parentbf9a451 commit3ed82d0

File tree

27 files changed

+222
-295
lines changed

27 files changed

+222
-295
lines changed

‎doc/api/axes_api.rst

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,6 @@ The Axes class
2727
:no-undoc-members:
2828
:show-inheritance:
2929

30-
31-
Subplots
32-
========
33-
34-
..autosummary::
35-
:toctree: _as_gen
36-
:template: autosummary.rst
37-
:nosignatures:
38-
39-
SubplotBase
40-
subplot_class_factory
41-
4230
Plotting
4331
========
4432

@@ -313,6 +301,7 @@ Axis labels, title, and legend
313301
Axes.get_xlabel
314302
Axes.set_ylabel
315303
Axes.get_ylabel
304+
Axes.label_outer
316305

317306
Axes.set_title
318307
Axes.get_title
@@ -484,6 +473,9 @@ Axes position
484473
Axes.get_axes_locator
485474
Axes.set_axes_locator
486475

476+
Axes.get_subplotspec
477+
Axes.set_subplotspec
478+
487479
Axes.reset_position
488480

489481
Axes.get_position
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
All Axes have a ``get_subplotspec`` method now, which returns None for Axes not positioned via a gridspec
2+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3+
Previously, this method was only present for Axes positioned via a gridspec.
4+
Following this change, checking ``hasattr(ax, "get_gridspec")`` or
5+
``isinstance(ax, SubplotBase)`` should now be replaced by
6+
``ax.get_gridspec() is not None``.

‎doc/api/prev_api_changes/api_changes_3.3.0/deprecations.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ are deprecated. Panning and zooming are now implemented using the
328328

329329
Passing None to various Axes subclass factories
330330
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
331-
Support for passing ``None`` as base class to `.axes.subplot_class_factory`,
331+
Support for passing ``None`` as base class to ``axes.subplot_class_factory``,
332332
``axes_grid1.parasite_axes.host_axes_class_factory``,
333333
``axes_grid1.parasite_axes.host_subplot_class_factory``,
334334
``axes_grid1.parasite_axes.parasite_axes_class_factory``, and

‎doc/api/prev_api_changes/api_changes_3.4.0/deprecations.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ Subplot-related attributes and methods
3838
Some ``SubplotBase`` methods and attributes have been deprecated and/or moved
3939
to `.SubplotSpec`:
4040

41-
- ``get_geometry`` (use `.SubplotBase.get_subplotspec` instead),
42-
- ``change_geometry`` (use `.SubplotBase.set_subplotspec` instead),
41+
- ``get_geometry`` (use ``SubplotBase.get_subplotspec`` instead),
42+
- ``change_geometry`` (use ``SubplotBase.set_subplotspec`` instead),
4343
- ``is_first_row``, ``is_last_row``, ``is_first_col``, ``is_last_col`` (use the
4444
corresponding methods on the `.SubplotSpec` instance instead),
4545
- ``update_params`` (now a no-op),

‎doc/users/prev_whats_new/whats_new_3.0.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,10 @@ independent on the axes size or units. To revert to the previous behaviour
141141
set the axes' aspect ratio to automatic by using ``ax.set_aspect("auto")`` or
142142
``plt.axis("auto")``.
143143

144-
Add ``ax.get_gridspec`` to `.SubplotBase`
145-
-----------------------------------------
144+
Add ``ax.get_gridspec`` to ``SubplotBase``
145+
------------------------------------------
146146

147-
New method `.SubplotBase.get_gridspec` is added so that users can
147+
New method ``SubplotBase.get_gridspec`` is added so that users can
148148
easily get the gridspec that went into making an axes:
149149

150150
..code::

‎lib/matplotlib/_constrained_layout.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ def make_layoutgrids(fig, layoutgrids, rect=(0, 0, 1, 1)):
187187

188188
# for each axes at the local level add its gridspec:
189189
foraxinfig._localaxes:
190-
ifhasattr(ax,'get_subplotspec'):
190+
ifax.get_subplotspec():
191191
gs=ax.get_subplotspec().get_gridspec()
192192
layoutgrids=make_layoutgrids_gs(layoutgrids,gs)
193193

@@ -250,7 +250,7 @@ def check_no_collapsed_axes(layoutgrids, fig):
250250
returnFalse
251251

252252
foraxinfig.axes:
253-
ifhasattr(ax,'get_subplotspec'):
253+
ifax.get_subplotspec():
254254
gs=ax.get_subplotspec().get_gridspec()
255255
ifgsinlayoutgrids:
256256
lg=layoutgrids[gs]
@@ -265,7 +265,7 @@ def check_no_collapsed_axes(layoutgrids, fig):
265265
defcompress_fixed_aspect(layoutgrids,fig):
266266
gs=None
267267
foraxinfig.axes:
268-
ifnothasattr(ax,'get_subplotspec'):
268+
ifnotax.get_subplotspec():
269269
continue
270270
ax.apply_aspect()
271271
sub=ax.get_subplotspec()
@@ -357,7 +357,7 @@ def make_layout_margins(layoutgrids, fig, renderer, *, w_pad=0, h_pad=0,
357357
layoutgrids[sfig].parent.edit_outer_margin_mins(margins,ss)
358358

359359
foraxinfig._localaxes:
360-
ifnothasattr(ax,'get_subplotspec')ornotax.get_in_layout():
360+
ifnotax.get_subplotspec()ornotax.get_in_layout():
361361
continue
362362

363363
ss=ax.get_subplotspec()
@@ -488,8 +488,8 @@ def match_submerged_margins(layoutgrids, fig):
488488
forsfiginfig.subfigs:
489489
match_submerged_margins(layoutgrids,sfig)
490490

491-
axs= [aforainfig.get_axes()if (hasattr(a,'get_subplotspec')
492-
anda.get_in_layout())]
491+
axs= [aforainfig.get_axes()
492+
ifa.get_subplotspec()anda.get_in_layout()]
493493

494494
forax1inaxs:
495495
ss1=ax1.get_subplotspec()
@@ -620,7 +620,7 @@ def reposition_axes(layoutgrids, fig, renderer, *,
620620
wspace=wspace,hspace=hspace)
621621

622622
foraxinfig._localaxes:
623-
ifnothasattr(ax,'get_subplotspec')ornotax.get_in_layout():
623+
ifnotax.get_subplotspec()ornotax.get_in_layout():
624624
continue
625625

626626
# grid bbox is in Figure coordinates, but we specify in panel
@@ -742,7 +742,7 @@ def reset_margins(layoutgrids, fig):
742742
forsfiginfig.subfigs:
743743
reset_margins(layoutgrids,sfig)
744744
foraxinfig.axes:
745-
ifhasattr(ax,'get_subplotspec')andax.get_in_layout():
745+
ifax.get_subplotspec()andax.get_in_layout():
746746
ss=ax.get_subplotspec()
747747
gs=ss.get_gridspec()
748748
ifgsinlayoutgrids:

‎lib/matplotlib/axes/__init__.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
1-
from ._subplotsimport*
1+
from .import_base
22
from ._axesimport*
3+
4+
# Backcompat.
5+
from ._axesimportAxesasSubplot
6+
from ._baseimport_AxesBaseasSubplotBase
7+
8+
9+
defsubplot_class_factory(cls):returncls

‎lib/matplotlib/axes/_base.py

Lines changed: 117 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
fromcollections.abcimportMutableSequence
1+
fromcollections.abcimportIterable,MutableSequence
22
fromcontextlibimportExitStack
33
importfunctools
44
importinspect
@@ -18,6 +18,7 @@
1818
importmatplotlib.collectionsasmcoll
1919
importmatplotlib.colorsasmcolors
2020
importmatplotlib.font_managerasfont_manager
21+
frommatplotlib.gridspecimportSubplotSpec
2122
importmatplotlib.imageasmimage
2223
importmatplotlib.linesasmlines
2324
importmatplotlib.patchesasmpatches
@@ -569,8 +570,8 @@ def __str__(self):
569570
return"{0}({1[0]:g},{1[1]:g};{1[2]:g}x{1[3]:g})".format(
570571
type(self).__name__,self._position.bounds)
571572

572-
def__init__(self,fig,rect,
573-
*,
573+
def__init__(self,fig,
574+
*args,
574575
facecolor=None,# defaults to rc axes.facecolor
575576
frameon=True,
576577
sharex=None,# use Axes instance's xaxis info
@@ -589,9 +590,18 @@ def __init__(self, fig, rect,
589590
fig : `~matplotlib.figure.Figure`
590591
The Axes is built in the `.Figure` *fig*.
591592
592-
rect : tuple (left, bottom, width, height).
593-
The Axes is built in the rectangle *rect*. *rect* is in
594-
`.Figure` coordinates.
593+
*args
594+
``*args`` can be a single ``(left, bottom, width, height)``
595+
rectangle or a single `.Bbox`. This specifies the rectangle (in
596+
figure coordinates) where the Axes is positioned.
597+
598+
``*args`` can also consist of three numbers or a single three-digit
599+
number; in the latter case, the digits are considered as
600+
independent numbers. The numbers are interpreted as ``(nrows,
601+
ncols, index)``: ``(nrows, ncols)`` specifies the size of an array
602+
of subplots, and ``index`` is the 1-based index of the subplot
603+
being created. Finally, ``*args`` can also directly be a
604+
`.SubplotSpec` instance.
595605
596606
sharex, sharey : `~.axes.Axes`, optional
597607
The x or y `~.matplotlib.axis` is shared with the x or
@@ -616,10 +626,21 @@ def __init__(self, fig, rect,
616626
"""
617627

618628
super().__init__()
619-
ifisinstance(rect,mtransforms.Bbox):
620-
self._position=rect
629+
if"rect"inkwargs:
630+
ifargs:
631+
raiseTypeError(
632+
"'rect' cannot be used together with positional arguments")
633+
rect=kwargs.pop("rect")
634+
_api.check_isinstance((mtransforms.Bbox,Iterable),rect=rect)
635+
args= (rect,)
636+
self._subplotspec=subplotspec=None
637+
iflen(args)==1andisinstance(args[0],mtransforms.Bbox):
638+
self._position=args[0]
639+
eliflen(args)==1andnp.iterable(args[0]):
640+
self._position=mtransforms.Bbox.from_bounds(*args[0])
621641
else:
622-
self._position=mtransforms.Bbox.from_bounds(*rect)
642+
self._position=self._originalPosition=mtransforms.Bbox.unit()
643+
subplotspec=SubplotSpec._from_subplot_args(fig,args)
623644
ifself._position.width<0orself._position.height<0:
624645
raiseValueError('Width and height specified must be non-negative')
625646
self._originalPosition=self._position.frozen()
@@ -632,8 +653,14 @@ def __init__(self, fig, rect,
632653
self._sharey=sharey
633654
self.set_label(label)
634655
self.set_figure(fig)
656+
# The subplotspec needs to be set after the figure (so that
657+
# figure-level subplotpars are taken into account), but the figure
658+
# needs to be set after self._position is initialized.
659+
ifsubplotspec:
660+
self.set_subplotspec(subplotspec)
635661
self.set_box_aspect(box_aspect)
636662
self._axes_locator=None# Optionally set via update(kwargs).
663+
637664
# placeholder for any colorbars added that use this Axes.
638665
# (see colorbar.py):
639666
self._colorbars= []
@@ -737,6 +764,19 @@ def __repr__(self):
737764
fields+= [f"{name}label={axis.get_label().get_text()!r}"]
738765
returnf"<{self.__class__.__name__}: "+", ".join(fields)+">"
739766

767+
defget_subplotspec(self):
768+
"""Return the `.SubplotSpec` associated with the subplot, or None."""
769+
returnself._subplotspec
770+
771+
defset_subplotspec(self,subplotspec):
772+
"""Set the `.SubplotSpec`. associated with the subplot."""
773+
self._subplotspec=subplotspec
774+
self._set_position(subplotspec.get_position(self.figure))
775+
776+
defget_gridspec(self):
777+
"""Return the `.GridSpec` associated with the subplot, or None."""
778+
returnself._subplotspec.get_gridspec()
779+
740780
@_api.delete_parameter("3.6","args")
741781
@_api.delete_parameter("3.6","kwargs")
742782
defget_window_extent(self,renderer=None,*args,**kwargs):
@@ -4439,15 +4479,22 @@ def _make_twin_axes(self, *args, **kwargs):
44394479
"""Make a twinx Axes of self. This is used for twinx and twiny."""
44404480
# Typically, SubplotBase._make_twin_axes is called instead of this.
44414481
if'sharex'inkwargsand'sharey'inkwargs:
4442-
raiseValueError("Twinned Axes may share only one axis")
4443-
ax2=self.figure.add_axes(
4444-
self.get_position(True),*args,**kwargs,
4445-
axes_locator=_TransformedBoundsLocator(
4446-
[0,0,1,1],self.transAxes))
4482+
# The following line is added in v2.2 to avoid breaking Seaborn,
4483+
# which currently uses this internal API.
4484+
ifkwargs["sharex"]isnotselfandkwargs["sharey"]isnotself:
4485+
raiseValueError("Twinned Axes may share only one axis")
4486+
ss=self.get_subplotspec()
4487+
ifss:
4488+
twin=self.figure.add_subplot(ss,*args,**kwargs)
4489+
else:
4490+
twin=self.figure.add_axes(
4491+
self.get_position(True),*args,**kwargs,
4492+
axes_locator=_TransformedBoundsLocator(
4493+
[0,0,1,1],self.transAxes))
44474494
self.set_adjustable('datalim')
4448-
ax2.set_adjustable('datalim')
4449-
self._twinned_axes.join(self,ax2)
4450-
returnax2
4495+
twin.set_adjustable('datalim')
4496+
self._twinned_axes.join(self,twin)
4497+
returntwin
44514498

44524499
deftwinx(self):
44534500
"""
@@ -4515,3 +4562,56 @@ def get_shared_x_axes(self):
45154562
defget_shared_y_axes(self):
45164563
"""Return an immutable view on the shared y-axes Grouper."""
45174564
returncbook.GrouperView(self._shared_axes["y"])
4565+
4566+
deflabel_outer(self):
4567+
"""
4568+
Only show "outer" labels and tick labels.
4569+
4570+
x-labels are only kept for subplots on the last row (or first row, if
4571+
labels are on the top side); y-labels only for subplots on the first
4572+
column (or last column, if labels are on the right side).
4573+
"""
4574+
self._label_outer_xaxis(check_patch=False)
4575+
self._label_outer_yaxis(check_patch=False)
4576+
4577+
def_label_outer_xaxis(self,*,check_patch):
4578+
# see documentation in label_outer.
4579+
ifcheck_patchandnotisinstance(self.patch,mpl.patches.Rectangle):
4580+
return
4581+
ss=self.get_subplotspec()
4582+
ifnotss:
4583+
return
4584+
label_position=self.xaxis.get_label_position()
4585+
ifnotss.is_first_row():# Remove top label/ticklabels/offsettext.
4586+
iflabel_position=="top":
4587+
self.set_xlabel("")
4588+
self.xaxis.set_tick_params(which="both",labeltop=False)
4589+
ifself.xaxis.offsetText.get_position()[1]==1:
4590+
self.xaxis.offsetText.set_visible(False)
4591+
ifnotss.is_last_row():# Remove bottom label/ticklabels/offsettext.
4592+
iflabel_position=="bottom":
4593+
self.set_xlabel("")
4594+
self.xaxis.set_tick_params(which="both",labelbottom=False)
4595+
ifself.xaxis.offsetText.get_position()[1]==0:
4596+
self.xaxis.offsetText.set_visible(False)
4597+
4598+
def_label_outer_yaxis(self,*,check_patch):
4599+
# see documentation in label_outer.
4600+
ifcheck_patchandnotisinstance(self.patch,mpl.patches.Rectangle):
4601+
return
4602+
ss=self.get_subplotspec()
4603+
ifnotss:
4604+
return
4605+
label_position=self.yaxis.get_label_position()
4606+
ifnotss.is_first_col():# Remove left label/ticklabels/offsettext.
4607+
iflabel_position=="left":
4608+
self.set_ylabel("")
4609+
self.yaxis.set_tick_params(which="both",labelleft=False)
4610+
ifself.yaxis.offsetText.get_position()[0]==0:
4611+
self.yaxis.offsetText.set_visible(False)
4612+
ifnotss.is_last_col():# Remove right label/ticklabels/offsettext.
4613+
iflabel_position=="right":
4614+
self.set_ylabel("")
4615+
self.yaxis.set_tick_params(which="both",labelright=False)
4616+
ifself.yaxis.offsetText.get_position()[0]==1:
4617+
self.yaxis.offsetText.set_visible(False)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp