From 00591a069e728d62065e97210ac5ff9e53517b04 Mon Sep 17 00:00:00 2001 From: hannah Date: Fri, 15 Sep 2023 15:14:12 -0400 Subject: [PATCH 01/83] Backport changes to contribute from PR #26737 --- doc/devel/contribute.rst | 69 +++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/doc/devel/contribute.rst b/doc/devel/contribute.rst index 9ed1fe500fa5..9b53a80ab374 100644 --- a/doc/devel/contribute.rst +++ b/doc/devel/contribute.rst @@ -170,18 +170,18 @@ also welcome to post feature requests or pull requests. If you are reporting a bug, please do your best to include the following: -1. A short, top-level summary of the bug. In most cases, this should be 1-2 +#. A short, top-level summary of the bug. In most cases, this should be 1-2 sentences. -2. A short, self-contained code snippet to reproduce the bug, ideally allowing +#. A short, self-contained code snippet to reproduce the bug, ideally allowing a simple copy and paste to reproduce. Please do your best to reduce the code snippet to the minimum required. -3. The actual outcome of the code snippet. +#. The actual outcome of the code snippet. -4. The expected outcome of the code snippet. +#. The expected outcome of the code snippet. -5. The Matplotlib version, Python version and platform that you are using. You +#. The Matplotlib version, Python version and platform that you are using. You can grab the version with the following commands:: >>> import matplotlib @@ -229,52 +229,54 @@ contribute to Matplotlib. A brief overview of the workflow is as follows. -1. `Create an account `_ on GitHub if you do not +#. `Create an account `_ on GitHub if you do not already have one. -2. Fork the `project repository `_: - click on the 'Fork' button near the top of the page. This creates a copy of - the code under your account on the GitHub server. +#. Fork the `project repository `_ by + clicking on the :octicon:`repo-forked` **Fork** button near the top of the page. + This creates a copy of the code under your account on the GitHub server. -.. tab-set:: +#. Set up a development environment: - .. tab-item:: Local development + .. tab-set:: - 3. Clone this copy to your local disk:: + .. tab-item:: Local development - git clone https://github.com//matplotlib.git + Clone this copy to your local disk:: - .. tab-item:: Using GitHub Codespaces + git clone https://github.com//matplotlib.git - 3. Check out the Matplotlib repository and activate your development - environment: + .. tab-item:: Using GitHub Codespaces - * Open codespaces on your fork by clicking on the green "Code" button + Check out the Matplotlib repository and activate your development environment: + + #. Open codespaces on your fork by clicking on the green "Code" button on the GitHub web interface and selecting the "Codespaces" tab. - * Next, click on "Open codespaces on ". You will be + + #. Next, click on "Open codespaces on ". You will be able to change branches later, so you can select the default ``main`` branch. - * After the codespace is created, you will be taken to a new browser + + #. After the codespace is created, you will be taken to a new browser tab where you can use the terminal to activate a pre-defined conda environment called ``mpl-dev``:: - conda activate mpl-dev - + conda activate mpl-dev -4. Install the local version of Matplotlib with:: +#. Install the local version of Matplotlib with:: python -m pip install -e . See :ref:`installing_for_devs` for detailed instructions. -5. Create a branch to hold your changes:: +#. Create a branch to hold your changes:: git checkout -b my-feature origin/main and start making changes. Never work in the ``main`` branch! -6. Work on this task using Git to do the version control. Codespaces persist for +#. Work on this task using Git to do the version control. Codespaces persist for some time (check the `documentation for details `_) and can be managed on https://github.com/codespaces. When you're done editing @@ -301,11 +303,11 @@ GitHub Codespaces workflows `_. You can use it by connecting to this desktop via your web browser. To do this: - 1. Press ``F1`` or ``Ctrl/Cmd+Shift+P`` and select + #. Press ``F1`` or ``Ctrl/Cmd+Shift+P`` and select ``Ports: Focus on Ports View`` in the VSCode session to bring it into focus. Open the ports view in your tool, select the ``noVNC`` port, and click the Globe icon. - 2. In the browser that appears, click the Connect button and enter the desktop + #. In the browser that appears, click the Connect button and enter the desktop password (``vscode`` by default). Check the `GitHub instructions @@ -391,10 +393,11 @@ Rules Introducing ~~~~~~~~~~~ -1. Announce the deprecation in a new file +#. Announce the deprecation in a new file :file:`doc/api/next_api_changes/deprecations/99999-ABC.rst` where ``99999`` is the pull request number and ``ABC`` are the contributor's initials. -2. If possible, issue a `~matplotlib.MatplotlibDeprecationWarning` when the + +#. If possible, issue a `~matplotlib.MatplotlibDeprecationWarning` when the deprecated API is used. There are a number of helper tools for this: - Use ``_api.warn_deprecated()`` for general deprecation warnings @@ -411,7 +414,7 @@ Introducing You can use standard rst cross references in *alternative*. -3. Make appropriate changes to the type hints in the associated ``.pyi`` file. +#. Make appropriate changes to the type hints in the associated ``.pyi`` file. The general guideline is to match runtime reported behavior. - Items marked with ``@_api.deprecated`` or ``@_api.deprecate_privatize_attribute`` @@ -431,15 +434,17 @@ Introducing Expiring ~~~~~~~~ -1. Announce the API changes in a new file +#. Announce the API changes in a new file :file:`doc/api/next_api_changes/[kind]/99999-ABC.rst` where ``99999`` is the pull request number and ``ABC`` are the contributor's initials, and ``[kind]`` is one of the folders :file:`behavior`, :file:`development`, :file:`removals`. See :file:`doc/api/next_api_changes/README.rst` for more information. For the content, you can usually copy the deprecation notice and adapt it slightly. -2. Change the code functionality and remove any related deprecation warnings. -3. Make appropriate changes to the type hints in the associated ``.pyi`` file. + +#. Change the code functionality and remove any related deprecation warnings. + +#. Make appropriate changes to the type hints in the associated ``.pyi`` file. - Items marked with ``@_api.deprecated`` or ``@_api.deprecate_privatize_attribute`` are to be removed on expiry. From 8c50ae8bf51913d8e1820c30dedd1b893ad33977 Mon Sep 17 00:00:00 2001 From: hannah Date: Fri, 15 Sep 2023 15:24:28 -0400 Subject: [PATCH 02/83] Backport changes to contribute from PR #26737 --- doc/devel/contribute.rst | 69 +++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/doc/devel/contribute.rst b/doc/devel/contribute.rst index 9ed1fe500fa5..9b53a80ab374 100644 --- a/doc/devel/contribute.rst +++ b/doc/devel/contribute.rst @@ -170,18 +170,18 @@ also welcome to post feature requests or pull requests. If you are reporting a bug, please do your best to include the following: -1. A short, top-level summary of the bug. In most cases, this should be 1-2 +#. A short, top-level summary of the bug. In most cases, this should be 1-2 sentences. -2. A short, self-contained code snippet to reproduce the bug, ideally allowing +#. A short, self-contained code snippet to reproduce the bug, ideally allowing a simple copy and paste to reproduce. Please do your best to reduce the code snippet to the minimum required. -3. The actual outcome of the code snippet. +#. The actual outcome of the code snippet. -4. The expected outcome of the code snippet. +#. The expected outcome of the code snippet. -5. The Matplotlib version, Python version and platform that you are using. You +#. The Matplotlib version, Python version and platform that you are using. You can grab the version with the following commands:: >>> import matplotlib @@ -229,52 +229,54 @@ contribute to Matplotlib. A brief overview of the workflow is as follows. -1. `Create an account `_ on GitHub if you do not +#. `Create an account `_ on GitHub if you do not already have one. -2. Fork the `project repository `_: - click on the 'Fork' button near the top of the page. This creates a copy of - the code under your account on the GitHub server. +#. Fork the `project repository `_ by + clicking on the :octicon:`repo-forked` **Fork** button near the top of the page. + This creates a copy of the code under your account on the GitHub server. -.. tab-set:: +#. Set up a development environment: - .. tab-item:: Local development + .. tab-set:: - 3. Clone this copy to your local disk:: + .. tab-item:: Local development - git clone https://github.com//matplotlib.git + Clone this copy to your local disk:: - .. tab-item:: Using GitHub Codespaces + git clone https://github.com//matplotlib.git - 3. Check out the Matplotlib repository and activate your development - environment: + .. tab-item:: Using GitHub Codespaces - * Open codespaces on your fork by clicking on the green "Code" button + Check out the Matplotlib repository and activate your development environment: + + #. Open codespaces on your fork by clicking on the green "Code" button on the GitHub web interface and selecting the "Codespaces" tab. - * Next, click on "Open codespaces on ". You will be + + #. Next, click on "Open codespaces on ". You will be able to change branches later, so you can select the default ``main`` branch. - * After the codespace is created, you will be taken to a new browser + + #. After the codespace is created, you will be taken to a new browser tab where you can use the terminal to activate a pre-defined conda environment called ``mpl-dev``:: - conda activate mpl-dev - + conda activate mpl-dev -4. Install the local version of Matplotlib with:: +#. Install the local version of Matplotlib with:: python -m pip install -e . See :ref:`installing_for_devs` for detailed instructions. -5. Create a branch to hold your changes:: +#. Create a branch to hold your changes:: git checkout -b my-feature origin/main and start making changes. Never work in the ``main`` branch! -6. Work on this task using Git to do the version control. Codespaces persist for +#. Work on this task using Git to do the version control. Codespaces persist for some time (check the `documentation for details `_) and can be managed on https://github.com/codespaces. When you're done editing @@ -301,11 +303,11 @@ GitHub Codespaces workflows `_. You can use it by connecting to this desktop via your web browser. To do this: - 1. Press ``F1`` or ``Ctrl/Cmd+Shift+P`` and select + #. Press ``F1`` or ``Ctrl/Cmd+Shift+P`` and select ``Ports: Focus on Ports View`` in the VSCode session to bring it into focus. Open the ports view in your tool, select the ``noVNC`` port, and click the Globe icon. - 2. In the browser that appears, click the Connect button and enter the desktop + #. In the browser that appears, click the Connect button and enter the desktop password (``vscode`` by default). Check the `GitHub instructions @@ -391,10 +393,11 @@ Rules Introducing ~~~~~~~~~~~ -1. Announce the deprecation in a new file +#. Announce the deprecation in a new file :file:`doc/api/next_api_changes/deprecations/99999-ABC.rst` where ``99999`` is the pull request number and ``ABC`` are the contributor's initials. -2. If possible, issue a `~matplotlib.MatplotlibDeprecationWarning` when the + +#. If possible, issue a `~matplotlib.MatplotlibDeprecationWarning` when the deprecated API is used. There are a number of helper tools for this: - Use ``_api.warn_deprecated()`` for general deprecation warnings @@ -411,7 +414,7 @@ Introducing You can use standard rst cross references in *alternative*. -3. Make appropriate changes to the type hints in the associated ``.pyi`` file. +#. Make appropriate changes to the type hints in the associated ``.pyi`` file. The general guideline is to match runtime reported behavior. - Items marked with ``@_api.deprecated`` or ``@_api.deprecate_privatize_attribute`` @@ -431,15 +434,17 @@ Introducing Expiring ~~~~~~~~ -1. Announce the API changes in a new file +#. Announce the API changes in a new file :file:`doc/api/next_api_changes/[kind]/99999-ABC.rst` where ``99999`` is the pull request number and ``ABC`` are the contributor's initials, and ``[kind]`` is one of the folders :file:`behavior`, :file:`development`, :file:`removals`. See :file:`doc/api/next_api_changes/README.rst` for more information. For the content, you can usually copy the deprecation notice and adapt it slightly. -2. Change the code functionality and remove any related deprecation warnings. -3. Make appropriate changes to the type hints in the associated ``.pyi`` file. + +#. Change the code functionality and remove any related deprecation warnings. + +#. Make appropriate changes to the type hints in the associated ``.pyi`` file. - Items marked with ``@_api.deprecated`` or ``@_api.deprecate_privatize_attribute`` are to be removed on expiry. From 15d6c2fdf78cf1111139d7a85293fa2745e46f5a Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Mon, 18 Sep 2023 17:07:06 +0200 Subject: [PATCH 03/83] Backport PR #26804: Fix issue with locale comma when not using math text --- lib/matplotlib/tests/test_ticker.py | 5 +++++ lib/matplotlib/ticker.py | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/tests/test_ticker.py b/lib/matplotlib/tests/test_ticker.py index 9d08e335dbdd..961daaa1d167 100644 --- a/lib/matplotlib/tests/test_ticker.py +++ b/lib/matplotlib/tests/test_ticker.py @@ -1654,6 +1654,11 @@ def _impl_locale_comma(): fmt = ',$\\mathdefault{,%1.1f},$' x = ticks._format_maybe_minus_and_locale(fmt, 0.5) assert x == ',$\\mathdefault{,0{,}5},$' + # Make sure no brackets are added if not using math text + ticks = mticker.ScalarFormatter(useMathText=False, useLocale=True) + fmt = '%1.1f' + x = ticks._format_maybe_minus_and_locale(fmt, 0.5) + assert x == '0,5' def test_locale_comma(): diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index df848ef04ad8..958e25d7b2c7 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -516,11 +516,11 @@ def _format_maybe_minus_and_locale(self, fmt, arg): Format *arg* with *fmt*, applying Unicode minus and locale if desired. """ return self.fix_minus( - # Escape commas introduced by format_string but not those present - # from the beginning in fmt. - ",".join(locale.format_string(part, (arg,), True) - .replace(",", "{,}") - for part in fmt.split(",")) + # Escape commas introduced by locale.format_string if using math text, + # but not those present from the beginning in fmt. + (",".join(locale.format_string(part, (arg,), True).replace(",", "{,}") + for part in fmt.split(",")) if self._useMathText + else locale.format_string(fmt, (arg,), True)) if self._useLocale else fmt % arg) From 16898539e5937640e6849b181b4d882d21ed0fb0 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Mon, 18 Sep 2023 12:00:57 -0400 Subject: [PATCH 04/83] Backport PR #26807: Catch ValueError to support pytorch (and others) plotting --- lib/matplotlib/cbook.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 80ec1612688b..f02486a0e280 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -1685,7 +1685,7 @@ def safe_first_element(obj): def _safe_first_finite(obj, *, skip_nonfinite=True): """ Return the first finite element in *obj* if one is available and skip_nonfinite is - True. Otherwise return the first element. + True. Otherwise, return the first element. This is a method for internal use. @@ -1697,7 +1697,7 @@ def safe_isfinite(val): return False try: return math.isfinite(val) - except TypeError: + except (TypeError, ValueError): pass try: return np.isfinite(val) if np.isscalar(val) else True From 61aea385103d8dfc105320854ef40a080d34773a Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Mon, 18 Sep 2023 16:34:28 -0500 Subject: [PATCH 05/83] Backport PR #26799: Update kiwisolver and pillow versions to be consistent with requirements Merge pull request #26799 from oscargus/kiwiversion Update kiwisolver and pillow versions to be consistent with requirements (cherry picked from commit ca52d680f2db945c15bfe3f98b601177501a8974) Conflict was because numpy is pinned to `<2` on the release branch but not on main --- environment.yml | 4 ++-- lib/matplotlib/__init__.py | 2 +- requirements/testing/mypy.txt | 4 ++-- setup.py | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/environment.yml b/environment.yml index c35b90e9acba..7b13735bb172 100644 --- a/environment.yml +++ b/environment.yml @@ -14,9 +14,9 @@ dependencies: - cycler>=0.10.0 - fonttools>=4.22.0 - importlib-resources>=3.2.0 - - kiwisolver>=1.0.1 + - kiwisolver>=1.3.1 - numpy>=1.21 - - pillow>=6.2 + - pillow>=8 - pybind11>=2.6.0 - pygobject - pyparsing>=2.3.1 diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 1e3dab1b336b..353406832c4b 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -246,7 +246,7 @@ def _check_versions(): for modname, minver in [ ("cycler", "0.10"), ("dateutil", "2.7"), - ("kiwisolver", "1.0.1"), + ("kiwisolver", "1.3.1"), ("numpy", "1.21"), ("pyparsing", "2.3.1"), ]: diff --git a/requirements/testing/mypy.txt b/requirements/testing/mypy.txt index 801601bcd6eb..f697772da5ea 100644 --- a/requirements/testing/mypy.txt +++ b/requirements/testing/mypy.txt @@ -17,10 +17,10 @@ sphinx contourpy>=1.0.1 cycler>=0.10 fonttools>=4.22.0 -kiwisolver>=1.0.1 +kiwisolver>=1.3.1 numpy>=1.19 packaging>=20.0 -pillow>=6.2.0 +pillow>=8 pyparsing>=2.3.1 python-dateutil>=2.7 setuptools_scm>=7 diff --git a/setup.py b/setup.py index a876f6e35065..9c37c2108286 100644 --- a/setup.py +++ b/setup.py @@ -332,10 +332,10 @@ def make_release_tree(self, base_dir, files): "contourpy>=1.0.1", "cycler>=0.10", "fonttools>=4.22.0", - "kiwisolver>=1.0.1", + "kiwisolver>=1.3.1", "numpy>=1.21,<2", "packaging>=20.0", - "pillow>=6.2.0", + "pillow>=8", "pyparsing>=2.3.1", "python-dateutil>=2.7", ] + ( From cc9b0a2b78ada1926e91f5e8d3d152957346d78a Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Mon, 18 Sep 2023 18:50:52 -0400 Subject: [PATCH 06/83] Backport PR #26811: Add overload for slice to Spines.__getitem__ --- lib/matplotlib/spines.pyi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/matplotlib/spines.pyi b/lib/matplotlib/spines.pyi index 0a5243776730..0f06a6d1ce2b 100644 --- a/lib/matplotlib/spines.pyi +++ b/lib/matplotlib/spines.pyi @@ -75,6 +75,8 @@ class Spines(MutableMapping[str, Spine]): def __getitem__(self, key: str) -> Spine: ... @overload def __getitem__(self, key: list[str]) -> SpinesProxy: ... + @overload + def __getitem__(self, key: slice) -> SpinesProxy: ... def __setitem__(self, key: str, value: Spine) -> None: ... def __delitem__(self, key: str) -> None: ... def __iter__(self) -> Iterator[str]: ... From 9897576ae5f5e49119cfb05b80a5e41cdc762907 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Tue, 19 Sep 2023 09:43:42 -0500 Subject: [PATCH 07/83] Backport PR #26825: Fix issue with non-string labels and legend --- lib/matplotlib/container.py | 2 +- lib/matplotlib/tests/test_container.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/container.py b/lib/matplotlib/container.py index e11fea391871..0f082e298afc 100644 --- a/lib/matplotlib/container.py +++ b/lib/matplotlib/container.py @@ -19,7 +19,7 @@ def __new__(cls, *args, **kwargs): def __init__(self, kl, label=None): self._callbacks = cbook.CallbackRegistry(signals=["pchanged"]) self._remove_method = None - self._label = label + self._label = str(label) if label is not None else None def remove(self): for c in cbook.flatten( diff --git a/lib/matplotlib/tests/test_container.py b/lib/matplotlib/tests/test_container.py index 8e894d9e9084..1e4577c518ae 100644 --- a/lib/matplotlib/tests/test_container.py +++ b/lib/matplotlib/tests/test_container.py @@ -1,3 +1,4 @@ +import numpy as np import matplotlib.pyplot as plt @@ -28,3 +29,9 @@ def test_errorbar_remove(): eb = ax.errorbar([1], [1], fmt='none') eb.remove() + + +def test_nonstring_label(): + # Test for #26824 + plt.bar(np.arange(10), np.random.rand(10), label=1) + plt.legend() From f2847eb1a5efd55c9138c459683dfd83c08666f0 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Mon, 18 Sep 2023 23:50:00 -0500 Subject: [PATCH 08/83] Backport PR #26814: Bump pypa/cibuildwheel from 2.15.0 to 2.16.0 --- .github/workflows/cibuildwheel.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/cibuildwheel.yml b/.github/workflows/cibuildwheel.yml index 54b68c6bc56b..00e5371bdc6c 100644 --- a/.github/workflows/cibuildwheel.yml +++ b/.github/workflows/cibuildwheel.yml @@ -136,7 +136,7 @@ jobs: path: dist/ - name: Build wheels for CPython 3.12 - uses: pypa/cibuildwheel@39a63b5912f086dd459cf6fcb13dcdd3fe3bc24d # v2.15.0 + uses: pypa/cibuildwheel@a873dd9cbf9e3c4c73a1fd11ac31cf835f6eb502 # v2.16.0 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -158,7 +158,7 @@ jobs: pip install --pre "numpy>=1.25" - name: Build wheels for CPython 3.11 - uses: pypa/cibuildwheel@39a63b5912f086dd459cf6fcb13dcdd3fe3bc24d # v2.15.0 + uses: pypa/cibuildwheel@a873dd9cbf9e3c4c73a1fd11ac31cf835f6eb502 # v2.16.0 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -166,7 +166,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.10 - uses: pypa/cibuildwheel@39a63b5912f086dd459cf6fcb13dcdd3fe3bc24d # v2.15.0 + uses: pypa/cibuildwheel@a873dd9cbf9e3c4c73a1fd11ac31cf835f6eb502 # v2.16.0 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -174,7 +174,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.9 - uses: pypa/cibuildwheel@39a63b5912f086dd459cf6fcb13dcdd3fe3bc24d # v2.15.0 + uses: pypa/cibuildwheel@a873dd9cbf9e3c4c73a1fd11ac31cf835f6eb502 # v2.16.0 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -182,7 +182,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for PyPy - uses: pypa/cibuildwheel@39a63b5912f086dd459cf6fcb13dcdd3fe3bc24d # v2.15.0 + uses: pypa/cibuildwheel@a873dd9cbf9e3c4c73a1fd11ac31cf835f6eb502 # v2.16.0 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: From 5619fd947b95ef070e0e541c3247ec20e43f1daf Mon Sep 17 00:00:00 2001 From: Chiraag Balu <86278218+chiraagbalu@users.noreply.github.com> Date: Tue, 19 Sep 2023 23:06:04 -0700 Subject: [PATCH 09/83] Backport PR #26834: Fix Issue 26821: [Bug]: ValueError: The truth value... when an ndarray is passed to the color kwarg of axes3d.scatter --- lib/mpl_toolkits/mplot3d/axes3d.py | 2 +- lib/mpl_toolkits/mplot3d/tests/test_axes3d.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index aeb6a66d2c98..a74c11f54e60 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2374,7 +2374,7 @@ def scatter(self, xs, ys, zs=0, zdir='z', s=20, c=None, depthshade=True, xs, ys, zs, s, c, color = cbook.delete_masked_points( xs, ys, zs, s, c, kwargs.get('color', None) ) - if kwargs.get('color', None): + if kwargs.get("color") is not None: kwargs['color'] = color # For xs and ys, 2D scatter() will do the copying. diff --git a/lib/mpl_toolkits/mplot3d/tests/test_axes3d.py b/lib/mpl_toolkits/mplot3d/tests/test_axes3d.py index 1f8764cbab9d..9cebc8a33efc 100644 --- a/lib/mpl_toolkits/mplot3d/tests/test_axes3d.py +++ b/lib/mpl_toolkits/mplot3d/tests/test_axes3d.py @@ -2270,3 +2270,12 @@ def test_Poly3DCollection_init_value_error(): 'or both for shade to work.'): poly = np.array([[0, 0, 1], [0, 1, 1], [0, 0, 0]], float) c = art3d.Poly3DCollection([poly], shade=True) + + +def test_ndarray_color_kwargs_value_error(): + # smoke test + # ensures ndarray can be passed to color in kwargs for 3d projection plot + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + ax.scatter(1, 0, 0, color=np.array([0, 0, 0, 1])) + fig.canvas.draw() From 0c43cf8c3d0612f7c3e4e4ca2457bd4e20e0aa88 Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Wed, 20 Sep 2023 16:58:26 +0100 Subject: [PATCH 10/83] Backport PR #26843: DOC: Use ax.xaxis rather ax.get_xaxis() --- doc/users/faq.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/users/faq.rst b/doc/users/faq.rst index 46084ec4c6c6..c4e133d56d73 100644 --- a/doc/users/faq.rst +++ b/doc/users/faq.rst @@ -123,7 +123,7 @@ The default formatter will use an offset to reduce the length of the ticklabels. To turn this feature off on a per-axis basis:: - ax.get_xaxis().get_major_formatter().set_useOffset(False) + ax.xaxis.get_major_formatter().set_useOffset(False) set :rc:`axes.formatter.useoffset`, or use a different formatter. See :mod:`~matplotlib.ticker` for details. From 5214b642f93d0f2d57546e30bf63ff8a091802b9 Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Wed, 20 Sep 2023 16:58:26 +0100 Subject: [PATCH 11/83] Backport PR #26843: DOC: Use ax.xaxis rather ax.get_xaxis() --- doc/users/faq.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/users/faq.rst b/doc/users/faq.rst index 46084ec4c6c6..c4e133d56d73 100644 --- a/doc/users/faq.rst +++ b/doc/users/faq.rst @@ -123,7 +123,7 @@ The default formatter will use an offset to reduce the length of the ticklabels. To turn this feature off on a per-axis basis:: - ax.get_xaxis().get_major_formatter().set_useOffset(False) + ax.xaxis.get_major_formatter().set_useOffset(False) set :rc:`axes.formatter.useoffset`, or use a different formatter. See :mod:`~matplotlib.ticker` for details. From a019695b629ac347fca6fed5d9bf7caf417becc0 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Thu, 21 Sep 2023 13:50:08 -0400 Subject: [PATCH 12/83] Backport PR #26849: Bump setuptools required version because of setuptools_scm v8 --- doc/api/next_api_changes/development/26849-KS.rst | 5 +++++ doc/devel/dependencies.rst | 2 +- pyproject.toml | 9 ++++++++- requirements/testing/mypy.txt | 1 + setup.py | 5 ++++- 5 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 doc/api/next_api_changes/development/26849-KS.rst diff --git a/doc/api/next_api_changes/development/26849-KS.rst b/doc/api/next_api_changes/development/26849-KS.rst new file mode 100644 index 000000000000..1a1deda40fca --- /dev/null +++ b/doc/api/next_api_changes/development/26849-KS.rst @@ -0,0 +1,5 @@ +Minimum version of setuptools bumped to 64 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To comply with requirements of ``setuptools_scm``, the minimum version of ``setuptools`` +has been increased from 42 to 64. diff --git a/doc/devel/dependencies.rst b/doc/devel/dependencies.rst index a865b80cab84..400bc63d42ac 100644 --- a/doc/devel/dependencies.rst +++ b/doc/devel/dependencies.rst @@ -228,7 +228,7 @@ Setup dependencies runtime dependency. - `PyBind11 `_ (>= 2.6). Used to connect C/C++ code with Python. -- `setuptools `_ (>= 42). +- `setuptools `_ (>= 64). - `setuptools_scm `_ (>= 7). Used to update the reported ``mpl.__version__`` based on the current git commit. Also a runtime dependency for editable installs. diff --git a/pyproject.toml b/pyproject.toml index d2e2f769b7ef..67f1805cda08 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,10 +4,17 @@ requires = [ "certifi>=2020.06.20", "numpy>=1.25", "pybind11>=2.6", - "setuptools>=42", + "setuptools>=64", "setuptools_scm>=7", ] +[tool.setuptools_scm] +version_scheme = "release-branch-semver" +local_scheme = "node-and-date" +write_to = "lib/matplotlib/_version.py" +parentdir_prefix_version = "matplotlib-" +fallback_version = "0.0+UNKNOWN" + [tool.isort] known_pydata = "numpy, matplotlib.pyplot" known_firstparty = "matplotlib,mpl_toolkits" diff --git a/requirements/testing/mypy.txt b/requirements/testing/mypy.txt index f697772da5ea..a5ca15cfbdad 100644 --- a/requirements/testing/mypy.txt +++ b/requirements/testing/mypy.txt @@ -24,5 +24,6 @@ pillow>=8 pyparsing>=2.3.1 python-dateutil>=2.7 setuptools_scm>=7 +setuptools>=64 importlib-resources>=3.2.0 ; python_version < "3.10" diff --git a/setup.py b/setup.py index 9c37c2108286..6f277d4e4d7d 100644 --- a/setup.py +++ b/setup.py @@ -340,7 +340,10 @@ def make_release_tree(self, base_dir, files): "python-dateutil>=2.7", ] + ( # Installing from a git checkout that is not producing a wheel. - ["setuptools_scm>=7"] if ( + # setuptools_scm warns with older setuptools, which turns into errors for our + # test suite. However setuptools_scm does not themselves pin the version of + # setuptools. + ["setuptools_scm>=7", "setuptools>=64"] if ( Path(__file__).with_name(".git").exists() and os.environ.get("CIBUILDWHEEL", "0") != "1" ) else [] From a36157436e8827655e1ff58deb0a98138f922ed2 Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Wed, 27 Sep 2023 16:54:54 +0100 Subject: [PATCH 13/83] Backport PR #26914: DOC: add a couple more placement examples, crosslink axes_grid [ci doc] --- .../demo_colorbar_with_axes_divider.py | 6 + .../demo_colorbar_with_inset_locator.py | 10 +- .../users_explain/axes/colorbar_placement.py | 113 ++++++++++++++++-- .../axes/constrainedlayout_guide.py | 4 +- 4 files changed, 118 insertions(+), 15 deletions(-) diff --git a/galleries/examples/axes_grid1/demo_colorbar_with_axes_divider.py b/galleries/examples/axes_grid1/demo_colorbar_with_axes_divider.py index e314c2dcea21..9e4611c65bb7 100644 --- a/galleries/examples/axes_grid1/demo_colorbar_with_axes_divider.py +++ b/galleries/examples/axes_grid1/demo_colorbar_with_axes_divider.py @@ -1,4 +1,6 @@ """ +.. _demo-colorbar-with-axes-divider: + ========================= Colorbar with AxesDivider ========================= @@ -8,6 +10,10 @@ method of the `.AxesDivider` can then be used to create a new axes on a given side ("top", "right", "bottom", or "left") of the original axes. This example uses `.append_axes` to add colorbars next to axes. + +Users should consider simply passing the main axes to the *ax* keyword argument of +`~.Figure.colorbar` instead of creating a locatable axes manually like this. +See :ref:`colorbar_placement`. """ import matplotlib.pyplot as plt diff --git a/galleries/examples/axes_grid1/demo_colorbar_with_inset_locator.py b/galleries/examples/axes_grid1/demo_colorbar_with_inset_locator.py index 0c8d48e23101..8ec7d0e7271b 100644 --- a/galleries/examples/axes_grid1/demo_colorbar_with_inset_locator.py +++ b/galleries/examples/axes_grid1/demo_colorbar_with_inset_locator.py @@ -1,15 +1,21 @@ """ +.. _demo-colorbar-with-inset-locator: + ============================================================== Controlling the position and size of colorbars with Inset Axes ============================================================== -This example shows how to control the position, height, and width of -colorbars using `~mpl_toolkits.axes_grid1.inset_locator.inset_axes`. +This example shows how to control the position, height, and width of colorbars +using `~mpl_toolkits.axes_grid1.inset_locator.inset_axes`. Inset axes placement is controlled as for legends: either by providing a *loc* option ("upper right", "best", ...), or by providing a locator with respect to the parent bbox. Parameters such as *bbox_to_anchor* and *borderpad* likewise work in the same way, and are also demonstrated here. + +Users should consider using `.Axes.inset_axes` instead (see +:ref:`colorbar_placement`). + """ import matplotlib.pyplot as plt diff --git a/galleries/users_explain/axes/colorbar_placement.py b/galleries/users_explain/axes/colorbar_placement.py index de767a4fa130..1e43d4940a98 100644 --- a/galleries/users_explain/axes/colorbar_placement.py +++ b/galleries/users_explain/axes/colorbar_placement.py @@ -10,7 +10,11 @@ Colorbars indicate the quantitative extent of image data. Placing in a figure is non-trivial because room needs to be made for them. -The simplest case is just attaching a colorbar to each axes: +Automatic placement of colorbars +================================ + +The simplest case is just attaching a colorbar to each axes. Note in this +example that the colorbars steal some space from the parent axes. """ import matplotlib.pyplot as plt import numpy as np @@ -28,9 +32,9 @@ fig.colorbar(pcm, ax=ax) # %% -# The first column has the same type of data in both rows, so it may -# be desirable to combine the colorbar which we do by calling -# `.Figure.colorbar` with a list of axes instead of a single axes. +# The first column has the same type of data in both rows, so it may be +# desirable to have just one colorbar. We do this by passing `.Figure.colorbar` +# a list of axes with the *ax* kwarg. fig, axs = plt.subplots(2, 2) cmaps = ['RdBu_r', 'viridis'] @@ -41,6 +45,27 @@ cmap=cmaps[col]) fig.colorbar(pcm, ax=axs[:, col], shrink=0.6) +# %% +# The stolen space can lead to axes in the same subplot layout +# being different sizes, which is often undesired if the the +# x-axis on each plot is meant to be comparable as in the following: + +fig, axs = plt.subplots(2, 1, figsize=(4, 5), sharex=True) +X = np.random.randn(20, 20) +axs[0].plot(np.sum(X, axis=0)) +axs[1].pcolormesh(X) +fig.colorbar(pcm, ax=axs[1], shrink=0.6) + +# %% +# This is usually undesired, and can be worked around in various ways, e.g. +# adding a colorbar to the other axes and then removing it. However, the most +# straightforward is to use :ref:`constrained layout `: + +fig, axs = plt.subplots(2, 1, figsize=(4, 5), sharex=True, layout='constrained') +axs[0].plot(np.sum(X, axis=0)) +axs[1].pcolormesh(X) +fig.colorbar(pcm, ax=axs[1], shrink=0.6) + # %% # Relatively complicated colorbar layouts are possible using this # paradigm. Note that this example works far better with @@ -56,8 +81,67 @@ fig.colorbar(pcm, ax=[axs[2, 1]], location='left') # %% -# Colorbars with fixed-aspect-ratio axes -# ====================================== +# Adjusting the spacing between colorbars and parent axes +# ======================================================= +# +# The distance a colorbar is from the parent axes can be adjusted with the +# *pad* keyword argument. This is in units of fraction of the parent axes +# width, and the default for a vertical axes is 0.05 (or 0.15 for a horizontal +# axes). + +fig, axs = plt.subplots(3, 1, layout='constrained', figsize=(5, 5)) +for ax, pad in zip(axs, [0.025, 0.05, 0.1]): + pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis') + fig.colorbar(pcm, ax=ax, pad=pad, label=f'pad: {pad}') +fig.suptitle("layout='constrained'") + +# %% +# Note that if you do not use constrained layout, the pad command makes the +# parent axes shrink: + +fig, axs = plt.subplots(3, 1, figsize=(5, 5)) +for ax, pad in zip(axs, [0.025, 0.05, 0.1]): + pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis') + fig.colorbar(pcm, ax=ax, pad=pad, label=f'pad: {pad}') +fig.suptitle("No layout manager") + +# %% +# Manual placement of colorbars +# ============================= +# +# Sometimes the automatic placement provided by ``colorbar`` does not +# give the desired effect. We can manually create an axes and tell +# ``colorbar`` to use that axes by passing the axes to the *cax* keyword +# argument. +# +# Using ``inset_axes`` +# -------------------- +# +# We can manually create any type of axes for the colorbar to use, but an +# `.Axes.inset_axes` is useful because it is a child of the parent axes and can +# be positioned relative to the parent. Here we add a colorbar centered near +# the bottom of the parent axes. + +fig, ax = plt.subplots(layout='constrained', figsize=(4, 4)) +pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis') +ax.set_ylim([-4, 20]) +cax = ax.inset_axes([0.3, 0.07, 0.4, 0.04]) +fig.colorbar(pcm, cax=cax, orientation='horizontal') + +# %% +# `.Axes.inset_axes` can also specify its position in data coordinates +# using the *transform* keyword argument if you want your axes at a +# certain data position on the graph: + +fig, ax = plt.subplots(layout='constrained', figsize=(4, 4)) +pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis') +ax.set_ylim([-4, 20]) +cax = ax.inset_axes([7.5, -1.7, 5, 1.2], transform=ax.transData) +fig.colorbar(pcm, cax=cax, orientation='horizontal') + +# %% +# Colorbars attached to fixed-aspect-ratio axes +# --------------------------------------------- # # Placing colorbars for axes with a fixed aspect ratio pose a particular # challenge as the parent axes changes size depending on the data view. @@ -77,9 +161,10 @@ fig.colorbar(pcm, ax=ax, shrink=0.6) # %% -# One way around this issue is to use an `.Axes.inset_axes` to locate the -# axes in axes coordinates. Note that if you zoom in on the axes, and -# change the shape of the axes, the colorbar will also change position. +# We solve this problem using `.Axes.inset_axes` to locate the axes in "axes +# coordinates" (see :ref:`transforms_tutorial`). Note that if you zoom in on +# the parent axes, and thus change the shape of it, the colorbar will also +# change position. fig, axs = plt.subplots(2, 2, layout='constrained') cmaps = ['RdBu_r', 'viridis'] @@ -94,6 +179,12 @@ ax.set_aspect(1/2) if row == 1: cax = ax.inset_axes([1.04, 0.2, 0.05, 0.6]) - fig.colorbar(pcm, ax=ax, cax=cax) + fig.colorbar(pcm, cax=cax) -plt.show() +# %% +# .. seealso:: +# +# :ref:`axes_grid` has methods for manually creating colorbar axes as well: +# +# - :ref:`demo-colorbar-with-inset-locator` +# - :ref:`demo-colorbar-with-axes-divider` diff --git a/galleries/users_explain/axes/constrainedlayout_guide.py b/galleries/users_explain/axes/constrainedlayout_guide.py index 0a2752674c6a..260a4f76bf71 100644 --- a/galleries/users_explain/axes/constrainedlayout_guide.py +++ b/galleries/users_explain/axes/constrainedlayout_guide.py @@ -4,9 +4,9 @@ .. _constrainedlayout_guide: -================================ +======================== Constrained Layout Guide -================================ +======================== Use *constrained layout* to fit plots within your figure cleanly. From 481808d73a81d272b3100a108f3ab608f024148d Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Wed, 27 Sep 2023 16:54:54 +0100 Subject: [PATCH 14/83] Backport PR #26914: DOC: add a couple more placement examples, crosslink axes_grid [ci doc] --- .../demo_colorbar_with_axes_divider.py | 6 + .../demo_colorbar_with_inset_locator.py | 10 +- .../users_explain/axes/colorbar_placement.py | 113 ++++++++++++++++-- .../axes/constrainedlayout_guide.py | 4 +- 4 files changed, 118 insertions(+), 15 deletions(-) diff --git a/galleries/examples/axes_grid1/demo_colorbar_with_axes_divider.py b/galleries/examples/axes_grid1/demo_colorbar_with_axes_divider.py index e314c2dcea21..9e4611c65bb7 100644 --- a/galleries/examples/axes_grid1/demo_colorbar_with_axes_divider.py +++ b/galleries/examples/axes_grid1/demo_colorbar_with_axes_divider.py @@ -1,4 +1,6 @@ """ +.. _demo-colorbar-with-axes-divider: + ========================= Colorbar with AxesDivider ========================= @@ -8,6 +10,10 @@ method of the `.AxesDivider` can then be used to create a new axes on a given side ("top", "right", "bottom", or "left") of the original axes. This example uses `.append_axes` to add colorbars next to axes. + +Users should consider simply passing the main axes to the *ax* keyword argument of +`~.Figure.colorbar` instead of creating a locatable axes manually like this. +See :ref:`colorbar_placement`. """ import matplotlib.pyplot as plt diff --git a/galleries/examples/axes_grid1/demo_colorbar_with_inset_locator.py b/galleries/examples/axes_grid1/demo_colorbar_with_inset_locator.py index 0c8d48e23101..8ec7d0e7271b 100644 --- a/galleries/examples/axes_grid1/demo_colorbar_with_inset_locator.py +++ b/galleries/examples/axes_grid1/demo_colorbar_with_inset_locator.py @@ -1,15 +1,21 @@ """ +.. _demo-colorbar-with-inset-locator: + ============================================================== Controlling the position and size of colorbars with Inset Axes ============================================================== -This example shows how to control the position, height, and width of -colorbars using `~mpl_toolkits.axes_grid1.inset_locator.inset_axes`. +This example shows how to control the position, height, and width of colorbars +using `~mpl_toolkits.axes_grid1.inset_locator.inset_axes`. Inset axes placement is controlled as for legends: either by providing a *loc* option ("upper right", "best", ...), or by providing a locator with respect to the parent bbox. Parameters such as *bbox_to_anchor* and *borderpad* likewise work in the same way, and are also demonstrated here. + +Users should consider using `.Axes.inset_axes` instead (see +:ref:`colorbar_placement`). + """ import matplotlib.pyplot as plt diff --git a/galleries/users_explain/axes/colorbar_placement.py b/galleries/users_explain/axes/colorbar_placement.py index de767a4fa130..1e43d4940a98 100644 --- a/galleries/users_explain/axes/colorbar_placement.py +++ b/galleries/users_explain/axes/colorbar_placement.py @@ -10,7 +10,11 @@ Colorbars indicate the quantitative extent of image data. Placing in a figure is non-trivial because room needs to be made for them. -The simplest case is just attaching a colorbar to each axes: +Automatic placement of colorbars +================================ + +The simplest case is just attaching a colorbar to each axes. Note in this +example that the colorbars steal some space from the parent axes. """ import matplotlib.pyplot as plt import numpy as np @@ -28,9 +32,9 @@ fig.colorbar(pcm, ax=ax) # %% -# The first column has the same type of data in both rows, so it may -# be desirable to combine the colorbar which we do by calling -# `.Figure.colorbar` with a list of axes instead of a single axes. +# The first column has the same type of data in both rows, so it may be +# desirable to have just one colorbar. We do this by passing `.Figure.colorbar` +# a list of axes with the *ax* kwarg. fig, axs = plt.subplots(2, 2) cmaps = ['RdBu_r', 'viridis'] @@ -41,6 +45,27 @@ cmap=cmaps[col]) fig.colorbar(pcm, ax=axs[:, col], shrink=0.6) +# %% +# The stolen space can lead to axes in the same subplot layout +# being different sizes, which is often undesired if the the +# x-axis on each plot is meant to be comparable as in the following: + +fig, axs = plt.subplots(2, 1, figsize=(4, 5), sharex=True) +X = np.random.randn(20, 20) +axs[0].plot(np.sum(X, axis=0)) +axs[1].pcolormesh(X) +fig.colorbar(pcm, ax=axs[1], shrink=0.6) + +# %% +# This is usually undesired, and can be worked around in various ways, e.g. +# adding a colorbar to the other axes and then removing it. However, the most +# straightforward is to use :ref:`constrained layout `: + +fig, axs = plt.subplots(2, 1, figsize=(4, 5), sharex=True, layout='constrained') +axs[0].plot(np.sum(X, axis=0)) +axs[1].pcolormesh(X) +fig.colorbar(pcm, ax=axs[1], shrink=0.6) + # %% # Relatively complicated colorbar layouts are possible using this # paradigm. Note that this example works far better with @@ -56,8 +81,67 @@ fig.colorbar(pcm, ax=[axs[2, 1]], location='left') # %% -# Colorbars with fixed-aspect-ratio axes -# ====================================== +# Adjusting the spacing between colorbars and parent axes +# ======================================================= +# +# The distance a colorbar is from the parent axes can be adjusted with the +# *pad* keyword argument. This is in units of fraction of the parent axes +# width, and the default for a vertical axes is 0.05 (or 0.15 for a horizontal +# axes). + +fig, axs = plt.subplots(3, 1, layout='constrained', figsize=(5, 5)) +for ax, pad in zip(axs, [0.025, 0.05, 0.1]): + pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis') + fig.colorbar(pcm, ax=ax, pad=pad, label=f'pad: {pad}') +fig.suptitle("layout='constrained'") + +# %% +# Note that if you do not use constrained layout, the pad command makes the +# parent axes shrink: + +fig, axs = plt.subplots(3, 1, figsize=(5, 5)) +for ax, pad in zip(axs, [0.025, 0.05, 0.1]): + pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis') + fig.colorbar(pcm, ax=ax, pad=pad, label=f'pad: {pad}') +fig.suptitle("No layout manager") + +# %% +# Manual placement of colorbars +# ============================= +# +# Sometimes the automatic placement provided by ``colorbar`` does not +# give the desired effect. We can manually create an axes and tell +# ``colorbar`` to use that axes by passing the axes to the *cax* keyword +# argument. +# +# Using ``inset_axes`` +# -------------------- +# +# We can manually create any type of axes for the colorbar to use, but an +# `.Axes.inset_axes` is useful because it is a child of the parent axes and can +# be positioned relative to the parent. Here we add a colorbar centered near +# the bottom of the parent axes. + +fig, ax = plt.subplots(layout='constrained', figsize=(4, 4)) +pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis') +ax.set_ylim([-4, 20]) +cax = ax.inset_axes([0.3, 0.07, 0.4, 0.04]) +fig.colorbar(pcm, cax=cax, orientation='horizontal') + +# %% +# `.Axes.inset_axes` can also specify its position in data coordinates +# using the *transform* keyword argument if you want your axes at a +# certain data position on the graph: + +fig, ax = plt.subplots(layout='constrained', figsize=(4, 4)) +pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis') +ax.set_ylim([-4, 20]) +cax = ax.inset_axes([7.5, -1.7, 5, 1.2], transform=ax.transData) +fig.colorbar(pcm, cax=cax, orientation='horizontal') + +# %% +# Colorbars attached to fixed-aspect-ratio axes +# --------------------------------------------- # # Placing colorbars for axes with a fixed aspect ratio pose a particular # challenge as the parent axes changes size depending on the data view. @@ -77,9 +161,10 @@ fig.colorbar(pcm, ax=ax, shrink=0.6) # %% -# One way around this issue is to use an `.Axes.inset_axes` to locate the -# axes in axes coordinates. Note that if you zoom in on the axes, and -# change the shape of the axes, the colorbar will also change position. +# We solve this problem using `.Axes.inset_axes` to locate the axes in "axes +# coordinates" (see :ref:`transforms_tutorial`). Note that if you zoom in on +# the parent axes, and thus change the shape of it, the colorbar will also +# change position. fig, axs = plt.subplots(2, 2, layout='constrained') cmaps = ['RdBu_r', 'viridis'] @@ -94,6 +179,12 @@ ax.set_aspect(1/2) if row == 1: cax = ax.inset_axes([1.04, 0.2, 0.05, 0.6]) - fig.colorbar(pcm, ax=ax, cax=cax) + fig.colorbar(pcm, cax=cax) -plt.show() +# %% +# .. seealso:: +# +# :ref:`axes_grid` has methods for manually creating colorbar axes as well: +# +# - :ref:`demo-colorbar-with-inset-locator` +# - :ref:`demo-colorbar-with-axes-divider` diff --git a/galleries/users_explain/axes/constrainedlayout_guide.py b/galleries/users_explain/axes/constrainedlayout_guide.py index 0a2752674c6a..260a4f76bf71 100644 --- a/galleries/users_explain/axes/constrainedlayout_guide.py +++ b/galleries/users_explain/axes/constrainedlayout_guide.py @@ -4,9 +4,9 @@ .. _constrainedlayout_guide: -================================ +======================== Constrained Layout Guide -================================ +======================== Use *constrained layout* to fit plots within your figure cleanly. From ea46347a1bc023210933f815b542cb379cd5cfd5 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 27 Sep 2023 17:21:35 -0400 Subject: [PATCH 15/83] Backport PR #26937: Add ArrayLike to scatter c arg type hint --- lib/matplotlib/axes/_axes.pyi | 2 +- lib/matplotlib/pyplot.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/axes/_axes.pyi b/lib/matplotlib/axes/_axes.pyi index 96ea087f7eb9..9602db3b950c 100644 --- a/lib/matplotlib/axes/_axes.pyi +++ b/lib/matplotlib/axes/_axes.pyi @@ -402,7 +402,7 @@ class Axes(_AxesBase): x: float | ArrayLike, y: float | ArrayLike, s: float | ArrayLike | None = ..., - c: Sequence[ColorType] | ColorType | None = ..., + c: ArrayLike | Sequence[ColorType] | ColorType | None = ..., marker: MarkerType | None = ..., cmap: str | Colormap | None = ..., norm: str | Normalize | None = ..., diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 00e5dea071a4..6fa7755e2c49 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -3670,7 +3670,7 @@ def scatter( x: float | ArrayLike, y: float | ArrayLike, s: float | ArrayLike | None = None, - c: Sequence[ColorType] | ColorType | None = None, + c: ArrayLike | Sequence[ColorType] | ColorType | None = None, marker: MarkerType | None = None, cmap: str | Colormap | None = None, norm: str | Normalize | None = None, From d49096b1c7770b0c023cde0fc52db24dae890be1 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Thu, 28 Sep 2023 09:50:08 +0200 Subject: [PATCH 16/83] Backport PR #26927: [TYP] Remove some stubtest allowlist entries --- ci/mypy-stubtest-allowlist.txt | 18 ------------------ lib/matplotlib/offsetbox.pyi | 8 ++++++-- lib/matplotlib/rcsetup.pyi | 9 ++++++--- lib/matplotlib/transforms.pyi | 20 +++++++++----------- 4 files changed, 21 insertions(+), 34 deletions(-) diff --git a/ci/mypy-stubtest-allowlist.txt b/ci/mypy-stubtest-allowlist.txt index 99216f5f75eb..8a7ffb18df7f 100644 --- a/ci/mypy-stubtest-allowlist.txt +++ b/ci/mypy-stubtest-allowlist.txt @@ -32,18 +32,6 @@ matplotlib.ticker.LogitLocator.nonsingular matplotlib.backend_bases._Mode.__new__ matplotlib.units.Number.__hash__ -# Property read-write vs read-only weirdness, fix if possible -matplotlib.offsetbox.DraggableBase.canvas -matplotlib.offsetbox.DraggableBase.cids -matplotlib.transforms.BboxTransform.is_separable -matplotlib.transforms.BboxTransformFrom.is_separable -matplotlib.transforms.BboxTransformTo.is_separable -matplotlib.transforms.BlendedAffine2D.is_separable -matplotlib.transforms.CompositeGenericTransform.is_separable -matplotlib.transforms.TransformWrapper.input_dims -matplotlib.transforms.TransformWrapper.is_separable -matplotlib.transforms.TransformWrapper.output_dims - # 3.6 Pending deprecations matplotlib.figure.Figure.set_constrained_layout matplotlib.figure.Figure.set_constrained_layout_pads @@ -150,16 +138,10 @@ matplotlib.text.Text.set_weight matplotlib.axes._base._AxesBase.get_fc matplotlib.axes._base._AxesBase.set_fc -# Other dynamic python behaviors not type hinted -matplotlib.rcsetup.defaultParams - # Maybe should be abstractmethods, required for subclasses, stubs define once matplotlib.tri.*TriInterpolator.__call__ matplotlib.tri.*TriInterpolator.gradient -# Functionally a method call, but actually a class instance, type hinted as former -matplotlib.rcsetup.validate_fillstyle - # TypeVar used only in type hints matplotlib.backend_bases.FigureCanvasBase._T matplotlib.backend_managers.ToolManager._T diff --git a/lib/matplotlib/offsetbox.pyi b/lib/matplotlib/offsetbox.pyi index 7d7f4d8f67ec..fdd6ce287f08 100644 --- a/lib/matplotlib/offsetbox.pyi +++ b/lib/matplotlib/offsetbox.pyi @@ -287,11 +287,15 @@ class AnnotationBbox(martist.Artist, mtext._AnnotationBase): class DraggableBase: ref_artist: martist.Artist got_artist: bool - canvas: FigureCanvasBase - cids: list[int] mouse_x: int mouse_y: int background: Any + + @property + def canvas(self) -> FigureCanvasBase: ... + @property + def cids(self) -> list[int]: ... + def __init__(self, ref_artist: martist.Artist, use_blit: bool = ...) -> None: ... def on_motion(self, evt: Event) -> None: ... def on_pick(self, evt: Event) -> None: ... diff --git a/lib/matplotlib/rcsetup.pyi b/lib/matplotlib/rcsetup.pyi index 8a8a9e71d666..70e94a7694a9 100644 --- a/lib/matplotlib/rcsetup.pyi +++ b/lib/matplotlib/rcsetup.pyi @@ -129,9 +129,9 @@ def validate_fontstretch( def validate_font_properties(s: Any) -> dict[str, Any]: ... def validate_whiskers(s: Any) -> list[float] | float: ... def validate_ps_distiller(s: Any) -> None | Literal["ghostscript", "xpdf"]: ... -def validate_fillstyle( - s: Any, -) -> Literal["full", "left", "right", "bottom", "top", "none"]: ... + +validate_fillstyle: ValidateInStrings + def validate_fillstylelist( s: Any, ) -> list[Literal["full", "left", "right", "bottom", "top", "none"]]: ... @@ -152,3 +152,6 @@ def validate_hist_bins( ) -> Literal["auto", "sturges", "fd", "doane", "scott", "rice", "sqrt"] | int | list[ float ]: ... + +# At runtime is added in __init__.py +defaultParams: dict[str, Any] diff --git a/lib/matplotlib/transforms.pyi b/lib/matplotlib/transforms.pyi index 68e55612b7f1..90a527e5bfc5 100644 --- a/lib/matplotlib/transforms.pyi +++ b/lib/matplotlib/transforms.pyi @@ -175,12 +175,17 @@ class LockableBbox(BboxBase): def locked_y1(self, y1: float | None) -> None: ... class Transform(TransformNode): - input_dims: int | None - output_dims: int | None - is_separable: bool - # Implemented as a standard attr in base class, but functionally readonly and some subclasses implement as such + + # Implemented as a standard attrs in base class, but functionally readonly and some subclasses implement as such + @property + def input_dims(self) -> int | None: ... + @property + def output_dims(self) -> int | None: ... + @property + def is_separable(self) -> bool: ... @property def has_inverse(self) -> bool: ... + def __add__(self, other: Transform) -> Transform: ... @property def depth(self) -> int: ... @@ -225,8 +230,6 @@ class Affine2DBase(AffineBase): input_dims: Literal[2] output_dims: Literal[2] def frozen(self) -> Affine2D: ... - @property - def is_separable(self): ... def to_values(self) -> tuple[float, float, float, float, float, float]: ... class Affine2D(Affine2DBase): @@ -255,7 +258,6 @@ class _BlendedMixin: class BlendedGenericTransform(_BlendedMixin, Transform): input_dims: Literal[2] output_dims: Literal[2] - is_separable: bool pass_through: bool def __init__( self, x_transform: Transform, y_transform: Transform, **kwargs @@ -265,8 +267,6 @@ class BlendedGenericTransform(_BlendedMixin, Transform): def contains_branch(self, other: Transform) -> Literal[False]: ... @property def is_affine(self) -> bool: ... - @property - def has_inverse(self) -> bool: ... class BlendedAffine2D(_BlendedMixin, Affine2DBase): def __init__( @@ -279,8 +279,6 @@ def blended_transform_factory( class CompositeGenericTransform(Transform): pass_through: bool - input_dims: int | None - output_dims: int | None def __init__(self, a: Transform, b: Transform, **kwargs) -> None: ... class CompositeAffine2D(Affine2DBase): From f49bbe146b63ada7bca09c3397765614ffe43240 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Thu, 28 Sep 2023 20:30:58 -0400 Subject: [PATCH 17/83] Backport PR #26955: Fix incorrect skip check in test_backend_ps. --- lib/matplotlib/backends/backend_macosx.py | 2 +- lib/matplotlib/tests/test_backend_ps.py | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/matplotlib/backends/backend_macosx.py b/lib/matplotlib/backends/backend_macosx.py index 1d92ec602d3b..ecf21b07aef4 100644 --- a/lib/matplotlib/backends/backend_macosx.py +++ b/lib/matplotlib/backends/backend_macosx.py @@ -147,7 +147,7 @@ def __init__(self, canvas, num): icon_path = str(cbook._get_data_path('images/matplotlib.pdf')) _macosx.FigureManager.set_icon(icon_path) FigureManagerBase.__init__(self, canvas, num) - self._set_window_mode(mpl.rcParams.get("macosx.window_mode", "system")) + self._set_window_mode(mpl.rcParams["macosx.window_mode"]) if self.toolbar is not None: self.toolbar.update() if mpl.is_interactive(): diff --git a/lib/matplotlib/tests/test_backend_ps.py b/lib/matplotlib/tests/test_backend_ps.py index 954d0955a760..cbf33ccc5a1b 100644 --- a/lib/matplotlib/tests/test_backend_ps.py +++ b/lib/matplotlib/tests/test_backend_ps.py @@ -40,20 +40,19 @@ 'eps with usetex' ]) def test_savefig_to_stringio(format, use_log, rcParams, orientation, papersize): - if rcParams.get("ps.usedistiller") == "ghostscript": + mpl.rcParams.update(rcParams) + if mpl.rcParams["ps.usedistiller"] == "ghostscript": try: mpl._get_executable_info("gs") except mpl.ExecutableNotFoundError as exc: pytest.skip(str(exc)) - elif rcParams.get("ps.userdistiller") == "xpdf": + elif mpl.rcParams["ps.usedistiller"] == "xpdf": try: mpl._get_executable_info("gs") # Effectively checks for ps2pdf. mpl._get_executable_info("pdftops") except mpl.ExecutableNotFoundError as exc: pytest.skip(str(exc)) - mpl.rcParams.update(rcParams) - fig, ax = plt.subplots() with io.StringIO() as s_buf, io.BytesIO() as b_buf: @@ -67,9 +66,9 @@ def test_savefig_to_stringio(format, use_log, rcParams, orientation, papersize): title += " \N{MINUS SIGN}\N{EURO SIGN}" ax.set_title(title) allowable_exceptions = [] - if rcParams.get("text.usetex"): + if mpl.rcParams["text.usetex"]: allowable_exceptions.append(RuntimeError) - if rcParams.get("ps.useafm"): + if mpl.rcParams["ps.useafm"]: allowable_exceptions.append(mpl.MatplotlibDeprecationWarning) try: fig.savefig(s_buf, format=format, orientation=orientation, @@ -87,14 +86,14 @@ def test_savefig_to_stringio(format, use_log, rcParams, orientation, papersize): if format == 'ps': # Default figsize = (8, 6) inches = (576, 432) points = (203.2, 152.4) mm. # Landscape orientation will swap dimensions. - if rcParams.get("ps.usedistiller") == "xpdf": + if mpl.rcParams["ps.usedistiller"] == "xpdf": # Some versions specifically show letter/203x152, but not all, # so we can only use this simpler test. if papersize == 'figure': assert b'letter' not in s_val.lower() else: assert b'letter' in s_val.lower() - elif rcParams.get("ps.usedistiller") or rcParams.get("text.usetex"): + elif mpl.rcParams["ps.usedistiller"] or mpl.rcParams["text.usetex"]: width = b'432.0' if orientation == 'landscape' else b'576.0' wanted = (b'-dDEVICEWIDTHPOINTS=' + width if papersize == 'figure' else b'-sPAPERSIZE') From d79d23287351b0faaa059df9c7ae2aa36cad334f Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Fri, 29 Sep 2023 21:45:31 +0200 Subject: [PATCH 18/83] Backport PR #26952: FIX 2-tuple of colors in to_rgba_array --- lib/matplotlib/colors.py | 2 +- lib/matplotlib/tests/test_colors.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 904b6ecfa04b..211286dec7da 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -435,7 +435,7 @@ def to_rgba_array(c, alpha=None): (n, 4) array of RGBA colors, where each channel (red, green, blue, alpha) can assume values between 0 and 1. """ - if isinstance(c, tuple) and len(c) == 2: + if isinstance(c, tuple) and len(c) == 2 and isinstance(c[1], Real): if alpha is None: c, alpha = c else: diff --git a/lib/matplotlib/tests/test_colors.py b/lib/matplotlib/tests/test_colors.py index 1c77f995fb53..139efbe17407 100644 --- a/lib/matplotlib/tests/test_colors.py +++ b/lib/matplotlib/tests/test_colors.py @@ -1298,6 +1298,11 @@ def test_to_rgba_array_single_str(): array = mcolors.to_rgba_array("rgb") +def test_to_rgba_array_2tuple_str(): + expected = np.array([[0, 0, 0, 1], [1, 1, 1, 1]]) + assert_array_equal(mcolors.to_rgba_array(("k", "w")), expected) + + def test_to_rgba_array_alpha_array(): with pytest.raises(ValueError, match="The number of colors must match"): mcolors.to_rgba_array(np.ones((5, 3), float), alpha=np.ones((2,))) From ed7089701c4ab589e18a3fab1e09b1153aa9eeab Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Mon, 2 Oct 2023 16:01:09 -0500 Subject: [PATCH 19/83] Backport PR #26959: Move papersize="auto" deprecation to backend_bases. --- lib/matplotlib/backend_bases.py | 6 ++++++ lib/matplotlib/backends/backend_ps.py | 6 ------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 9c7fa97d23b6..958b6e0e1c21 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -2123,6 +2123,12 @@ def print_figure( if dpi == 'figure': dpi = getattr(self.figure, '_original_dpi', self.figure.dpi) + if kwargs.get("papertype") == 'auto': + # When deprecation elapses, remove backend_ps._get_papertype & its callers. + _api.warn_deprecated( + "3.8", name="papertype='auto'", addendum="Pass an explicit paper type, " + "'figure', or omit the *papertype* argument entirely.") + # Remove the figure manager, if any, to avoid resizing the GUI widget. with cbook._setattr_cm(self, manager=None), \ self._switch_canvas_and_return_print_method(format, backend) \ diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index a757bcf8d3be..2f9faa0ef6da 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -872,9 +872,6 @@ def _print_figure( # find the appropriate papertype width, height = self.figure.get_size_inches() if papertype == 'auto': - _api.warn_deprecated("3.8", name="papertype='auto'", - addendum="Pass an explicit paper type, 'figure', or " - "omit the *papertype* argument entirely.") papertype = _get_papertype(*orientation.swap_if_landscape((width, height))) if is_eps or papertype == 'figure': @@ -1058,9 +1055,6 @@ def _print_figure_tex( self.figure.get_size_inches()) else: if papertype == 'auto': - _api.warn_deprecated("3.8", name="papertype='auto'", - addendum="Pass an explicit paper type, or " - "omit the *papertype* argument entirely.") papertype = _get_papertype(width, height) paper_width, paper_height = papersize[papertype] From 072cc574a89c29034a8f5956aecb0eecb719b1fb Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Tue, 3 Oct 2023 15:10:01 +0200 Subject: [PATCH 20/83] Backport PR #26976: Bump pypa/cibuildwheel from 2.16.0 to 2.16.1 --- .github/workflows/cibuildwheel.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/cibuildwheel.yml b/.github/workflows/cibuildwheel.yml index 00e5371bdc6c..83eac197d4ba 100644 --- a/.github/workflows/cibuildwheel.yml +++ b/.github/workflows/cibuildwheel.yml @@ -136,7 +136,7 @@ jobs: path: dist/ - name: Build wheels for CPython 3.12 - uses: pypa/cibuildwheel@a873dd9cbf9e3c4c73a1fd11ac31cf835f6eb502 # v2.16.0 + uses: pypa/cibuildwheel@7da7df1efc530f07d1945c00934b8cfd34be0d50 # v2.16.1 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -158,7 +158,7 @@ jobs: pip install --pre "numpy>=1.25" - name: Build wheels for CPython 3.11 - uses: pypa/cibuildwheel@a873dd9cbf9e3c4c73a1fd11ac31cf835f6eb502 # v2.16.0 + uses: pypa/cibuildwheel@7da7df1efc530f07d1945c00934b8cfd34be0d50 # v2.16.1 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -166,7 +166,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.10 - uses: pypa/cibuildwheel@a873dd9cbf9e3c4c73a1fd11ac31cf835f6eb502 # v2.16.0 + uses: pypa/cibuildwheel@7da7df1efc530f07d1945c00934b8cfd34be0d50 # v2.16.1 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -174,7 +174,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.9 - uses: pypa/cibuildwheel@a873dd9cbf9e3c4c73a1fd11ac31cf835f6eb502 # v2.16.0 + uses: pypa/cibuildwheel@7da7df1efc530f07d1945c00934b8cfd34be0d50 # v2.16.1 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -182,7 +182,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for PyPy - uses: pypa/cibuildwheel@a873dd9cbf9e3c4c73a1fd11ac31cf835f6eb502 # v2.16.0 + uses: pypa/cibuildwheel@7da7df1efc530f07d1945c00934b8cfd34be0d50 # v2.16.1 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: From 2c33c0a9b7e8e84ab8cb626e7a9bd5920a5b286a Mon Sep 17 00:00:00 2001 From: hannah Date: Tue, 3 Oct 2023 17:38:17 -0400 Subject: [PATCH 21/83] Backport PR #26985: Reformatted documentation under toolkits and tutorials directory --- galleries/tutorials/index.rst | 12 ++++++------ galleries/users_explain/toolkits/axes_grid.rst | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/galleries/tutorials/index.rst b/galleries/tutorials/index.rst index e51c35a214cd..ace37dcb6f57 100644 --- a/galleries/tutorials/index.rst +++ b/galleries/tutorials/index.rst @@ -118,14 +118,14 @@ User guide tutorials Many of our tutorials were moved from this section to :ref:`users-guide-index`: Introductory -~~~~~~~~~~~~ +^^^^^^^^^^^^ - :ref:`quick_start` - :ref:`customizing` - :ref:`animations` Intermediate -~~~~~~~~~~~~ +^^^^^^^^^^^^ - :ref:`legend_guide` - :ref:`color_cycle` @@ -136,7 +136,7 @@ Intermediate - :ref:`imshow_extent` Advanced -~~~~~~~~ +^^^^^^^^ - :ref:`blitting` - :ref:`paths` @@ -144,16 +144,16 @@ Advanced - :ref:`transforms_tutorial` Colors -~~~~~~ +^^^^^^ See :ref:`tutorials-colors`. Text -~~~~ +^^^^ See :ref:`tutorials-text`. Toolkits -~~~~~~~~ +^^^^^^^^ See :ref:`tutorials-toolkits`. diff --git a/galleries/users_explain/toolkits/axes_grid.rst b/galleries/users_explain/toolkits/axes_grid.rst index a9c39bd55b10..ba37c4cf7d78 100644 --- a/galleries/users_explain/toolkits/axes_grid.rst +++ b/galleries/users_explain/toolkits/axes_grid.rst @@ -86,7 +86,7 @@ colorbar whose height (or width) is in sync with the main axes :align: center scatter_hist.py with AxesDivider -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The :doc:`/gallery/lines_bars_and_markers/scatter_hist` example can be rewritten using `~.axes_grid1.axes_divider.make_axes_locatable`:: @@ -141,14 +141,14 @@ parasite axes. To create a host axes, you may use ``host_subplot`` or ``host_axes`` command. Example 1: twinx -~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^ .. figure:: /gallery/axes_grid1/images/sphx_glr_parasite_simple_001.png :target: /gallery/axes_grid1/parasite_simple.html :align: center Example 2: twin -~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^ ``twin`` without a transform argument assumes that the parasite axes has the same data transform as the host. This can be useful when you want the From a94ead622a1092162682e2acd501d38bb8b2bdd3 Mon Sep 17 00:00:00 2001 From: hannah Date: Tue, 3 Oct 2023 17:38:17 -0400 Subject: [PATCH 22/83] Backport PR #26985: Reformatted documentation under toolkits and tutorials directory --- galleries/tutorials/index.rst | 12 ++++++------ galleries/users_explain/toolkits/axes_grid.rst | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/galleries/tutorials/index.rst b/galleries/tutorials/index.rst index e51c35a214cd..ace37dcb6f57 100644 --- a/galleries/tutorials/index.rst +++ b/galleries/tutorials/index.rst @@ -118,14 +118,14 @@ User guide tutorials Many of our tutorials were moved from this section to :ref:`users-guide-index`: Introductory -~~~~~~~~~~~~ +^^^^^^^^^^^^ - :ref:`quick_start` - :ref:`customizing` - :ref:`animations` Intermediate -~~~~~~~~~~~~ +^^^^^^^^^^^^ - :ref:`legend_guide` - :ref:`color_cycle` @@ -136,7 +136,7 @@ Intermediate - :ref:`imshow_extent` Advanced -~~~~~~~~ +^^^^^^^^ - :ref:`blitting` - :ref:`paths` @@ -144,16 +144,16 @@ Advanced - :ref:`transforms_tutorial` Colors -~~~~~~ +^^^^^^ See :ref:`tutorials-colors`. Text -~~~~ +^^^^ See :ref:`tutorials-text`. Toolkits -~~~~~~~~ +^^^^^^^^ See :ref:`tutorials-toolkits`. diff --git a/galleries/users_explain/toolkits/axes_grid.rst b/galleries/users_explain/toolkits/axes_grid.rst index a9c39bd55b10..ba37c4cf7d78 100644 --- a/galleries/users_explain/toolkits/axes_grid.rst +++ b/galleries/users_explain/toolkits/axes_grid.rst @@ -86,7 +86,7 @@ colorbar whose height (or width) is in sync with the main axes :align: center scatter_hist.py with AxesDivider -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The :doc:`/gallery/lines_bars_and_markers/scatter_hist` example can be rewritten using `~.axes_grid1.axes_divider.make_axes_locatable`:: @@ -141,14 +141,14 @@ parasite axes. To create a host axes, you may use ``host_subplot`` or ``host_axes`` command. Example 1: twinx -~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^ .. figure:: /gallery/axes_grid1/images/sphx_glr_parasite_simple_001.png :target: /gallery/axes_grid1/parasite_simple.html :align: center Example 2: twin -~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^ ``twin`` without a transform argument assumes that the parasite axes has the same data transform as the host. This can be useful when you want the From 3e1afb016d07c7b58c6ef718b3c256d1b252f5bf Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Wed, 4 Oct 2023 10:31:29 -0500 Subject: [PATCH 23/83] Backport PR #26850: DOC: Fix missing-reference generation on Windows --- doc/missing-references.json | 743 +++++++++++++--------------- doc/sphinxext/missing_references.py | 14 +- 2 files changed, 344 insertions(+), 413 deletions(-) diff --git a/doc/missing-references.json b/doc/missing-references.json index 72de214df985..1b0a6f9ef226 100644 --- a/doc/missing-references.json +++ b/doc/missing-references.json @@ -1,731 +1,660 @@ { "py:attr": { "cbar_axes": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axes_grid1\\axes_grid.py:docstring of mpl_toolkits.axes_grid1.axes_grid.ImageGrid:72", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axisartist\\axes_grid.py:docstring of mpl_toolkits.axisartist.axes_grid.ImageGrid:72" + "lib/mpl_toolkits/axes_grid1/axes_grid.py:docstring of mpl_toolkits.axes_grid1.axes_grid.ImageGrid:72", + "lib/mpl_toolkits/axisartist/axes_grid.py:docstring of mpl_toolkits.axisartist.axes_grid.ImageGrid:72" ], "eventson": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\widgets.py:docstring of matplotlib.widgets.CheckButtons.set_active:4", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\widgets.py:docstring of matplotlib.widgets.RadioButtons.set_active:4" + "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.CheckButtons.set_active:4", + "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.RadioButtons.set_active:4" ], "fmt_zdata": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\mplot3d\\axes3d.py:docstring of mpl_toolkits.mplot3d.axes3d.Axes3D.format_zdata:2" + "lib/mpl_toolkits/mplot3d/axes3d.py:docstring of mpl_toolkits.mplot3d.axes3d.Axes3D.format_zdata:2" ], "height": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.Bbox.bounds:2" + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.Bbox.bounds:2" ], "input_dims": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.AitoffAxes.AitoffTransform.transform_non_affine:14", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.AitoffAxes.InvertedAitoffTransform.transform_non_affine:14", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.HammerAxes.HammerTransform.transform_non_affine:14", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.HammerAxes.InvertedHammerTransform.transform_non_affine:14", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.LambertAxes.InvertedLambertTransform.transform_non_affine:14", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.LambertAxes.LambertTransform.transform_non_affine:14", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.MollweideAxes.InvertedMollweideTransform.transform_non_affine:14", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.MollweideAxes.MollweideTransform.transform_non_affine:14", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.AffineBase.transform:8", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.AffineBase.transform_affine:15", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.AffineBase.transform_non_affine:14", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.CompositeGenericTransform.transform_affine:15", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.CompositeGenericTransform.transform_non_affine:14", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.IdentityTransform.transform:8", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.IdentityTransform.transform_affine:15", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.IdentityTransform.transform_non_affine:14" + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.AitoffAxes.AitoffTransform.transform_non_affine:14", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.AitoffAxes.InvertedAitoffTransform.transform_non_affine:14", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.HammerAxes.HammerTransform.transform_non_affine:14", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.HammerAxes.InvertedHammerTransform.transform_non_affine:14", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.LambertAxes.InvertedLambertTransform.transform_non_affine:14", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.LambertAxes.LambertTransform.transform_non_affine:14", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.MollweideAxes.InvertedMollweideTransform.transform_non_affine:14", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.MollweideAxes.MollweideTransform.transform_non_affine:14", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.AffineBase.transform:8", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.AffineBase.transform_affine:15", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.AffineBase.transform_non_affine:14", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.CompositeGenericTransform.transform_affine:15", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.CompositeGenericTransform.transform_non_affine:14", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.IdentityTransform.transform:8", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.IdentityTransform.transform_affine:15", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.IdentityTransform.transform_non_affine:14" ], "lines": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\colorbar.py:docstring of matplotlib.colorbar.Colorbar.add_lines:4" + "lib/matplotlib/colorbar.py:docstring of matplotlib.colorbar.Colorbar.add_lines:4" ], "matplotlib.axes.Axes.patch": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\tutorials/artists.rst:188", - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\tutorials/artists.rst:427" + "doc/tutorials/artists.rst:188", + "doc/tutorials/artists.rst:427" ], "matplotlib.axes.Axes.patches": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\tutorials/artists.rst:465" + "doc/tutorials/artists.rst:465" ], "matplotlib.axes.Axes.transAxes": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axes_grid1\\anchored_artists.py:docstring of mpl_toolkits.axes_grid1.anchored_artists.AnchoredDirectionArrows:8" + "lib/mpl_toolkits/axes_grid1/anchored_artists.py:docstring of mpl_toolkits.axes_grid1.anchored_artists.AnchoredDirectionArrows:8" ], "matplotlib.axes.Axes.transData": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axes_grid1\\anchored_artists.py:docstring of mpl_toolkits.axes_grid1.anchored_artists.AnchoredAuxTransformBox:11", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axes_grid1\\anchored_artists.py:docstring of mpl_toolkits.axes_grid1.anchored_artists.AnchoredEllipse:33", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axes_grid1\\anchored_artists.py:docstring of mpl_toolkits.axes_grid1.anchored_artists.AnchoredSizeBar:8" + "lib/mpl_toolkits/axes_grid1/anchored_artists.py:docstring of mpl_toolkits.axes_grid1.anchored_artists.AnchoredAuxTransformBox:11", + "lib/mpl_toolkits/axes_grid1/anchored_artists.py:docstring of mpl_toolkits.axes_grid1.anchored_artists.AnchoredEllipse:33", + "lib/mpl_toolkits/axes_grid1/anchored_artists.py:docstring of mpl_toolkits.axes_grid1.anchored_artists.AnchoredSizeBar:8" ], "matplotlib.axes.Axes.xaxis": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\tutorials/artists.rst:611", - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\users/explain/axes/axes_intro.rst:133" + "doc/tutorials/artists.rst:611", + "doc/users/explain/axes/axes_intro.rst:133" ], "matplotlib.axes.Axes.yaxis": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\tutorials/artists.rst:611", - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\users/explain/axes/axes_intro.rst:133" + "doc/tutorials/artists.rst:611", + "doc/users/explain/axes/axes_intro.rst:133" ], "matplotlib.axis.Axis.label": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\tutorials/artists.rst:658" + "doc/tutorials/artists.rst:658" ], "matplotlib.colors.Colormap.name": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\cm.py:docstring of matplotlib.cm.register_cmap:14" + "lib/matplotlib/cm.py:docstring of matplotlib.cm.register_cmap:14" ], "matplotlib.figure.Figure.patch": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\tutorials/artists.rst:188", - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\tutorials/artists.rst:321" + "doc/tutorials/artists.rst:188", + "doc/tutorials/artists.rst:321" ], "matplotlib.figure.Figure.transFigure": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\tutorials/artists.rst:370" + "doc/tutorials/artists.rst:370" ], "max": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.Bbox.p1:4" + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.Bbox.p1:4" ], "min": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.Bbox.p0:4" + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.Bbox.p0:4" ], "mpl_toolkits.mplot3d.axis3d._axinfo": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/toolkits/mplot3d.rst:66" + "doc/api/toolkits/mplot3d.rst:66" ], "name": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\scale.py:docstring of matplotlib.scale.ScaleBase:8" + "lib/matplotlib/scale.py:docstring of matplotlib.scale.ScaleBase:8" ], "output_dims": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.AitoffAxes.AitoffTransform.transform_non_affine:20", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.AitoffAxes.InvertedAitoffTransform.transform_non_affine:20", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.HammerAxes.HammerTransform.transform_non_affine:20", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.HammerAxes.InvertedHammerTransform.transform_non_affine:20", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.LambertAxes.InvertedLambertTransform.transform_non_affine:20", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.LambertAxes.LambertTransform.transform_non_affine:20", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.MollweideAxes.InvertedMollweideTransform.transform_non_affine:20", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.MollweideAxes.MollweideTransform.transform_non_affine:20", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.AffineBase.transform:14", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.AffineBase.transform_affine:21", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.AffineBase.transform_non_affine:20", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.CompositeGenericTransform.transform_affine:21", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.CompositeGenericTransform.transform_non_affine:20", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.IdentityTransform.transform:14", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.IdentityTransform.transform_affine:21", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.IdentityTransform.transform_non_affine:20" + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.AitoffAxes.AitoffTransform.transform_non_affine:20", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.AitoffAxes.InvertedAitoffTransform.transform_non_affine:20", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.HammerAxes.HammerTransform.transform_non_affine:20", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.HammerAxes.InvertedHammerTransform.transform_non_affine:20", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.LambertAxes.InvertedLambertTransform.transform_non_affine:20", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.LambertAxes.LambertTransform.transform_non_affine:20", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.MollweideAxes.InvertedMollweideTransform.transform_non_affine:20", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.MollweideAxes.MollweideTransform.transform_non_affine:20", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.AffineBase.transform:14", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.AffineBase.transform_affine:21", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.AffineBase.transform_non_affine:20", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.CompositeGenericTransform.transform_affine:21", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.CompositeGenericTransform.transform_non_affine:20", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.IdentityTransform.transform:14", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.IdentityTransform.transform_affine:21", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.IdentityTransform.transform_non_affine:20" ], "triangulation": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\tri\\_trirefine.py:docstring of matplotlib.tri._trirefine.UniformTriRefiner.refine_triangulation:2" + "lib/matplotlib/tri/_trirefine.py:docstring of matplotlib.tri._trirefine.UniformTriRefiner.refine_triangulation:2" ], "use_sticky_edges": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.margins:53" + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.margins:53" ], "width": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.Bbox.bounds:2" + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.Bbox.bounds:2" ], "xmax": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.Bbox.x1:4" + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.Bbox.x1:4" ], "xmin": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.Bbox.x0:4" + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.Bbox.x0:4" ], "ymax": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.Bbox.y1:4" + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.Bbox.y1:4" ], "ymin": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.Bbox.y0:4" + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.Bbox.y0:4" ] }, "py:class": { - "ArrayLike": [ - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.acorr:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.angle_spectrum:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.bar:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.bar_label:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.barh:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.boxplot:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.clabel:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.csd:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.ecdf:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.errorbar:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.eventplot:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.figimage:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.fill_between:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.fill_betweenx:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.hist2d:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.hist:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.hlines:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.imsave:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.imshow:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.magnitude_spectrum:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.matshow:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.pcolor:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.pcolormesh:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.phase_spectrum:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.pie:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.plot:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.plot_date:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.psd:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.rgrids:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.scatter:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.specgram:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.spy:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.stairs:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.stem:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.step:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.subplot_mosaic:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.thetagrids:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.violinplot:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.vlines:1" - ], - "ColorType": [ - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.errorbar:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.eventplot:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.hist:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.hlines:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.pie:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.scatter:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.vlines:1" - ], - "HashableList": [ - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.subplot_mosaic:1" - ], "HashableList[_HT]": [ "doc/docstring of builtins.list:17" ], - "LineStyleType": [ - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.eventplot:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.hlines:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.vlines:1" - ], - "MarkerType": [ - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.scatter:1" - ], - "_AxesBase": [ - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.twinx:1", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.twiny:1" - ], "matplotlib.axes._base._AxesBase": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/artist_api.rst:202" + "doc/api/artist_api.rst:202" ], "matplotlib.backend_bases.FigureCanvas": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\tutorials/artists.rst:36", - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\tutorials/artists.rst:38", - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\tutorials/artists.rst:43" + "doc/tutorials/artists.rst:36", + "doc/tutorials/artists.rst:38", + "doc/tutorials/artists.rst:43" ], "matplotlib.backend_bases.Renderer": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\tutorials/artists.rst:38", - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\tutorials/artists.rst:43" + "doc/tutorials/artists.rst:38", + "doc/tutorials/artists.rst:43" ], "matplotlib.backend_bases._Backend": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backend_bases.py:docstring of matplotlib.backend_bases.ShowBase:1" + "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.ShowBase:1" ], "matplotlib.backends._backend_pdf_ps.RendererPDFPSBase": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_pdf.py:docstring of matplotlib.backends.backend_pdf.RendererPdf:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_ps.py:docstring of matplotlib.backends.backend_ps.RendererPS:1" + "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.RendererPdf:1", + "lib/matplotlib/backends/backend_ps.py:docstring of matplotlib.backends.backend_ps.RendererPS:1" ], "matplotlib.backends._backend_tk.FigureCanvasTk": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_tkagg.py:docstring of matplotlib.backends.backend_tkagg.FigureCanvasTkAgg:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_tkcairo.py:docstring of matplotlib.backends.backend_tkcairo.FigureCanvasTkCairo:1" + "lib/matplotlib/backends/backend_tkagg.py:docstring of matplotlib.backends.backend_tkagg.FigureCanvasTkAgg:1", + "lib/matplotlib/backends/backend_tkcairo.py:docstring of matplotlib.backends.backend_tkcairo.FigureCanvasTkCairo:1" ], "matplotlib.collections._CollectionWithSizes": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/artist_api.rst:202", - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/collections_api.rst:13", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.collections.CircleCollection:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.collections.PathCollection:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.collections.PolyCollection:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.collections.RegularPolyCollection:1" + "doc/api/artist_api.rst:202", + "doc/api/collections_api.rst:13", + "lib/matplotlib/collections.py:docstring of matplotlib.collections.CircleCollection:1", + "lib/matplotlib/collections.py:docstring of matplotlib.collections.PathCollection:1", + "lib/matplotlib/collections.py:docstring of matplotlib.collections.PolyCollection:1", + "lib/matplotlib/collections.py:docstring of matplotlib.collections.RegularPolyCollection:1" ], "matplotlib.collections._MeshData": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/artist_api.rst:202", - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/collections_api.rst:13", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.collections.PolyQuadMesh:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.collections.QuadMesh:1" + "doc/api/artist_api.rst:202", + "doc/api/collections_api.rst:13", + "lib/matplotlib/collections.py:docstring of matplotlib.collections.PolyQuadMesh:1", + "lib/matplotlib/collections.py:docstring of matplotlib.collections.QuadMesh:1" ], "matplotlib.image._ImageBase": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/artist_api.rst:202", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\image.py:docstring of matplotlib.image.AxesImage:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\image.py:docstring of matplotlib.image.BboxImage:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\image.py:docstring of matplotlib.image.FigureImage:1" + "doc/api/artist_api.rst:202", + "lib/matplotlib/image.py:docstring of matplotlib.image.AxesImage:1", + "lib/matplotlib/image.py:docstring of matplotlib.image.BboxImage:1", + "lib/matplotlib/image.py:docstring of matplotlib.image.FigureImage:1" ], "matplotlib.patches.ArrowStyle._Base": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.Fancy:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.Simple:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.Wedge:1" + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.Fancy:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.Simple:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.Wedge:1" ], "matplotlib.patches.ArrowStyle._Curve": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.BarAB:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.BracketA:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.BracketAB:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.BracketB:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.BracketCurve:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.Curve:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.CurveA:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.CurveAB:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.CurveB:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.CurveBracket:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.CurveFilledA:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.CurveFilledAB:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle.CurveFilledB:1" + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.BarAB:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.BracketA:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.BracketAB:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.BracketB:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.BracketCurve:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.Curve:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.CurveA:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.CurveAB:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.CurveB:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.CurveBracket:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.CurveFilledA:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.CurveFilledAB:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.CurveFilledB:1" ], "matplotlib.patches.ConnectionStyle._Base": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ConnectionStyle.Angle3:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ConnectionStyle.Angle:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ConnectionStyle.Arc3:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ConnectionStyle.Arc:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ConnectionStyle.Bar:1" + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ConnectionStyle.Angle3:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ConnectionStyle.Angle:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ConnectionStyle.Arc3:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ConnectionStyle.Arc:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ConnectionStyle.Bar:1" ], "matplotlib.patches._Style": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ArrowStyle:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.BoxStyle:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patches.py:docstring of matplotlib.patches.ConnectionStyle:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axisartist\\axisline_style.py:docstring of mpl_toolkits.axisartist.axisline_style.AxislineStyle:1" + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ConnectionStyle:1", + "lib/mpl_toolkits/axisartist/axisline_style.py:docstring of mpl_toolkits.axisartist.axisline_style.AxislineStyle:1" ], "matplotlib.projections.geo._GeoTransform": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.AitoffAxes.AitoffTransform:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.AitoffAxes.InvertedAitoffTransform:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.HammerAxes.HammerTransform:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.HammerAxes.InvertedHammerTransform:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.LambertAxes.InvertedLambertTransform:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.LambertAxes.LambertTransform:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.MollweideAxes.InvertedMollweideTransform:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\projections\\geo.py:docstring of matplotlib.projections.geo.MollweideAxes.MollweideTransform:1" + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.AitoffAxes.AitoffTransform:1", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.AitoffAxes.InvertedAitoffTransform:1", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.HammerAxes.HammerTransform:1", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.HammerAxes.InvertedHammerTransform:1", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.LambertAxes.InvertedLambertTransform:1", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.LambertAxes.LambertTransform:1", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.MollweideAxes.InvertedMollweideTransform:1", + "lib/matplotlib/projections/geo.py:docstring of matplotlib.projections.geo.MollweideAxes.MollweideTransform:1" ], "matplotlib.text._AnnotationBase": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/artist_api.rst:202", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\offsetbox.py:docstring of matplotlib.offsetbox.AnnotationBbox:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\text.py:docstring of matplotlib.text.Annotation:1" + "doc/api/artist_api.rst:202", + "lib/matplotlib/offsetbox.py:docstring of matplotlib.offsetbox.AnnotationBbox:1", + "lib/matplotlib/text.py:docstring of matplotlib.text.Annotation:1" ], "matplotlib.transforms._BlendedMixin": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.BlendedAffine2D:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\transforms.py:docstring of matplotlib.transforms.BlendedGenericTransform:1" + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.BlendedAffine2D:1", + "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.BlendedGenericTransform:1" ], "matplotlib.widgets._SelectorWidget": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\widgets.py:docstring of matplotlib.widgets.LassoSelector:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\widgets.py:docstring of matplotlib.widgets.PolygonSelector:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\widgets.py:docstring of matplotlib.widgets.RectangleSelector:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\widgets.py:docstring of matplotlib.widgets.SpanSelector:1" + "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.LassoSelector:1", + "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.PolygonSelector:1", + "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.RectangleSelector:1", + "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.SpanSelector:1" ], "mpl_toolkits.axes_grid1.axes_size._Base": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axes_grid1\\axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size.Add:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axes_grid1\\axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size.AxesX:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axes_grid1\\axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size.AxesY:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axes_grid1\\axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size.Fixed:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axes_grid1\\axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size.Fraction:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axes_grid1\\axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size.MaxExtent:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axes_grid1\\axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size.Scaled:1" + "lib/mpl_toolkits/axes_grid1/axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size.Add:1", + "lib/mpl_toolkits/axes_grid1/axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size.AxesX:1", + "lib/mpl_toolkits/axes_grid1/axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size.AxesY:1", + "lib/mpl_toolkits/axes_grid1/axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size.Fixed:1", + "lib/mpl_toolkits/axes_grid1/axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size.Fraction:1", + "lib/mpl_toolkits/axes_grid1/axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size.MaxExtent:1", + "lib/mpl_toolkits/axes_grid1/axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size.Scaled:1" ], "mpl_toolkits.axes_grid1.parasite_axes.AxesHostAxes": [ - ":1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/mpl_toolkits.axes_grid1.parasite_axes.rst:30::1" + "doc/api/_as_gen/mpl_toolkits.axes_grid1.parasite_axes.rst:32::1" ], "mpl_toolkits.axes_grid1.parasite_axes.AxesParasite": [ - ":1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/mpl_toolkits.axes_grid1.parasite_axes.rst:30::1" + "doc/api/_as_gen/mpl_toolkits.axes_grid1.parasite_axes.rst:32::1" ], "mpl_toolkits.axisartist.Axes": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/toolkits/axisartist.rst:6" + "doc/api/toolkits/axisartist.rst:6" ], "mpl_toolkits.axisartist.axisline_style.AxislineStyle._Base": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axisartist\\axisline_style.py:docstring of mpl_toolkits.axisartist.axisline_style.AxislineStyle.SimpleArrow:1" + "lib/mpl_toolkits/axisartist/axisline_style.py:docstring of mpl_toolkits.axisartist.axisline_style.AxislineStyle:1" ], "mpl_toolkits.axisartist.axisline_style._FancyAxislineStyle.FilledArrow": [ - ":1" + "lib/mpl_toolkits/axisartist/axisline_style.py:docstring of mpl_toolkits.axisartist.axisline_style.AxislineStyle:1" ], "mpl_toolkits.axisartist.axisline_style._FancyAxislineStyle.SimpleArrow": [ - ":1" + "lib/mpl_toolkits/axisartist/axisline_style.py:docstring of mpl_toolkits.axisartist.axisline_style.AxislineStyle:1" ], "mpl_toolkits.axisartist.axislines._FixedAxisArtistHelperBase": [ - ":1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axisartist\\axislines.py:docstring of mpl_toolkits.axisartist.axislines.FixedAxisArtistHelperRectilinear:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axisartist\\grid_helper_curvelinear.py:docstring of mpl_toolkits.axisartist.grid_helper_curvelinear.FixedAxisArtistHelper:1" + "lib/mpl_toolkits/axisartist/axislines.py:docstring of mpl_toolkits.axisartist.axislines.FixedAxisArtistHelperRectilinear:1", + "lib/mpl_toolkits/axisartist/grid_helper_curvelinear.py:docstring of mpl_toolkits.axisartist.grid_helper_curvelinear.FixedAxisArtistHelper:1" ], "mpl_toolkits.axisartist.axislines._FloatingAxisArtistHelperBase": [ - ":1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axisartist\\axislines.py:docstring of mpl_toolkits.axisartist.axislines.FloatingAxisArtistHelperRectilinear:1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axisartist\\grid_helper_curvelinear.py:docstring of mpl_toolkits.axisartist.grid_helper_curvelinear.FloatingAxisArtistHelper:1" + "lib/mpl_toolkits/axisartist/axislines.py:docstring of mpl_toolkits.axisartist.axislines.FloatingAxisArtistHelperRectilinear:1", + "lib/mpl_toolkits/axisartist/grid_helper_curvelinear.py:docstring of mpl_toolkits.axisartist.grid_helper_curvelinear.FloatingAxisArtistHelper:1" ], "mpl_toolkits.axisartist.floating_axes.FloatingAxesHostAxes": [ - ":1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/mpl_toolkits.axisartist.floating_axes.rst:32::1" + "doc/api/_as_gen/mpl_toolkits.axisartist.floating_axes.rst:34::1" ], "numpy.uint8": [ - ":1" + "lib/matplotlib/path.py:docstring of matplotlib.path:1" ] }, "py:data": { "matplotlib.axes.Axes.transAxes": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.legend:248", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\figure.py:docstring of matplotlib.figure.FigureBase.legend:249", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\legend.py:docstring of matplotlib.legend.Legend:201", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.figlegend:249", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.legend:248" + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.legend:248", + "lib/matplotlib/figure.py:docstring of matplotlib.figure.FigureBase.legend:249", + "lib/matplotlib/legend.py:docstring of matplotlib.legend.Legend:201", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.figlegend:249", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.legend:248" ] }, "py:meth": { "AbstractPathEffect._update_gc": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patheffects.py:docstring of matplotlib.patheffects.SimpleLineShadow:44", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patheffects.py:docstring of matplotlib.patheffects.SimplePatchShadow:42", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patheffects.py:docstring of matplotlib.patheffects.TickedStroke:57", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patheffects.py:docstring of matplotlib.patheffects.withSimplePatchShadow:51", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patheffects.py:docstring of matplotlib.patheffects.withTickedStroke:56" + "lib/matplotlib/patheffects.py:docstring of matplotlib.patheffects.SimpleLineShadow:44", + "lib/matplotlib/patheffects.py:docstring of matplotlib.patheffects.SimplePatchShadow:42", + "lib/matplotlib/patheffects.py:docstring of matplotlib.patheffects.TickedStroke:57", + "lib/matplotlib/patheffects.py:docstring of matplotlib.patheffects.withSimplePatchShadow:51", + "lib/matplotlib/patheffects.py:docstring of matplotlib.patheffects.withTickedStroke:56" ], "IPython.terminal.interactiveshell.TerminalInteractiveShell.inputhook": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\users/explain/figure/interactive_guide.rst:420" + "doc/users/explain/figure/interactive_guide.rst:420" ], "_find_tails": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\quiver.py:docstring of matplotlib.quiver.Barbs:9" + "lib/matplotlib/quiver.py:docstring of matplotlib.quiver.Barbs:9" ], "_make_barbs": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\quiver.py:docstring of matplotlib.quiver.Barbs:9" + "lib/matplotlib/quiver.py:docstring of matplotlib.quiver.Barbs:9" ], "matplotlib.collections._CollectionWithSizes.set_sizes": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.barbs:176", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.broken_barh:82", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.fill_between:118", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.fill_betweenx:118", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.hexbin:206", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.pcolor:178", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.quiver:212", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.artist.AsteriskPolygonCollection.set:44", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.artist.BrokenBarHCollection.set:44", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.artist.CircleCollection.set:44", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.artist.PathCollection.set:44", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.artist.PolyCollection.set:44", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.artist.PolyQuadMesh.set:44", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.artist.RegularPolyCollection.set:44", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.artist.StarPolygonCollection.set:44", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.barbs:176", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.broken_barh:82", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.fill_between:118", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.fill_betweenx:118", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.hexbin:206", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.pcolor:178", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.quiver:212", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\quiver.py:docstring of matplotlib.artist.Barbs.set:45", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\quiver.py:docstring of matplotlib.artist.Quiver.set:45", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\quiver.py:docstring of matplotlib.quiver.Barbs:209", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\quiver.py:docstring of matplotlib.quiver.Quiver:248", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\mplot3d\\art3d.py:docstring of matplotlib.artist.Path3DCollection.set:46", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\mplot3d\\art3d.py:docstring of matplotlib.artist.Poly3DCollection.set:44" + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.barbs:176", + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.broken_barh:82", + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.fill_between:118", + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.fill_betweenx:118", + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.hexbin:206", + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.pcolor:178", + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.quiver:212", + "lib/matplotlib/collections.py:docstring of matplotlib.artist.AsteriskPolygonCollection.set:44", + "lib/matplotlib/collections.py:docstring of matplotlib.artist.BrokenBarHCollection.set:44", + "lib/matplotlib/collections.py:docstring of matplotlib.artist.CircleCollection.set:44", + "lib/matplotlib/collections.py:docstring of matplotlib.artist.PathCollection.set:44", + "lib/matplotlib/collections.py:docstring of matplotlib.artist.PolyCollection.set:44", + "lib/matplotlib/collections.py:docstring of matplotlib.artist.PolyQuadMesh.set:44", + "lib/matplotlib/collections.py:docstring of matplotlib.artist.RegularPolyCollection.set:44", + "lib/matplotlib/collections.py:docstring of matplotlib.artist.StarPolygonCollection.set:44", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.barbs:176", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.broken_barh:82", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.fill_between:118", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.fill_betweenx:118", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.hexbin:206", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.pcolor:178", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.quiver:212", + "lib/matplotlib/quiver.py:docstring of matplotlib.artist.Barbs.set:45", + "lib/matplotlib/quiver.py:docstring of matplotlib.artist.Quiver.set:45", + "lib/matplotlib/quiver.py:docstring of matplotlib.quiver.Barbs:209", + "lib/matplotlib/quiver.py:docstring of matplotlib.quiver.Quiver:248", + "lib/mpl_toolkits/mplot3d/art3d.py:docstring of matplotlib.artist.Path3DCollection.set:46", + "lib/mpl_toolkits/mplot3d/art3d.py:docstring of matplotlib.artist.Poly3DCollection.set:44" ], "matplotlib.collections._MeshData.set_array": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.pcolormesh:160", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.artist.PolyQuadMesh.set:17", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\collections.py:docstring of matplotlib.artist.QuadMesh.set:17", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.pcolormesh:160" + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.pcolormesh:160", + "lib/matplotlib/collections.py:docstring of matplotlib.artist.PolyQuadMesh.set:17", + "lib/matplotlib/collections.py:docstring of matplotlib.artist.QuadMesh.set:17", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.pcolormesh:160" ] }, "py:obj": { "Artist.stale_callback": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\users/explain/figure/interactive_guide.rst:323" + "doc/users/explain/figure/interactive_guide.rst:323" ], "Artist.sticky_edges": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/axes_api.rst:356::1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes.Axes.use_sticky_edges:2" + "doc/api/axes_api.rst:356::1" ], "Axes.dataLim": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/axes_api.rst:293::1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_base.py:docstring of matplotlib.axes._base._AxesBase.update_datalim:2" + "doc/api/axes_api.rst:293::1", + "lib/matplotlib/axes/_base.py:docstring of matplotlib.axes._base._AxesBase.update_datalim:2" ], "AxesBase": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/axes_api.rst:448::1", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_base.py:docstring of matplotlib.axes._base._AxesBase.add_child_axes:2" + "doc/api/axes_api.rst:448::1", + "lib/matplotlib/axes/_base.py:docstring of matplotlib.axes._base._AxesBase.add_child_axes:2" ], "Figure.stale_callback": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\users/explain/figure/interactive_guide.rst:333" + "doc/users/explain/figure/interactive_guide.rst:333" ], "Glyph": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\gallery/misc/ftface_props.rst:28" + "doc/gallery/misc/ftface_props.rst:28" ], "Image": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.gci:4" + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.gci:4" ], "ImageComparisonFailure": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\testing\\decorators.py:docstring of matplotlib.testing.decorators.image_comparison:2" + "lib/matplotlib/testing/decorators.py:docstring of matplotlib.testing.decorators.image_comparison:2" ], "Line2D.pick": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\users/explain/figure/event_handling.rst:568" + "doc/users/explain/figure/event_handling.rst:568" ], "QuadContourSet.changed()": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.contour:152", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.contourf:152", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.contour:152", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.contourf:152" + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.contour:152", + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.contourf:152", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.contour:152", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.contourf:152" ], "Rectangle.contains": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\users/explain/figure/event_handling.rst:280" + "doc/users/explain/figure/event_handling.rst:280" ], "Size.from_any": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axes_grid1\\axes_grid.py:docstring of mpl_toolkits.axes_grid1.axes_grid.ImageGrid:84", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axisartist\\axes_grid.py:docstring of mpl_toolkits.axisartist.axes_grid.ImageGrid:84" + "lib/mpl_toolkits/axes_grid1/axes_grid.py:docstring of mpl_toolkits.axes_grid1.axes_grid.ImageGrid:84", + "lib/mpl_toolkits/axisartist/axes_grid.py:docstring of mpl_toolkits.axisartist.axes_grid.ImageGrid:84" ], "Timer": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backend_bases.py:docstring of matplotlib.backend_bases.FigureCanvasBase.new_timer:2", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backend_bases.py:docstring of matplotlib.backend_bases.TimerBase:14" + "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.FigureCanvasBase.new_timer:2", + "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.TimerBase:14" ], "ToolContainer": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backend_bases.py:docstring of matplotlib.backend_bases.ToolContainerBase.remove_toolitem:2", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backend_bases.py:docstring of matplotlib.backend_bases.ToolContainerBase:20" + "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.ToolContainerBase.remove_toolitem:2", + "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.ToolContainerBase:20" ], "_iter_collection": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backend_bases.py:docstring of matplotlib.backend_bases.RendererBase.draw_path_collection:15", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_pdf.py:docstring of matplotlib.backends.backend_pdf.RendererPdf.draw_path_collection:15", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_ps.py:docstring of matplotlib.backends.backend_ps.RendererPS.draw_path_collection:15", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_svg.py:docstring of matplotlib.backends.backend_svg.RendererSVG.draw_path_collection:15", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patheffects.py:docstring of matplotlib.patheffects.PathEffectRenderer.draw_path_collection:15" + "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.RendererBase.draw_path_collection:15", + "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.RendererPdf.draw_path_collection:15", + "lib/matplotlib/backends/backend_ps.py:docstring of matplotlib.backends.backend_ps.RendererPS.draw_path_collection:15", + "lib/matplotlib/backends/backend_svg.py:docstring of matplotlib.backends.backend_svg.RendererSVG.draw_path_collection:15", + "lib/matplotlib/patheffects.py:docstring of matplotlib.patheffects.PathEffectRenderer.draw_path_collection:15" ], "_iter_collection_raw_paths": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backend_bases.py:docstring of matplotlib.backend_bases.RendererBase.draw_path_collection:15", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_pdf.py:docstring of matplotlib.backends.backend_pdf.RendererPdf.draw_path_collection:15", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_ps.py:docstring of matplotlib.backends.backend_ps.RendererPS.draw_path_collection:15", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_svg.py:docstring of matplotlib.backends.backend_svg.RendererSVG.draw_path_collection:15", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\patheffects.py:docstring of matplotlib.patheffects.PathEffectRenderer.draw_path_collection:15" + "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.RendererBase.draw_path_collection:15", + "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.RendererPdf.draw_path_collection:15", + "lib/matplotlib/backends/backend_ps.py:docstring of matplotlib.backends.backend_ps.RendererPS.draw_path_collection:15", + "lib/matplotlib/backends/backend_svg.py:docstring of matplotlib.backends.backend_svg.RendererSVG.draw_path_collection:15", + "lib/matplotlib/patheffects.py:docstring of matplotlib.patheffects.PathEffectRenderer.draw_path_collection:15" ], "_read": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\dviread.py:docstring of matplotlib.dviread.Vf:20" + "lib/matplotlib/dviread.py:docstring of matplotlib.dviread.Vf:20" ], "active": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\widgets.py:docstring of matplotlib.widgets.AxesWidget:34" + "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.AxesWidget:34" ], "ax.transAxes": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.indicate_inset:19", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.inset_axes:11" + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.indicate_inset:19", + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.inset_axes:11" ], "axes.bbox": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.legend:144", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\figure.py:docstring of matplotlib.figure.FigureBase.legend:145", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\legend.py:docstring of matplotlib.legend.Legend:97", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.figlegend:145", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.legend:144" + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.legend:144", + "lib/matplotlib/figure.py:docstring of matplotlib.figure.FigureBase.legend:145", + "lib/matplotlib/legend.py:docstring of matplotlib.legend.Legend:97", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.figlegend:145", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.legend:144" ], "can_composite": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\image.py:docstring of matplotlib.image.composite_images:9" + "lib/matplotlib/image.py:docstring of matplotlib.image.composite_images:9" ], "converter": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\testing\\compare.py:docstring of matplotlib.testing.compare.compare_images:4" + "lib/matplotlib/testing/compare.py:docstring of matplotlib.testing.compare.compare_images:4" ], "draw_image": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_agg.py:docstring of matplotlib.backends.backend_agg.RendererAgg.option_scale_image:2" + "lib/matplotlib/backends/backend_agg.py:docstring of matplotlib.backends.backend_agg.RendererAgg.option_scale_image:2" ], "figure.bbox": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.legend:144", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\figure.py:docstring of matplotlib.figure.FigureBase.legend:145", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\legend.py:docstring of matplotlib.legend.Legend:97", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.figlegend:145", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.legend:144" + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.legend:144", + "lib/matplotlib/figure.py:docstring of matplotlib.figure.FigureBase.legend:145", + "lib/matplotlib/legend.py:docstring of matplotlib.legend.Legend:97", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.figlegend:145", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.legend:144" ], "fmt_xdata": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_base.py:docstring of matplotlib.axes._base._AxesBase.format_xdata:4" + "lib/matplotlib/axes/_base.py:docstring of matplotlib.axes._base._AxesBase.format_xdata:4" ], "fmt_ydata": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_base.py:docstring of matplotlib.axes._base._AxesBase.format_ydata:4" + "lib/matplotlib/axes/_base.py:docstring of matplotlib.axes._base._AxesBase.format_ydata:4" ], "get_size": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axes_grid1\\axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size:1" + "lib/mpl_toolkits/axes_grid1/axes_size.py:docstring of mpl_toolkits.axes_grid1.axes_size:1" ], "ipykernel.pylab.backend_inline": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\users/explain/figure/interactive.rst:340" + "doc/users/explain/figure/interactive.rst:340" ], "kde.covariance_factor": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\mlab.py:docstring of matplotlib.mlab.GaussianKDE:41" + "lib/matplotlib/mlab.py:docstring of matplotlib.mlab.GaussianKDE:41" ], "kde.factor": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\axes\\_axes.py:docstring of matplotlib.axes._axes.Axes.violinplot:46", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\mlab.py:docstring of matplotlib.mlab.GaussianKDE:12", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\mlab.py:docstring of matplotlib.mlab.GaussianKDE:45", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\pyplot.py:docstring of matplotlib.pyplot.violinplot:46" + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes._axes.Axes.violinplot:46", + "lib/matplotlib/mlab.py:docstring of matplotlib.mlab.GaussianKDE:12", + "lib/matplotlib/mlab.py:docstring of matplotlib.mlab.GaussianKDE:45", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.violinplot:46" ], "make_image": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\image.py:docstring of matplotlib.image.composite_images:9" + "lib/matplotlib/image.py:docstring of matplotlib.image.composite_images:9" ], "matplotlib.animation.ArtistAnimation.new_frame_seq": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ArtistAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.ArtistAnimation.rst:28::1" ], "matplotlib.animation.ArtistAnimation.new_saved_frame_seq": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ArtistAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.ArtistAnimation.rst:28::1" ], "matplotlib.animation.ArtistAnimation.pause": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ArtistAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.ArtistAnimation.rst:28::1" ], "matplotlib.animation.ArtistAnimation.repeat": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ArtistAnimation.rst:33::1" + "doc/api/_as_gen/matplotlib.animation.ArtistAnimation.rst:33::1" ], "matplotlib.animation.ArtistAnimation.resume": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ArtistAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.ArtistAnimation.rst:28::1" ], "matplotlib.animation.ArtistAnimation.save": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ArtistAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.ArtistAnimation.rst:28::1" ], "matplotlib.animation.ArtistAnimation.to_html5_video": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ArtistAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.ArtistAnimation.rst:28::1" ], "matplotlib.animation.ArtistAnimation.to_jshtml": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ArtistAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.ArtistAnimation.rst:28::1" ], "matplotlib.animation.FFMpegFileWriter.bin_path": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FFMpegFileWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.FFMpegFileWriter.rst:27::1" ], "matplotlib.animation.FFMpegFileWriter.finish": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FFMpegFileWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.FFMpegFileWriter.rst:27::1" ], "matplotlib.animation.FFMpegFileWriter.frame_format": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\animation.py:docstring of matplotlib.animation.FFMpegFileWriter.supported_formats:1::1" + "lib/matplotlib/animation.py:docstring of matplotlib.animation.FFMpegFileWriter.supported_formats:1::1" ], "matplotlib.animation.FFMpegFileWriter.frame_size": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\animation.py:docstring of matplotlib.animation.FFMpegFileWriter.supported_formats:1::1" + "lib/matplotlib/animation.py:docstring of matplotlib.animation.FFMpegFileWriter.supported_formats:1::1" ], "matplotlib.animation.FFMpegFileWriter.grab_frame": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FFMpegFileWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.FFMpegFileWriter.rst:27::1" ], "matplotlib.animation.FFMpegFileWriter.isAvailable": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FFMpegFileWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.FFMpegFileWriter.rst:27::1" ], "matplotlib.animation.FFMpegFileWriter.output_args": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\animation.py:docstring of matplotlib.animation.FFMpegFileWriter.supported_formats:1::1" + "lib/matplotlib/animation.py:docstring of matplotlib.animation.FFMpegFileWriter.supported_formats:1::1" ], "matplotlib.animation.FFMpegFileWriter.saving": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FFMpegFileWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.FFMpegFileWriter.rst:27::1" ], "matplotlib.animation.FFMpegFileWriter.setup": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FFMpegFileWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.FFMpegFileWriter.rst:27::1" ], "matplotlib.animation.FFMpegWriter.bin_path": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FFMpegWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.FFMpegWriter.rst:27::1" ], "matplotlib.animation.FFMpegWriter.finish": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FFMpegWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.FFMpegWriter.rst:27::1" ], "matplotlib.animation.FFMpegWriter.frame_size": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FFMpegWriter.rst:34::1" + "doc/api/_as_gen/matplotlib.animation.FFMpegWriter.rst:34::1" ], "matplotlib.animation.FFMpegWriter.grab_frame": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FFMpegWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.FFMpegWriter.rst:27::1" ], "matplotlib.animation.FFMpegWriter.isAvailable": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FFMpegWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.FFMpegWriter.rst:27::1" ], "matplotlib.animation.FFMpegWriter.output_args": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FFMpegWriter.rst:34::1" + "doc/api/_as_gen/matplotlib.animation.FFMpegWriter.rst:34::1" ], "matplotlib.animation.FFMpegWriter.saving": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FFMpegWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.FFMpegWriter.rst:27::1" ], "matplotlib.animation.FFMpegWriter.setup": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FFMpegWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.FFMpegWriter.rst:27::1" ], "matplotlib.animation.FFMpegWriter.supported_formats": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FFMpegWriter.rst:34::1" + "doc/api/_as_gen/matplotlib.animation.FFMpegWriter.rst:34::1" ], "matplotlib.animation.FileMovieWriter.bin_path": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FileMovieWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.FileMovieWriter.rst:27::1" ], "matplotlib.animation.FileMovieWriter.frame_size": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\animation.py:docstring of matplotlib.animation.FileMovieWriter.finish:1::1" + "lib/matplotlib/animation.py:docstring of matplotlib.animation.FileMovieWriter.finish:1::1" ], "matplotlib.animation.FileMovieWriter.isAvailable": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FileMovieWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.FileMovieWriter.rst:27::1" ], "matplotlib.animation.FileMovieWriter.saving": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FileMovieWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.FileMovieWriter.rst:27::1" ], "matplotlib.animation.FileMovieWriter.supported_formats": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\animation.py:docstring of matplotlib.animation.FileMovieWriter.finish:1::1" + "lib/matplotlib/animation.py:docstring of matplotlib.animation.FileMovieWriter.finish:1::1" ], "matplotlib.animation.FuncAnimation.pause": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FuncAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.FuncAnimation.rst:28::1" ], "matplotlib.animation.FuncAnimation.repeat": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\animation.py:docstring of matplotlib.animation.FuncAnimation.new_frame_seq:1::1" + "lib/matplotlib/animation.py:docstring of matplotlib.animation.FuncAnimation.new_frame_seq:1::1" ], "matplotlib.animation.FuncAnimation.resume": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FuncAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.FuncAnimation.rst:28::1" ], "matplotlib.animation.FuncAnimation.save": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FuncAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.FuncAnimation.rst:28::1" ], "matplotlib.animation.FuncAnimation.to_html5_video": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FuncAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.FuncAnimation.rst:28::1" ], "matplotlib.animation.FuncAnimation.to_jshtml": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.FuncAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.FuncAnimation.rst:28::1" ], "matplotlib.animation.HTMLWriter.bin_path": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.HTMLWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.HTMLWriter.rst:27::1" ], "matplotlib.animation.HTMLWriter.frame_format": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\animation.py:docstring of matplotlib.animation.HTMLWriter.finish:1::1" + "lib/matplotlib/animation.py:docstring of matplotlib.animation.HTMLWriter.finish:1::1" ], "matplotlib.animation.HTMLWriter.frame_size": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\animation.py:docstring of matplotlib.animation.HTMLWriter.finish:1::1" + "lib/matplotlib/animation.py:docstring of matplotlib.animation.HTMLWriter.finish:1::1" ], "matplotlib.animation.HTMLWriter.saving": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.HTMLWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.HTMLWriter.rst:27::1" ], "matplotlib.animation.ImageMagickFileWriter.bin_path": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ImageMagickFileWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.ImageMagickFileWriter.rst:27::1" ], "matplotlib.animation.ImageMagickFileWriter.finish": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ImageMagickFileWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.ImageMagickFileWriter.rst:27::1" ], "matplotlib.animation.ImageMagickFileWriter.frame_format": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\animation.py:docstring of matplotlib.animation.ImageMagickFileWriter.input_names:1::1" + "lib/matplotlib/animation.py:docstring of matplotlib.animation.ImageMagickFileWriter.input_names:1::1" ], "matplotlib.animation.ImageMagickFileWriter.frame_size": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\animation.py:docstring of matplotlib.animation.ImageMagickFileWriter.input_names:1::1" + "lib/matplotlib/animation.py:docstring of matplotlib.animation.ImageMagickFileWriter.input_names:1::1" ], "matplotlib.animation.ImageMagickFileWriter.grab_frame": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ImageMagickFileWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.ImageMagickFileWriter.rst:27::1" ], "matplotlib.animation.ImageMagickFileWriter.isAvailable": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ImageMagickFileWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.ImageMagickFileWriter.rst:27::1" ], "matplotlib.animation.ImageMagickFileWriter.saving": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ImageMagickFileWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.ImageMagickFileWriter.rst:27::1" ], "matplotlib.animation.ImageMagickFileWriter.setup": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ImageMagickFileWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.ImageMagickFileWriter.rst:27::1" ], "matplotlib.animation.ImageMagickWriter.bin_path": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ImageMagickWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.ImageMagickWriter.rst:27::1" ], "matplotlib.animation.ImageMagickWriter.finish": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ImageMagickWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.ImageMagickWriter.rst:27::1" ], "matplotlib.animation.ImageMagickWriter.frame_size": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\animation.py:docstring of matplotlib.animation.ImageMagickWriter.input_names:1::1" + "lib/matplotlib/animation.py:docstring of matplotlib.animation.ImageMagickWriter.input_names:1::1" ], "matplotlib.animation.ImageMagickWriter.grab_frame": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ImageMagickWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.ImageMagickWriter.rst:27::1" ], "matplotlib.animation.ImageMagickWriter.isAvailable": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ImageMagickWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.ImageMagickWriter.rst:27::1" ], "matplotlib.animation.ImageMagickWriter.saving": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ImageMagickWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.ImageMagickWriter.rst:27::1" ], "matplotlib.animation.ImageMagickWriter.setup": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.ImageMagickWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.ImageMagickWriter.rst:27::1" ], "matplotlib.animation.ImageMagickWriter.supported_formats": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\animation.py:docstring of matplotlib.animation.ImageMagickWriter.input_names:1::1" + "lib/matplotlib/animation.py:docstring of matplotlib.animation.ImageMagickWriter.input_names:1::1" ], "matplotlib.animation.MovieWriter.frame_size": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\animation.py:docstring of matplotlib.animation.MovieWriter.bin_path:1::1" + "lib/matplotlib/animation.py:docstring of matplotlib.animation.MovieWriter.bin_path:1::1" ], "matplotlib.animation.MovieWriter.saving": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.MovieWriter.rst:27::1" + "doc/api/_as_gen/matplotlib.animation.MovieWriter.rst:27::1" ], "matplotlib.animation.PillowWriter.frame_size": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\animation.py:docstring of matplotlib.animation.PillowWriter.finish:1::1" + "lib/matplotlib/animation.py:docstring of matplotlib.animation.PillowWriter.finish:1::1" ], "matplotlib.animation.PillowWriter.saving": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.PillowWriter.rst:26::1" + "doc/api/_as_gen/matplotlib.animation.PillowWriter.rst:26::1" ], "matplotlib.animation.TimedAnimation.new_frame_seq": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.TimedAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.TimedAnimation.rst:28::1" ], "matplotlib.animation.TimedAnimation.new_saved_frame_seq": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.TimedAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.TimedAnimation.rst:28::1" ], "matplotlib.animation.TimedAnimation.pause": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.TimedAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.TimedAnimation.rst:28::1" ], "matplotlib.animation.TimedAnimation.resume": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.TimedAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.TimedAnimation.rst:28::1" ], "matplotlib.animation.TimedAnimation.save": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.TimedAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.TimedAnimation.rst:28::1" ], "matplotlib.animation.TimedAnimation.to_html5_video": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\api/_as_gen/matplotlib.animation.TimedAnimation.rst:28::1" + "doc/api/_as_gen/matplotlib.animation.TimedAnimation.rst:28::1" ], "matplotlib.animation.TimedAnimation.to_jshtml": [ "doc/api/_as_gen/matplotlib.animation.TimedAnimation.rst:28::1" @@ -734,31 +663,31 @@ "doc/docstring of builtins.list:17" ], "mpl_toolkits.axislines.Axes": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\mpl_toolkits\\axisartist\\axis_artist.py:docstring of mpl_toolkits.axisartist.axis_artist:7" + "lib/mpl_toolkits/axisartist/axis_artist.py:docstring of mpl_toolkits.axisartist.axis_artist:7" ], "next_whats_new": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\users/next_whats_new/README.rst:6" + "doc/users/next_whats_new/README.rst:6" ], "option_scale_image": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_cairo.py:docstring of matplotlib.backends.backend_cairo.RendererCairo.draw_image:22", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_pdf.py:docstring of matplotlib.backends.backend_pdf.RendererPdf.draw_image:22", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_ps.py:docstring of matplotlib.backends.backend_ps.RendererPS.draw_image:22", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_template.py:docstring of matplotlib.backends.backend_template.RendererTemplate.draw_image:22" + "lib/matplotlib/backends/backend_cairo.py:docstring of matplotlib.backends.backend_cairo.RendererCairo.draw_image:22", + "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.RendererPdf.draw_image:22", + "lib/matplotlib/backends/backend_ps.py:docstring of matplotlib.backends.backend_ps.RendererPS.draw_image:22", + "lib/matplotlib/backends/backend_template.py:docstring of matplotlib.backends.backend_template.RendererTemplate.draw_image:22" ], "print_xyz": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backends\\backend_template.py:docstring of matplotlib.backends.backend_template:22" + "lib/matplotlib/backends/backend_template.py:docstring of matplotlib.backends.backend_template:22" ], "toggled": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backend_tools.py:docstring of matplotlib.backend_tools.AxisScaleBase.disable:4", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backend_tools.py:docstring of matplotlib.backend_tools.AxisScaleBase.enable:4", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backend_tools.py:docstring of matplotlib.backend_tools.AxisScaleBase.trigger:2", - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backend_tools.py:docstring of matplotlib.backend_tools.ZoomPanBase.trigger:2" + "lib/matplotlib/backend_tools.py:docstring of matplotlib.backend_tools.AxisScaleBase.disable:4", + "lib/matplotlib/backend_tools.py:docstring of matplotlib.backend_tools.AxisScaleBase.enable:4", + "lib/matplotlib/backend_tools.py:docstring of matplotlib.backend_tools.AxisScaleBase.trigger:2", + "lib/matplotlib/backend_tools.py:docstring of matplotlib.backend_tools.ZoomPanBase.trigger:2" ], "tool_removed_event": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\lib\\matplotlib\\backend_bases.py:docstring of matplotlib.backend_bases.ToolContainerBase.remove_toolitem:6" + "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.ToolContainerBase.remove_toolitem:6" ], "whats_new.rst": [ - "doc/C:\\Users\\story\\Projects\\matplotlib\\doc\\users/next_whats_new/README.rst:6" + "doc/users/next_whats_new/README.rst:6" ] } } diff --git a/doc/sphinxext/missing_references.py b/doc/sphinxext/missing_references.py index cc0a3a8ea268..c621adb2c945 100644 --- a/doc/sphinxext/missing_references.py +++ b/doc/sphinxext/missing_references.py @@ -99,8 +99,12 @@ def get_location(node, app): if source: # 'source' can have the form '/some/path:docstring of some.api' but the # colons are forbidden on windows, but on posix just passes through. - path, *post = source.partition(':') - post = ''.join(post) + if ':docstring of' in source: + path, *post = source.rpartition(':docstring of') + post = ''.join(post) + else: + path = source + post = '' # We locate references relative to the parent of the doc # directory, which for matplotlib, will be the root of the # matplotlib repo. When matplotlib is not an editable install @@ -194,8 +198,7 @@ def save_missing_references_handler(app, exc): _warn_unused_missing_references(app) - json_path = (Path(app.confdir) / - app.config.missing_references_filename) + json_path = Path(app.confdir) / app.config.missing_references_filename references_warnings = getattr(app.env, 'missing_references_warnings', {}) @@ -264,8 +267,7 @@ def prepare_missing_references_handler(app): app.env.missing_references_ignored_references = {} - json_path = (Path(app.confdir) / - app.config.missing_references_filename) + json_path = Path(app.confdir) / app.config.missing_references_filename if not json_path.exists(): return From 5703086534c92a9ec766b270f2bbb9414d8298a1 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Wed, 4 Oct 2023 23:56:58 +0200 Subject: [PATCH 24/83] Backport PR #26940: Add typing to pyplot.show() to avoid errors with mypy --strict. --- lib/matplotlib/pyplot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 6fa7755e2c49..3f41376e0a63 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -479,7 +479,7 @@ def draw_if_interactive(*args, **kwargs): # This function's signature is rewritten upon backend-load by switch_backend. -def show(*args, **kwargs): +def show(*args, **kwargs) -> None: """ Display all open figures. From 1b3c2ae693e269ddd5df2bf57d9a9ad5e8d4a392 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Sat, 26 Aug 2023 11:37:55 -0500 Subject: [PATCH 25/83] Backport PR #26605: ci: Install GTK4 from brew on macOS --- .github/workflows/tests.yml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 073dc80df404..04ee474a1451 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -149,7 +149,7 @@ jobs: macOS) brew install ccache brew tap homebrew/cask-fonts - brew install font-noto-sans-cjk + brew install font-noto-sans-cjk gobject-introspection gtk4 ;; esac @@ -226,10 +226,14 @@ jobs: # libraries cannot be loaded at runtime, so an actual import is a # better check). # PyGObject, pycairo, and cariocffi do not install on OSX 10.12. - python -m pip install --upgrade pycairo 'cairocffi>=0.8' PyGObject && - python -c 'import gi; gi.require_version("Gtk", "3.0"); from gi.repository import Gtk' && - echo 'PyGObject is available' || - echo 'PyGObject is not available' + python -m pip install --upgrade pycairo 'cairocffi>=0.8' PyGObject && + ( + python -c 'import gi; gi.require_version("Gtk", "4.0"); from gi.repository import Gtk' && + echo 'PyGObject 4 is available' || echo 'PyGObject 4 is not available' + ) && ( + python -c 'import gi; gi.require_version("Gtk", "3.0"); from gi.repository import Gtk' && + echo 'PyGObject 3 is available' || echo 'PyGObject 3 is not available' + ) # There are no functioning wheels available for OSX 10.12 (as of # Sept 2020) for either pyqt5 (there are only wheels for 10.13+) or From 057ef0d10a68ca625506277fab94c26a1df37b1e Mon Sep 17 00:00:00 2001 From: hannah Date: Thu, 5 Oct 2023 23:42:44 -0400 Subject: [PATCH 26/83] Backport PR #27006: DOC: Fix resizing of animation examples --- galleries/examples/animation/bayes_update.py | 7 ++++++- galleries/examples/animation/double_pendulum.py | 11 ++--------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/galleries/examples/animation/bayes_update.py b/galleries/examples/animation/bayes_update.py index 86b6e5c342d1..1081b4704623 100644 --- a/galleries/examples/animation/bayes_update.py +++ b/galleries/examples/animation/bayes_update.py @@ -41,6 +41,11 @@ def __init__(self, ax, prob=0.5): # which the plotted distribution should converge. self.ax.axvline(prob, linestyle='--', color='black') + def start(self): + # Used for the *init_func* parameter of FuncAnimation; this is called when + # initializing the animation, and also after resizing the figure. + return self.line, + def __call__(self, i): # This way the plot can continuously run and we just keep # watching new realizations of the process @@ -62,5 +67,5 @@ def __call__(self, i): fig, ax = plt.subplots() ud = UpdateDist(ax, prob=0.7) -anim = FuncAnimation(fig, ud, frames=100, interval=100, blit=True) +anim = FuncAnimation(fig, ud, init_func=ud.start, frames=100, interval=100, blit=True) plt.show() diff --git a/galleries/examples/animation/double_pendulum.py b/galleries/examples/animation/double_pendulum.py index 5f8282daea0f..7a42a6d989ba 100644 --- a/galleries/examples/animation/double_pendulum.py +++ b/galleries/examples/animation/double_pendulum.py @@ -11,8 +11,6 @@ Output generated via `matplotlib.animation.Animation.to_jshtml`. """ -from collections import deque - import matplotlib.pyplot as plt import numpy as np from numpy import cos, sin @@ -92,19 +90,14 @@ def derivs(t, state): trace, = ax.plot([], [], '.-', lw=1, ms=2) time_template = 'time = %.1fs' time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes) -history_x, history_y = deque(maxlen=history_len), deque(maxlen=history_len) def animate(i): thisx = [0, x1[i], x2[i]] thisy = [0, y1[i], y2[i]] - if i == 0: - history_x.clear() - history_y.clear() - - history_x.appendleft(thisx[2]) - history_y.appendleft(thisy[2]) + history_x = x2[:i] + history_y = y2[:i] line.set_data(thisx, thisy) trace.set_data(history_x, history_y) From 965ee6fc7e8f37f2e511680f1f15911ed98bd9ef Mon Sep 17 00:00:00 2001 From: hannah Date: Thu, 5 Oct 2023 23:42:44 -0400 Subject: [PATCH 27/83] Backport PR #27006: DOC: Fix resizing of animation examples --- galleries/examples/animation/bayes_update.py | 7 ++++++- galleries/examples/animation/double_pendulum.py | 11 ++--------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/galleries/examples/animation/bayes_update.py b/galleries/examples/animation/bayes_update.py index 86b6e5c342d1..1081b4704623 100644 --- a/galleries/examples/animation/bayes_update.py +++ b/galleries/examples/animation/bayes_update.py @@ -41,6 +41,11 @@ def __init__(self, ax, prob=0.5): # which the plotted distribution should converge. self.ax.axvline(prob, linestyle='--', color='black') + def start(self): + # Used for the *init_func* parameter of FuncAnimation; this is called when + # initializing the animation, and also after resizing the figure. + return self.line, + def __call__(self, i): # This way the plot can continuously run and we just keep # watching new realizations of the process @@ -62,5 +67,5 @@ def __call__(self, i): fig, ax = plt.subplots() ud = UpdateDist(ax, prob=0.7) -anim = FuncAnimation(fig, ud, frames=100, interval=100, blit=True) +anim = FuncAnimation(fig, ud, init_func=ud.start, frames=100, interval=100, blit=True) plt.show() diff --git a/galleries/examples/animation/double_pendulum.py b/galleries/examples/animation/double_pendulum.py index 5f8282daea0f..7a42a6d989ba 100644 --- a/galleries/examples/animation/double_pendulum.py +++ b/galleries/examples/animation/double_pendulum.py @@ -11,8 +11,6 @@ Output generated via `matplotlib.animation.Animation.to_jshtml`. """ -from collections import deque - import matplotlib.pyplot as plt import numpy as np from numpy import cos, sin @@ -92,19 +90,14 @@ def derivs(t, state): trace, = ax.plot([], [], '.-', lw=1, ms=2) time_template = 'time = %.1fs' time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes) -history_x, history_y = deque(maxlen=history_len), deque(maxlen=history_len) def animate(i): thisx = [0, x1[i], x2[i]] thisy = [0, y1[i], y2[i]] - if i == 0: - history_x.clear() - history_y.clear() - - history_x.appendleft(thisx[2]) - history_y.appendleft(thisy[2]) + history_x = x2[:i] + history_y = y2[:i] line.set_data(thisx, thisy) trace.set_data(history_x, history_y) From 77cdc525f96eca22a93b6603498b6f898790fdf8 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Fri, 6 Oct 2023 11:10:31 -0500 Subject: [PATCH 28/83] Backport PR #26961: DOC: made "open PR on MPL" a section in contribute guide --- doc/devel/contribute.rst | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/doc/devel/contribute.rst b/doc/devel/contribute.rst index 9b53a80ab374..a9bfb0f816dd 100644 --- a/doc/devel/contribute.rst +++ b/doc/devel/contribute.rst @@ -227,6 +227,9 @@ Maplotlib repository to your own computer, or alternatively using in-browser development environment that comes with the appropriated setup to contribute to Matplotlib. +Workflow overview +^^^^^^^^^^^^^^^^^ + A brief overview of the workflow is as follows. #. `Create an account `_ on GitHub if you do not @@ -289,14 +292,19 @@ A brief overview of the workflow is as follows. git push -u origin my-feature -Finally, go to the web page of your fork of the Matplotlib repo, and click -'Pull request' to send your changes to the maintainers for review. +Open a pull request on Matplotlib +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Finally, go to the web page of *your fork* of the Matplotlib repo, and click +**Compare & pull request** to send your changes to the maintainers for review. +The base repository is ``matplotlib/matplotlib`` and the base branch is +generally ``main``. For more guidance, see GitHub's `pull request tutorial +`_. For more detailed instructions on how to set up Matplotlib for development and best practices for contribution, see :ref:`installing_for_devs`. GitHub Codespaces workflows -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^ * If you need to open a GUI window with Matplotlib output on Codespaces, our configuration includes a `light-weight Fluxbox-based desktop @@ -378,7 +386,7 @@ This ensures that users are notified before the change will take effect and thus prevents unexpected breaking of code. Rules -~~~~~ +^^^^^ - Deprecations are targeted at the next point.release (e.g. 3.x) - Deprecated API is generally removed two point-releases after introduction @@ -391,7 +399,7 @@ Rules API consistency lead developer Introducing -~~~~~~~~~~~ +^^^^^^^^^^^ #. Announce the deprecation in a new file :file:`doc/api/next_api_changes/deprecations/99999-ABC.rst` where ``99999`` @@ -432,7 +440,7 @@ Introducing version number. Expiring -~~~~~~~~ +^^^^^^^^ #. Announce the API changes in a new file :file:`doc/api/next_api_changes/[kind]/99999-ABC.rst` where ``99999`` @@ -613,7 +621,7 @@ example, use ``_log.error('hello %s', 'world')`` rather than ``_log.error('hell {}'.format('world'))`` or ``_log.error(f'hello {s}')``. Which logging level to use? -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^ There are five levels at which you can emit messages. From 0b05c391568041b23d83d3f57d3d90a7802cbd15 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Fri, 6 Oct 2023 11:10:31 -0500 Subject: [PATCH 29/83] Backport PR #26961: DOC: made "open PR on MPL" a section in contribute guide --- doc/devel/contribute.rst | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/doc/devel/contribute.rst b/doc/devel/contribute.rst index 9b53a80ab374..a9bfb0f816dd 100644 --- a/doc/devel/contribute.rst +++ b/doc/devel/contribute.rst @@ -227,6 +227,9 @@ Maplotlib repository to your own computer, or alternatively using in-browser development environment that comes with the appropriated setup to contribute to Matplotlib. +Workflow overview +^^^^^^^^^^^^^^^^^ + A brief overview of the workflow is as follows. #. `Create an account `_ on GitHub if you do not @@ -289,14 +292,19 @@ A brief overview of the workflow is as follows. git push -u origin my-feature -Finally, go to the web page of your fork of the Matplotlib repo, and click -'Pull request' to send your changes to the maintainers for review. +Open a pull request on Matplotlib +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Finally, go to the web page of *your fork* of the Matplotlib repo, and click +**Compare & pull request** to send your changes to the maintainers for review. +The base repository is ``matplotlib/matplotlib`` and the base branch is +generally ``main``. For more guidance, see GitHub's `pull request tutorial +`_. For more detailed instructions on how to set up Matplotlib for development and best practices for contribution, see :ref:`installing_for_devs`. GitHub Codespaces workflows -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^ * If you need to open a GUI window with Matplotlib output on Codespaces, our configuration includes a `light-weight Fluxbox-based desktop @@ -378,7 +386,7 @@ This ensures that users are notified before the change will take effect and thus prevents unexpected breaking of code. Rules -~~~~~ +^^^^^ - Deprecations are targeted at the next point.release (e.g. 3.x) - Deprecated API is generally removed two point-releases after introduction @@ -391,7 +399,7 @@ Rules API consistency lead developer Introducing -~~~~~~~~~~~ +^^^^^^^^^^^ #. Announce the deprecation in a new file :file:`doc/api/next_api_changes/deprecations/99999-ABC.rst` where ``99999`` @@ -432,7 +440,7 @@ Introducing version number. Expiring -~~~~~~~~ +^^^^^^^^ #. Announce the API changes in a new file :file:`doc/api/next_api_changes/[kind]/99999-ABC.rst` where ``99999`` @@ -613,7 +621,7 @@ example, use ``_log.error('hello %s', 'world')`` rather than ``_log.error('hell {}'.format('world'))`` or ``_log.error(f'hello {s}')``. Which logging level to use? -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^ There are five levels at which you can emit messages. From 31a97b52f3cf862efd943db4874ba919543c9061 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Fri, 6 Oct 2023 20:01:32 -0400 Subject: [PATCH 30/83] BLD: Remove development dependencies from sdists Also, backport #26699. --- .github/workflows/cibuildwheel.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cibuildwheel.yml b/.github/workflows/cibuildwheel.yml index 83eac197d4ba..3fa922f404fb 100644 --- a/.github/workflows/cibuildwheel.yml +++ b/.github/workflows/cibuildwheel.yml @@ -64,6 +64,9 @@ jobs: run: | python -m build --sdist python ci/export_sdist_name.py + env: + # Prevent including development runtime dependencies in metadata. + CIBUILDWHEEL: 1 - name: Check README rendering for PyPI run: twine check dist/* @@ -87,7 +90,7 @@ jobs: 'CI: Run cibuildwheel') ) needs: build_sdist - name: Build wheels on ${{ matrix.os }} + name: Build wheels on ${{ matrix.os }} for ${{ matrix.cibw_archs }} runs-on: ${{ matrix.os }} env: CIBW_BEFORE_BUILD: >- From cfdd72074dfb38ba0d8874e60baa0da84740e7dc Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sat, 7 Oct 2023 07:21:16 +0200 Subject: [PATCH 31/83] Backport PR #26883: [TYP] Type changes from running against Pandas --- lib/matplotlib/axes/__init__.pyi | 7 ++++-- lib/matplotlib/axes/_base.pyi | 37 +++++++++++++++++++------------- lib/matplotlib/ticker.pyi | 2 +- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/lib/matplotlib/axes/__init__.pyi b/lib/matplotlib/axes/__init__.pyi index 0c27be62e370..7df38b8bde9e 100644 --- a/lib/matplotlib/axes/__init__.pyi +++ b/lib/matplotlib/axes/__init__.pyi @@ -1,10 +1,13 @@ from typing import TypeVar -from ._axes import * -from ._axes import Axes as Subplot +from ._axes import Axes as Axes + _T = TypeVar("_T") +# Backcompat. +Subplot = Axes + class _SubplotBaseMeta(type): def __instancecheck__(self, obj) -> bool: ... diff --git a/lib/matplotlib/axes/_base.pyi b/lib/matplotlib/axes/_base.pyi index d41ecae1803c..6adbb3e6f0b6 100644 --- a/lib/matplotlib/axes/_base.pyi +++ b/lib/matplotlib/axes/_base.pyi @@ -6,6 +6,7 @@ from matplotlib import cbook from matplotlib.artist import Artist from matplotlib.axis import XAxis, YAxis, Tick from matplotlib.backend_bases import RendererBase, MouseButton, MouseEvent +from matplotlib.cbook import CallbackRegistry from matplotlib.container import Container from matplotlib.collections import Collection from matplotlib.cm import ScalarMappable @@ -25,9 +26,11 @@ from cycler import Cycler import numpy as np from numpy.typing import ArrayLike -from typing import Any, Literal, overload +from typing import Any, Literal, TypeVar, overload from matplotlib.typing import ColorType +_T = TypeVar("_T", bound=Artist) + class _axis_method_wrapper: attr_name: str method_name: str @@ -53,6 +56,11 @@ class _AxesBase(martist.Artist): transData: Transform ignore_existing_data_limits: bool axison: bool + containers: list[Container] + callbacks: CallbackRegistry + child_axes: list[_AxesBase] + legend_: Legend | None + title: Text _projection_init: Any def __init__( @@ -125,8 +133,7 @@ class _AxesBase(martist.Artist): def clear(self) -> None: ... def cla(self) -> None: ... - # Could be made generic, but comments indicate it may be temporary anyway - class ArtistList(Sequence[Artist]): + class ArtistList(Sequence[_T]): def __init__( self, axes: _AxesBase, @@ -135,40 +142,40 @@ class _AxesBase(martist.Artist): invalid_types: type | Iterable[type] | None = ..., ) -> None: ... def __len__(self) -> int: ... - def __iter__(self) -> Iterator[Artist]: ... + def __iter__(self) -> Iterator[_T]: ... @overload - def __getitem__(self, key: int) -> Artist: ... + def __getitem__(self, key: int) -> _T: ... @overload - def __getitem__(self, key: slice) -> list[Artist]: ... + def __getitem__(self, key: slice) -> list[_T]: ... @overload - def __add__(self, other: _AxesBase.ArtistList) -> list[Artist]: ... + def __add__(self, other: _AxesBase.ArtistList[_T]) -> list[_T]: ... @overload def __add__(self, other: list[Any]) -> list[Any]: ... @overload def __add__(self, other: tuple[Any]) -> tuple[Any]: ... @overload - def __radd__(self, other: _AxesBase.ArtistList) -> list[Artist]: ... + def __radd__(self, other: _AxesBase.ArtistList[_T]) -> list[_T]: ... @overload def __radd__(self, other: list[Any]) -> list[Any]: ... @overload def __radd__(self, other: tuple[Any]) -> tuple[Any]: ... @property - def artists(self) -> _AxesBase.ArtistList: ... + def artists(self) -> _AxesBase.ArtistList[Artist]: ... @property - def collections(self) -> _AxesBase.ArtistList: ... + def collections(self) -> _AxesBase.ArtistList[Collection]: ... @property - def images(self) -> _AxesBase.ArtistList: ... + def images(self) -> _AxesBase.ArtistList[AxesImage]: ... @property - def lines(self) -> _AxesBase.ArtistList: ... + def lines(self) -> _AxesBase.ArtistList[Line2D]: ... @property - def patches(self) -> _AxesBase.ArtistList: ... + def patches(self) -> _AxesBase.ArtistList[Patch]: ... @property - def tables(self) -> _AxesBase.ArtistList: ... + def tables(self) -> _AxesBase.ArtistList[Table]: ... @property - def texts(self) -> _AxesBase.ArtistList: ... + def texts(self) -> _AxesBase.ArtistList[Text]: ... def get_facecolor(self) -> ColorType: ... def set_facecolor(self, color: ColorType | None) -> None: ... @overload diff --git a/lib/matplotlib/ticker.pyi b/lib/matplotlib/ticker.pyi index 2ef1c9f53f1d..f026b4943c94 100644 --- a/lib/matplotlib/ticker.pyi +++ b/lib/matplotlib/ticker.pyi @@ -19,7 +19,7 @@ class _DummyAxis: class TickHelper: axis: None | Axis | _DummyAxis | _AxisWrapper - def set_axis(self, axis: Axis | _DummyAxis | None) -> None: ... + def set_axis(self, axis: Axis | _DummyAxis | _AxisWrapper | None) -> None: ... def create_dummy_axis(self, **kwargs) -> None: ... class Formatter(TickHelper): From dd06c8bd4f1dbb3a499d34131c51f499079a1492 Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Sun, 8 Oct 2023 10:30:14 +0100 Subject: [PATCH 32/83] Backport PR #27015: ValueError exception added to handle mix of {} and % string in colorbar format --- lib/matplotlib/colorbar.py | 2 +- lib/matplotlib/tests/test_colorbar.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index 5c37eef5190b..6c92f3795384 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -404,7 +404,7 @@ def __init__(self, ax, mappable=None, *, cmap=None, try: self._formatter = ticker.FormatStrFormatter(format) _ = self._formatter(0) - except TypeError: + except (TypeError, ValueError): self._formatter = ticker.StrMethodFormatter(format) else: self._formatter = format # Assume it is a Formatter or None diff --git a/lib/matplotlib/tests/test_colorbar.py b/lib/matplotlib/tests/test_colorbar.py index 73c4dab9a87f..0cf098e787ee 100644 --- a/lib/matplotlib/tests/test_colorbar.py +++ b/lib/matplotlib/tests/test_colorbar.py @@ -15,7 +15,7 @@ BoundaryNorm, LogNorm, PowerNorm, Normalize, NoNorm ) from matplotlib.colorbar import Colorbar -from matplotlib.ticker import FixedLocator, LogFormatter +from matplotlib.ticker import FixedLocator, LogFormatter, StrMethodFormatter from matplotlib.testing.decorators import check_figures_equal @@ -1230,3 +1230,9 @@ def test_colorbar_wrong_figure(): fig_tl.colorbar(im) fig_tl.draw_without_rendering() fig_cl.draw_without_rendering() + + +def test_colorbar_format_string_and_old(): + plt.imshow([[0, 1]]) + cb = plt.colorbar(format="{x}%") + assert isinstance(cb._formatter, StrMethodFormatter) From 1e7d7f5f1d086584d93c12e5776c1cbbf03d4586 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sun, 8 Oct 2023 18:13:20 +0200 Subject: [PATCH 33/83] Backport PR #27017: DOC: clarify usetex versus mathtext --- doc/users/prev_whats_new/whats_new_3.8.0.rst | 4 ++++ galleries/users_explain/text/mathtext.py | 14 +++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/doc/users/prev_whats_new/whats_new_3.8.0.rst b/doc/users/prev_whats_new/whats_new_3.8.0.rst index 4ea0afaa30f3..b3dc766eca75 100644 --- a/doc/users/prev_whats_new/whats_new_3.8.0.rst +++ b/doc/users/prev_whats_new/whats_new_3.8.0.rst @@ -327,6 +327,10 @@ This allows users to set the location of the legend in a more flexible and consi Mathtext improvements ===================== +Improvements are to Mathtext, Matplotlib's native TeX-like mathematics parser +(see :ref:`mathtext`, not to be confused with Matplotlib using LaTeX directly: +:ref:`usetex`). + Boldsymbol mathtext command ``\boldsymbol`` ------------------------------------------- diff --git a/galleries/users_explain/text/mathtext.py b/galleries/users_explain/text/mathtext.py index 09c049d4a833..bbd1814d567d 100644 --- a/galleries/users_explain/text/mathtext.py +++ b/galleries/users_explain/text/mathtext.py @@ -8,11 +8,15 @@ ================================ Matplotlib implements a lightweight TeX expression parser and layout engine and -*Mathtext* is the subset of Tex markup that this engine supports. Any string can -be processed as Mathtext by placing the string inside a pair of dollar signs -``'$'``. Mathtext often contains many backslashes ``'\'``; so that the backslashes -do not need to be escaped, Mathtext is often written using raw strings. For -example: +*Mathtext* is the subset of Tex markup that this engine supports. Note that +Matplotlib can also render all text directly using TeX if :rc:`text.usetex` is +*True*; see :ref:`usetex` for more details. Mathtext support is available +if :rc:`text.usetex` is *False*. + +Any string can be processed as Mathtext by placing the string inside a pair of +dollar signs ``'$'``. Mathtext often contains many backslashes ``'\'``; so that +the backslashes do not need to be escaped, Mathtext is often written using raw +strings. For example: """ import matplotlib.pyplot as plt From 6f66c7e1b8bf9e4b63568a6ba2a1892244f3c060 Mon Sep 17 00:00:00 2001 From: Greg Lucas Date: Mon, 9 Oct 2023 19:09:22 -0600 Subject: [PATCH 34/83] Backport PR #26908: `allsegs` and `allkinds` return individual segments --- lib/matplotlib/contour.py | 6 ++++-- lib/matplotlib/tests/test_contour.py | 18 ++++++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index efea024dc102..2725dd6340a4 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -935,9 +935,11 @@ def __init__(self, ax, *args, ) allsegs = _api.deprecated("3.8", pending=True)(property(lambda self: [ - p.vertices for c in self.collections for p in c.get_paths()])) + [subp.vertices for subp in p._iter_connected_components()] + for p in self.get_paths()])) allkinds = _api.deprecated("3.8", pending=True)(property(lambda self: [ - p.codes for c in self.collections for p in c.get_paths()])) + [subp.codes for subp in p._iter_connected_components()] + for p in self.get_paths()])) tcolors = _api.deprecated("3.8")(property(lambda self: [ (tuple(rgba),) for rgba in self.to_rgba(self.cvalues, self.alpha)])) tlinewidths = _api.deprecated("3.8")(property(lambda self: [ diff --git a/lib/matplotlib/tests/test_contour.py b/lib/matplotlib/tests/test_contour.py index 4a32fdc6ce32..c911d499ea96 100644 --- a/lib/matplotlib/tests/test_contour.py +++ b/lib/matplotlib/tests/test_contour.py @@ -819,14 +819,24 @@ def test_all_nan(): 2.4e-14, 5e-14, 7.5e-14, 1e-13]) +def test_allsegs_allkinds(): + x, y = np.meshgrid(np.arange(0, 10, 2), np.arange(0, 10, 2)) + z = np.sin(x) * np.cos(y) + + cs = plt.contour(x, y, z, levels=[0, 0.5]) + + # Expect two levels, first with 5 segments and the second with 4. + with pytest.warns(PendingDeprecationWarning, match="all"): + for result in [cs.allsegs, cs.allkinds]: + assert len(result) == 2 + assert len(result[0]) == 5 + assert len(result[1]) == 4 + + def test_deprecated_apis(): cs = plt.contour(np.arange(16).reshape((4, 4))) with pytest.warns(mpl.MatplotlibDeprecationWarning, match="collections"): colls = cs.collections - with pytest.warns(PendingDeprecationWarning, match="allsegs"): - assert cs.allsegs == [p.vertices for c in colls for p in c.get_paths()] - with pytest.warns(PendingDeprecationWarning, match="allkinds"): - assert cs.allkinds == [p.codes for c in colls for p in c.get_paths()] with pytest.warns(mpl.MatplotlibDeprecationWarning, match="tcolors"): assert_array_equal(cs.tcolors, [c.get_edgecolor() for c in colls]) with pytest.warns(mpl.MatplotlibDeprecationWarning, match="tlinewidths"): From 8aa0e2c6b77206a95dc854f18f941e4ca1f60261 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 10 Oct 2023 09:30:52 -0400 Subject: [PATCH 35/83] Backport PR #27043: updated api_interfaces.rst --- galleries/users_explain/figure/api_interfaces.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/galleries/users_explain/figure/api_interfaces.rst b/galleries/users_explain/figure/api_interfaces.rst index 473c808794ca..6947817e6781 100644 --- a/galleries/users_explain/figure/api_interfaces.rst +++ b/galleries/users_explain/figure/api_interfaces.rst @@ -31,7 +31,7 @@ Native Matplotlib interfaces ---------------------------- The explicit "Axes" interface -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The "Axes" interface is how Matplotlib is implemented, and many customizations and fine-tuning end up being done at this level. @@ -59,7 +59,7 @@ but before they are displayed. The implicit "pyplot" interface -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The `~.matplotlib.pyplot` module shadows most of the `~.matplotlib.axes.Axes` plotting methods to give the equivalent of From ce50576c3a75e98b0eb8e9cfddf676f00678c44d Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 10 Oct 2023 09:30:52 -0400 Subject: [PATCH 36/83] Backport PR #27043: updated api_interfaces.rst --- galleries/users_explain/figure/api_interfaces.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/galleries/users_explain/figure/api_interfaces.rst b/galleries/users_explain/figure/api_interfaces.rst index 473c808794ca..6947817e6781 100644 --- a/galleries/users_explain/figure/api_interfaces.rst +++ b/galleries/users_explain/figure/api_interfaces.rst @@ -31,7 +31,7 @@ Native Matplotlib interfaces ---------------------------- The explicit "Axes" interface -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The "Axes" interface is how Matplotlib is implemented, and many customizations and fine-tuning end up being done at this level. @@ -59,7 +59,7 @@ but before they are displayed. The implicit "pyplot" interface -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The `~.matplotlib.pyplot` module shadows most of the `~.matplotlib.axes.Axes` plotting methods to give the equivalent of From 0c9637513aea95d6c9739739d68813a712bac8ed Mon Sep 17 00:00:00 2001 From: Anvi Verma <114463178+AnviVerma27@users.noreply.github.com> Date: Wed, 4 Oct 2023 22:01:04 +0530 Subject: [PATCH 37/83] Backport PR #26995: user/project/citing updated --- doc/users/project/citing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/users/project/citing.rst b/doc/users/project/citing.rst index 2230ecf1463c..77a7449b356e 100644 --- a/doc/users/project/citing.rst +++ b/doc/users/project/citing.rst @@ -25,7 +25,7 @@ specific DOI from the list below, referring to the version used for your publica :target: https://doi.org/10.5281/zenodo.592536 By version -~~~~~~~~~~ +^^^^^^^^^^ .. START OF AUTOGENERATED From 0c4e4a8681370b5c5c819f557337a173127ababd Mon Sep 17 00:00:00 2001 From: hannah Date: Mon, 9 Oct 2023 09:58:50 -0400 Subject: [PATCH 38/83] Backport PR #27036: updated artist_intro.rst --- galleries/users_explain/artists/artist_intro.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/galleries/users_explain/artists/artist_intro.rst b/galleries/users_explain/artists/artist_intro.rst index 213a945f44b8..d23c59da631d 100644 --- a/galleries/users_explain/artists/artist_intro.rst +++ b/galleries/users_explain/artists/artist_intro.rst @@ -10,7 +10,7 @@ and :doc:`Axes <../axes/index>` are Artists, and generally contain Creating Artists -~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^ Usually we do not instantiate Artists directly, but rather use a plotting method on `~.axes.Axes`. Some examples of plotting methods and the Artist @@ -58,7 +58,7 @@ Artist via `~.Axes.get_lines()`: Line2D(example) Changing Artist properties -~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^ Getting the ``lines`` object gives us access to all the properties of the Line2D object. So if we want to change the *linewidth* after the fact, we can do so using `.Artist.set`. @@ -132,7 +132,7 @@ Note most Artists also have a distinct list of setters; e.g. `.Line2D.set_color` or `.Line2D.set_linewidth`. Changing Artist data -~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^ In addition to styling properties like *color* and *linewidth*, the Line2D object has a *data* property. You can set the data after the line has been @@ -149,7 +149,7 @@ same line is shown evolving over time (see :doc:`../animations/index`) lines[0].set_data([x, np.cos(x)]) Manually adding Artists -~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^ Not all Artists have helper methods, or you may want to use a low-level method for some reason. For example the `.patches.Circle` Artist does not have a @@ -178,7 +178,7 @@ be clipped, as is the case above for the ``clipped_circle`` patch. See :ref:`artist_reference` for other patches. Removing Artists -~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^ Sometimes we want to remove an Artist from a figure without re-specifying the whole figure from scratch. Most Artists have a usable *remove* method that From e9f14413baba3e9baf9298724e822653fd1ef866 Mon Sep 17 00:00:00 2001 From: Anvi Verma <114463178+AnviVerma27@users.noreply.github.com> Date: Wed, 4 Oct 2023 22:01:04 +0530 Subject: [PATCH 39/83] Backport PR #26995: user/project/citing updated --- doc/users/project/citing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/users/project/citing.rst b/doc/users/project/citing.rst index 2230ecf1463c..77a7449b356e 100644 --- a/doc/users/project/citing.rst +++ b/doc/users/project/citing.rst @@ -25,7 +25,7 @@ specific DOI from the list below, referring to the version used for your publica :target: https://doi.org/10.5281/zenodo.592536 By version -~~~~~~~~~~ +^^^^^^^^^^ .. START OF AUTOGENERATED From 9d56cd9380da11517abac4cf6764cc421ba72aa6 Mon Sep 17 00:00:00 2001 From: hannah Date: Mon, 9 Oct 2023 09:58:50 -0400 Subject: [PATCH 40/83] Backport PR #27036: updated artist_intro.rst --- galleries/users_explain/artists/artist_intro.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/galleries/users_explain/artists/artist_intro.rst b/galleries/users_explain/artists/artist_intro.rst index 213a945f44b8..d23c59da631d 100644 --- a/galleries/users_explain/artists/artist_intro.rst +++ b/galleries/users_explain/artists/artist_intro.rst @@ -10,7 +10,7 @@ and :doc:`Axes <../axes/index>` are Artists, and generally contain Creating Artists -~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^ Usually we do not instantiate Artists directly, but rather use a plotting method on `~.axes.Axes`. Some examples of plotting methods and the Artist @@ -58,7 +58,7 @@ Artist via `~.Axes.get_lines()`: Line2D(example) Changing Artist properties -~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^ Getting the ``lines`` object gives us access to all the properties of the Line2D object. So if we want to change the *linewidth* after the fact, we can do so using `.Artist.set`. @@ -132,7 +132,7 @@ Note most Artists also have a distinct list of setters; e.g. `.Line2D.set_color` or `.Line2D.set_linewidth`. Changing Artist data -~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^ In addition to styling properties like *color* and *linewidth*, the Line2D object has a *data* property. You can set the data after the line has been @@ -149,7 +149,7 @@ same line is shown evolving over time (see :doc:`../animations/index`) lines[0].set_data([x, np.cos(x)]) Manually adding Artists -~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^ Not all Artists have helper methods, or you may want to use a low-level method for some reason. For example the `.patches.Circle` Artist does not have a @@ -178,7 +178,7 @@ be clipped, as is the case above for the ``clipped_circle`` patch. See :ref:`artist_reference` for other patches. Removing Artists -~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^ Sometimes we want to remove an Artist from a figure without re-specifying the whole figure from scratch. Most Artists have a usable *remove* method that From 48cf3e372c84df50fda471fed77c128c2af685fb Mon Sep 17 00:00:00 2001 From: hannah Date: Tue, 10 Oct 2023 12:35:33 -0400 Subject: [PATCH 41/83] Backport PR #27054: updated interactive.rst --- galleries/users_explain/figure/interactive.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/galleries/users_explain/figure/interactive.rst b/galleries/users_explain/figure/interactive.rst index 0d94a1cf8493..a32d1a1eb847 100644 --- a/galleries/users_explain/figure/interactive.rst +++ b/galleries/users_explain/figure/interactive.rst @@ -366,7 +366,7 @@ which uses the `.backend_nbagg` backend provided by Matplotlib; however, nbagg does not work in Jupyter Lab. GUIs + Jupyter -~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^ You can also use one of the non-``ipympl`` GUI backends in a Jupyter Notebook. If you are running your Jupyter kernel locally, the GUI window will spawn on From 7e4360d096637e87153d8c22e1c5cd7426376b9d Mon Sep 17 00:00:00 2001 From: hannah Date: Tue, 10 Oct 2023 12:35:33 -0400 Subject: [PATCH 42/83] Backport PR #27054: updated interactive.rst --- galleries/users_explain/figure/interactive.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/galleries/users_explain/figure/interactive.rst b/galleries/users_explain/figure/interactive.rst index 0d94a1cf8493..a32d1a1eb847 100644 --- a/galleries/users_explain/figure/interactive.rst +++ b/galleries/users_explain/figure/interactive.rst @@ -366,7 +366,7 @@ which uses the `.backend_nbagg` backend provided by Matplotlib; however, nbagg does not work in Jupyter Lab. GUIs + Jupyter -~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^ You can also use one of the non-``ipympl`` GUI backends in a Jupyter Notebook. If you are running your Jupyter kernel locally, the GUI window will spawn on From a74551b0b85a4cfd5dd77b9613e91351a1b3578f Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 10 Oct 2023 09:26:28 -0400 Subject: [PATCH 43/83] Backport PR #27040: Bump pypa/cibuildwheel from 2.16.1 to 2.16.2 --- .github/workflows/cibuildwheel.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/cibuildwheel.yml b/.github/workflows/cibuildwheel.yml index 3fa922f404fb..7e45bafb8b55 100644 --- a/.github/workflows/cibuildwheel.yml +++ b/.github/workflows/cibuildwheel.yml @@ -139,7 +139,7 @@ jobs: path: dist/ - name: Build wheels for CPython 3.12 - uses: pypa/cibuildwheel@7da7df1efc530f07d1945c00934b8cfd34be0d50 # v2.16.1 + uses: pypa/cibuildwheel@fff9ec32ed25a9c576750c91e06b410ed0c15db7 # v2.16.2 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -161,7 +161,7 @@ jobs: pip install --pre "numpy>=1.25" - name: Build wheels for CPython 3.11 - uses: pypa/cibuildwheel@7da7df1efc530f07d1945c00934b8cfd34be0d50 # v2.16.1 + uses: pypa/cibuildwheel@fff9ec32ed25a9c576750c91e06b410ed0c15db7 # v2.16.2 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -169,7 +169,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.10 - uses: pypa/cibuildwheel@7da7df1efc530f07d1945c00934b8cfd34be0d50 # v2.16.1 + uses: pypa/cibuildwheel@fff9ec32ed25a9c576750c91e06b410ed0c15db7 # v2.16.2 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -177,7 +177,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.9 - uses: pypa/cibuildwheel@7da7df1efc530f07d1945c00934b8cfd34be0d50 # v2.16.1 + uses: pypa/cibuildwheel@fff9ec32ed25a9c576750c91e06b410ed0c15db7 # v2.16.2 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -185,7 +185,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for PyPy - uses: pypa/cibuildwheel@7da7df1efc530f07d1945c00934b8cfd34be0d50 # v2.16.1 + uses: pypa/cibuildwheel@fff9ec32ed25a9c576750c91e06b410ed0c15db7 # v2.16.2 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: From 00d1f2507fbb208c8467257c0087f76180106c75 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Wed, 11 Oct 2023 07:04:50 +0200 Subject: [PATCH 44/83] Backport PR #27059: ci: Clean up Python 3.12 builds --- .github/workflows/cibuildwheel.yml | 14 -------------- .github/workflows/tests.yml | 16 ++++++---------- 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/.github/workflows/cibuildwheel.yml b/.github/workflows/cibuildwheel.yml index 7e45bafb8b55..217c5d88f16e 100644 --- a/.github/workflows/cibuildwheel.yml +++ b/.github/workflows/cibuildwheel.yml @@ -145,20 +145,6 @@ jobs: env: CIBW_BUILD: "cp312-*" CIBW_ARCHS: ${{ matrix.cibw_archs }} - # Remove this once NumPy with Python 3.12 wheels is not pre-release. - CIBW_BEFORE_BUILD: >- - pip install certifi "pybind11>=2.6" "setuptools>=42" "setuptools_scm>=7" && - pip install --pre "numpy>=1.25" && - rm -rf {package}/build - CIBW_BEFORE_BUILD_WINDOWS: >- - pip install certifi delvewheel "pybind11>=2.6" "setuptools>=42" "setuptools_scm>=7" && - pip install --pre "numpy>=1.25" && - rm -rf {package}/build - CIBW_ENVIRONMENT: PIP_NO_BUILD_ISOLATION=0 - # Remove this once contourpy has Python 3.12 wheels. - CIBW_BEFORE_TEST: >- - pip install "meson>=1.2.0" "meson-python>=0.13.1" "ninja" "pybind11>=2.10.4" && - pip install --pre "numpy>=1.25" - name: Build wheels for CPython 3.11 uses: pypa/cibuildwheel@fff9ec32ed25a9c576750c91e06b410ed0c15db7 # v2.16.2 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 04ee474a1451..0a81e7212a00 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -78,10 +78,8 @@ jobs: pyside6-ver: '!=6.5.1' extra-requirements: '-r requirements/testing/extra.txt' - os: ubuntu-22.04 - python-version: '3.12-dev' + python-version: '3.12' pyside6-ver: '!=6.5.1' - pre: true - no-build-isolation: true - os: macos-latest python-version: 3.9 # https://bugreports.qt.io/projects/PYSIDE/issues/PYSIDE-2346 @@ -196,10 +194,8 @@ jobs: python -m pip install --upgrade pip setuptools wheel # Install pre-release versions during our weekly upcoming dependency tests. - # Also install for 3.12 to get working NumPy (remove when 1.26 is released) - if [[ "${{ github.event_name == 'schedule' && - matrix.name-suffix != '(Minimum Versions)' }}" = "true" - || "${{ matrix.pre }}" = "true" ]]; then + if [[ "${{ github.event_name }}" == 'schedule' + && "${{ matrix.name-suffix }}" != '(Minimum Versions)' ]]; then PRE="--pre" fi @@ -244,7 +240,7 @@ jobs: echo 'PyQt5 is available' || echo 'PyQt5 is not available' if [[ "${{ runner.os }}" != 'macOS' - && "${{ matrix.python-version != '3.12-dev'}}" = "true" ]]; then + && "${{ matrix.python-version }}" != '3.12' ]]; then python -mpip install --upgrade pyside2${{ matrix.pyside2-ver }} && python -c 'import PySide2.QtCore' && echo 'PySide2 is available' || @@ -257,14 +253,14 @@ jobs: echo 'PyQt6 is not available' fi if [[ "${{ runner.os }}" != 'macOS' - && "${{ matrix.python-version != '3.12-dev'}}" = "true" ]]; then + && "${{ matrix.python-version }}" != '3.12' ]]; then python -mpip install --upgrade pyside6${{ matrix.pyside6-ver }} && python -c 'import PySide6.QtCore' && echo 'PySide6 is available' || echo 'PySide6 is not available' fi - if [[ "${{ matrix.python-version != '3.12-dev'}}" = "true" ]]; then + if [[ "${{ matrix.python-version }}" != '3.12' ]]; then python -mpip install --upgrade \ -f "https://extras.wxpython.org/wxPython4/extras/linux/gtk3/${{ matrix.os }}" \ wxPython && From 907538073c392dbeea9a8807c72f01349902033c Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Wed, 11 Oct 2023 15:02:29 -0500 Subject: [PATCH 45/83] Backport PR #26943: ci: Run mypy against typed cycler --- .github/workflows/reviewdog.yml | 2 -- pyproject.toml | 1 - 2 files changed, 3 deletions(-) diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml index dafc331a11eb..f9c1121581c0 100644 --- a/.github/workflows/reviewdog.yml +++ b/.github/workflows/reviewdog.yml @@ -65,9 +65,7 @@ jobs: REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | set -o pipefail - # The --ignore-missing-imports can be removed when typed cycler is released and used mypy --config pyproject.toml lib/matplotlib \ - --ignore-missing-imports \ --follow-imports silent | \ reviewdog -f=mypy -name=mypy \ -tee -reporter=github-check -filter-mode nofilter diff --git a/pyproject.toml b/pyproject.toml index 67f1805cda08..7131609c633a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -143,7 +143,6 @@ exclude = [ # stubtest will import and run, opening a figure if not excluded ".*/tinypages", ] -ignore_missing_imports = true enable_incomplete_feature = [ "Unpack", ] From 19f0d796dbf616a65eec594051a74b853505df84 Mon Sep 17 00:00:00 2001 From: Gurudatta Shanbhag Date: Sun, 15 Oct 2023 19:39:30 +0530 Subject: [PATCH 46/83] Backport PR #27093: [Doc]: Move Automated Tests section to workflow docs #26998 --- doc/devel/coding_guide.rst | 50 +-------------------------- doc/devel/development_workflow.rst | 54 ++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 49 deletions(-) diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index 8e2a0aa7df4b..49f35e3ad13e 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -339,55 +339,7 @@ Merging Automated tests --------------- - -Whenever a pull request is created or updated, various automated test tools -will run on all supported platforms and versions of Python. - -* Make sure the Linting, GitHub Actions, AppVeyor, CircleCI, and Azure - pipelines are passing before merging (All checks are listed at the bottom of - the GitHub page of your pull request). Here are some tips for finding the - cause of the test failure: - - - If *Linting* fails, you have a code style issue, which will be listed - as annotations on the pull request's diff. - - If *Mypy* or *Stubtest* fails, you have inconsistency in type hints, which - will be listed as annotations in the diff. - - If a GitHub Actions or AppVeyor run fails, search the log for ``FAILURES``. - The subsequent section will contain information on the failed tests. - - If CircleCI fails, likely you have some reStructuredText style issue in - the docs. Search the CircleCI log for ``WARNING``. - - If Azure pipelines fail with an image comparison error, you can find the - images as *artifacts* of the Azure job: - - - Click *Details* on the check on the GitHub PR page. - - Click *View more details on Azure Pipelines* to go to Azure. - - On the overview page *artifacts* are listed in the section *Related*. - - -* Codecov and CodeQL are currently for information only. Their failure is not - necessarily a blocker. - -* tox_ is not used in the automated testing. It is supported for testing - locally. - - .. _tox: https://tox.readthedocs.io/ - -* If you know only a subset of CIs need to be run, this can be controlled on - individual commits by including the following substrings in commit messages: - - - ``[ci doc]``: restrict the CI to documentation checks. For when you only - changed documentation (this skip is automatic if the changes are only under - ``doc/`` or ``galleries/``). - - ``[skip circle]``: skip the documentation build check. For when you didn't - change documentation. - - Unit tests can be turned off for individual platforms with - - - ``[skip actions]``: GitHub Actions - - ``[skip appveyor]`` (must be in the first line of the commit): AppVeyor - - ``[skip azp]``: Azure Pipelines - - - ``[skip ci]``: skip all CIs. Use this only if you know your changes do not - need to be tested at all, which is very rare. +Before being merged, a PR should pass the :ref:`automated-tests`. If you are unsure why a test is failing, ask on the PR or in our `chat space `_ .. _pr-squashing: diff --git a/doc/devel/development_workflow.rst b/doc/devel/development_workflow.rst index c03dab47c759..addc4315b94a 100644 --- a/doc/devel/development_workflow.rst +++ b/doc/devel/development_workflow.rst @@ -426,3 +426,57 @@ thought it was. Be judicious with force-pushing. It is effectively re-writing published history, and if anyone has fetched the old commits, it will have a different view of history which can cause confusion. + +.. _automated-tests: + +Automated tests +--------------- + +Whenever a pull request is created or updated, various automated test tools +will run on all supported platforms and versions of Python. + +* Make sure the Linting, GitHub Actions, AppVeyor, CircleCI, and Azure + pipelines are passing before merging (All checks are listed at the bottom of + the GitHub page of your pull request). Here are some tips for finding the + cause of the test failure: + + - If *Linting* fails, you have a code style issue, which will be listed + as annotations on the pull request's diff. + - If *Mypy* or *Stubtest* fails, you have inconsistency in type hints, which + will be listed as annotations in the diff. + - If a GitHub Actions or AppVeyor run fails, search the log for ``FAILURES``. + The subsequent section will contain information on the failed tests. + - If CircleCI fails, likely you have some reStructuredText style issue in + the docs. Search the CircleCI log for ``WARNING``. + - If Azure pipelines fail with an image comparison error, you can find the + images as *artifacts* of the Azure job: + + - Click *Details* on the check on the GitHub PR page. + - Click *View more details on Azure Pipelines* to go to Azure. + - On the overview page *artifacts* are listed in the section *Related*. + + +* Codecov and CodeQL are currently for information only. Their failure is not + necessarily a blocker. + +* tox_ is not used in the automated testing. It is supported for testing + locally. + + .. _tox: https://tox.readthedocs.io/ + +* If you know only a subset of CIs need to be run, this can be controlled on + individual commits by including the following substrings in commit messages: + + - ``[ci doc]``: restrict the CI to documentation checks. For when you only + changed documentation (this skip is automatic if the changes are only under + ``doc/`` or ``galleries/``). + - ``[skip circle]``: skip the documentation build check. For when you didn't + change documentation. + - Unit tests can be turned off for individual platforms with + + - ``[skip actions]``: GitHub Actions + - ``[skip appveyor]`` (must be in the first line of the commit): AppVeyor + - ``[skip azp]``: Azure Pipelines + + - ``[skip ci]``: skip all CIs. Use this only if you know your changes do not + need to be tested at all, which is very rare. From b4f0f473e546a244ca0f4a1df039a3bb4b1ca0cb Mon Sep 17 00:00:00 2001 From: Gurudatta Shanbhag Date: Sun, 15 Oct 2023 19:39:30 +0530 Subject: [PATCH 47/83] Backport PR #27093: [Doc]: Move Automated Tests section to workflow docs #26998 --- doc/devel/coding_guide.rst | 50 +-------------------------- doc/devel/development_workflow.rst | 54 ++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 49 deletions(-) diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index 8e2a0aa7df4b..49f35e3ad13e 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -339,55 +339,7 @@ Merging Automated tests --------------- - -Whenever a pull request is created or updated, various automated test tools -will run on all supported platforms and versions of Python. - -* Make sure the Linting, GitHub Actions, AppVeyor, CircleCI, and Azure - pipelines are passing before merging (All checks are listed at the bottom of - the GitHub page of your pull request). Here are some tips for finding the - cause of the test failure: - - - If *Linting* fails, you have a code style issue, which will be listed - as annotations on the pull request's diff. - - If *Mypy* or *Stubtest* fails, you have inconsistency in type hints, which - will be listed as annotations in the diff. - - If a GitHub Actions or AppVeyor run fails, search the log for ``FAILURES``. - The subsequent section will contain information on the failed tests. - - If CircleCI fails, likely you have some reStructuredText style issue in - the docs. Search the CircleCI log for ``WARNING``. - - If Azure pipelines fail with an image comparison error, you can find the - images as *artifacts* of the Azure job: - - - Click *Details* on the check on the GitHub PR page. - - Click *View more details on Azure Pipelines* to go to Azure. - - On the overview page *artifacts* are listed in the section *Related*. - - -* Codecov and CodeQL are currently for information only. Their failure is not - necessarily a blocker. - -* tox_ is not used in the automated testing. It is supported for testing - locally. - - .. _tox: https://tox.readthedocs.io/ - -* If you know only a subset of CIs need to be run, this can be controlled on - individual commits by including the following substrings in commit messages: - - - ``[ci doc]``: restrict the CI to documentation checks. For when you only - changed documentation (this skip is automatic if the changes are only under - ``doc/`` or ``galleries/``). - - ``[skip circle]``: skip the documentation build check. For when you didn't - change documentation. - - Unit tests can be turned off for individual platforms with - - - ``[skip actions]``: GitHub Actions - - ``[skip appveyor]`` (must be in the first line of the commit): AppVeyor - - ``[skip azp]``: Azure Pipelines - - - ``[skip ci]``: skip all CIs. Use this only if you know your changes do not - need to be tested at all, which is very rare. +Before being merged, a PR should pass the :ref:`automated-tests`. If you are unsure why a test is failing, ask on the PR or in our `chat space `_ .. _pr-squashing: diff --git a/doc/devel/development_workflow.rst b/doc/devel/development_workflow.rst index c03dab47c759..addc4315b94a 100644 --- a/doc/devel/development_workflow.rst +++ b/doc/devel/development_workflow.rst @@ -426,3 +426,57 @@ thought it was. Be judicious with force-pushing. It is effectively re-writing published history, and if anyone has fetched the old commits, it will have a different view of history which can cause confusion. + +.. _automated-tests: + +Automated tests +--------------- + +Whenever a pull request is created or updated, various automated test tools +will run on all supported platforms and versions of Python. + +* Make sure the Linting, GitHub Actions, AppVeyor, CircleCI, and Azure + pipelines are passing before merging (All checks are listed at the bottom of + the GitHub page of your pull request). Here are some tips for finding the + cause of the test failure: + + - If *Linting* fails, you have a code style issue, which will be listed + as annotations on the pull request's diff. + - If *Mypy* or *Stubtest* fails, you have inconsistency in type hints, which + will be listed as annotations in the diff. + - If a GitHub Actions or AppVeyor run fails, search the log for ``FAILURES``. + The subsequent section will contain information on the failed tests. + - If CircleCI fails, likely you have some reStructuredText style issue in + the docs. Search the CircleCI log for ``WARNING``. + - If Azure pipelines fail with an image comparison error, you can find the + images as *artifacts* of the Azure job: + + - Click *Details* on the check on the GitHub PR page. + - Click *View more details on Azure Pipelines* to go to Azure. + - On the overview page *artifacts* are listed in the section *Related*. + + +* Codecov and CodeQL are currently for information only. Their failure is not + necessarily a blocker. + +* tox_ is not used in the automated testing. It is supported for testing + locally. + + .. _tox: https://tox.readthedocs.io/ + +* If you know only a subset of CIs need to be run, this can be controlled on + individual commits by including the following substrings in commit messages: + + - ``[ci doc]``: restrict the CI to documentation checks. For when you only + changed documentation (this skip is automatic if the changes are only under + ``doc/`` or ``galleries/``). + - ``[skip circle]``: skip the documentation build check. For when you didn't + change documentation. + - Unit tests can be turned off for individual platforms with + + - ``[skip actions]``: GitHub Actions + - ``[skip appveyor]`` (must be in the first line of the commit): AppVeyor + - ``[skip azp]``: Azure Pipelines + + - ``[skip ci]``: skip all CIs. Use this only if you know your changes do not + need to be tested at all, which is very rare. From bffa66f0a983296e80c326d9896ddfc627e63176 Mon Sep 17 00:00:00 2001 From: hannah Date: Sun, 15 Oct 2023 16:34:13 -0400 Subject: [PATCH 48/83] Backport PR #27096: make fonts.py, mathtext.py, text_intro.py confirm to docs guidelines --- galleries/users_explain/text/fonts.py | 4 ++-- galleries/users_explain/text/mathtext.py | 2 +- galleries/users_explain/text/text_intro.py | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/galleries/users_explain/text/fonts.py b/galleries/users_explain/text/fonts.py index fdb2de82ff5c..7efb9a00aa09 100644 --- a/galleries/users_explain/text/fonts.py +++ b/galleries/users_explain/text/fonts.py @@ -73,7 +73,7 @@ - Limited support with Matplotlib Font subsetting -~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^ The PDF and PostScript formats support embedding fonts in files, allowing the display program to correctly render the text, independent of what fonts are @@ -93,7 +93,7 @@ Currently Type 3, Type 42, and TrueType fonts are subsetted. Type 1 fonts are not. Core Fonts -~~~~~~~~~~ +^^^^^^^^^^ In addition to the ability to embed fonts, as part of the `PostScript `_ and `PDF diff --git a/galleries/users_explain/text/mathtext.py b/galleries/users_explain/text/mathtext.py index bbd1814d567d..99fee1af3247 100644 --- a/galleries/users_explain/text/mathtext.py +++ b/galleries/users_explain/text/mathtext.py @@ -287,7 +287,7 @@ # (not minus). # # Custom fonts -# ~~~~~~~~~~~~ +# ^^^^^^^^^^^^ # Mathtext also provides a way to use custom fonts for math. This method is # fairly tricky to use, and should be considered an experimental feature for # patient users only. By setting :rc:`mathtext.fontset` to ``custom``, diff --git a/galleries/users_explain/text/text_intro.py b/galleries/users_explain/text/text_intro.py index eccd584ce36f..54fcb00c7a86 100644 --- a/galleries/users_explain/text/text_intro.py +++ b/galleries/users_explain/text/text_intro.py @@ -238,7 +238,7 @@ # locations, and how they are labelled. # # Terminology -# ~~~~~~~~~~~ +# ^^^^^^^^^^^ # # *Axes* have an `matplotlib.axis.Axis` object for the ``ax.xaxis`` and # ``ax.yaxis`` that contain the information about how the labels in the axis @@ -254,7 +254,7 @@ # that format the tick labels. # # Simple ticks -# ~~~~~~~~~~~~ +# ^^^^^^^^^^^^ # # It is often convenient to simply define the # tick values, and sometimes the tick labels, overriding the default @@ -287,7 +287,7 @@ # %% # Tick Locators and Formatters -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # # Instead of making a list of all the ticklabels, we could have # used `matplotlib.ticker.StrMethodFormatter` (new-style ``str.format()`` @@ -380,7 +380,7 @@ def formatoddticks(x, pos): # %% # Dateticks -# ~~~~~~~~~ +# ^^^^^^^^^ # # Matplotlib can accept `datetime.datetime` and `numpy.datetime64` # objects as plotting arguments. Dates and times require special From 0e0de491413bdecf81d92ca847dd3180f83674cb Mon Sep 17 00:00:00 2001 From: hannah Date: Sun, 15 Oct 2023 16:34:13 -0400 Subject: [PATCH 49/83] Backport PR #27096: make fonts.py, mathtext.py, text_intro.py confirm to docs guidelines --- galleries/users_explain/text/fonts.py | 4 ++-- galleries/users_explain/text/mathtext.py | 2 +- galleries/users_explain/text/text_intro.py | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/galleries/users_explain/text/fonts.py b/galleries/users_explain/text/fonts.py index fdb2de82ff5c..7efb9a00aa09 100644 --- a/galleries/users_explain/text/fonts.py +++ b/galleries/users_explain/text/fonts.py @@ -73,7 +73,7 @@ - Limited support with Matplotlib Font subsetting -~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^ The PDF and PostScript formats support embedding fonts in files, allowing the display program to correctly render the text, independent of what fonts are @@ -93,7 +93,7 @@ Currently Type 3, Type 42, and TrueType fonts are subsetted. Type 1 fonts are not. Core Fonts -~~~~~~~~~~ +^^^^^^^^^^ In addition to the ability to embed fonts, as part of the `PostScript `_ and `PDF diff --git a/galleries/users_explain/text/mathtext.py b/galleries/users_explain/text/mathtext.py index 09c049d4a833..bb17fabc3560 100644 --- a/galleries/users_explain/text/mathtext.py +++ b/galleries/users_explain/text/mathtext.py @@ -283,7 +283,7 @@ # (not minus). # # Custom fonts -# ~~~~~~~~~~~~ +# ^^^^^^^^^^^^ # Mathtext also provides a way to use custom fonts for math. This method is # fairly tricky to use, and should be considered an experimental feature for # patient users only. By setting :rc:`mathtext.fontset` to ``custom``, diff --git a/galleries/users_explain/text/text_intro.py b/galleries/users_explain/text/text_intro.py index eccd584ce36f..54fcb00c7a86 100644 --- a/galleries/users_explain/text/text_intro.py +++ b/galleries/users_explain/text/text_intro.py @@ -238,7 +238,7 @@ # locations, and how they are labelled. # # Terminology -# ~~~~~~~~~~~ +# ^^^^^^^^^^^ # # *Axes* have an `matplotlib.axis.Axis` object for the ``ax.xaxis`` and # ``ax.yaxis`` that contain the information about how the labels in the axis @@ -254,7 +254,7 @@ # that format the tick labels. # # Simple ticks -# ~~~~~~~~~~~~ +# ^^^^^^^^^^^^ # # It is often convenient to simply define the # tick values, and sometimes the tick labels, overriding the default @@ -287,7 +287,7 @@ # %% # Tick Locators and Formatters -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # # Instead of making a list of all the ticklabels, we could have # used `matplotlib.ticker.StrMethodFormatter` (new-style ``str.format()`` @@ -380,7 +380,7 @@ def formatoddticks(x, pos): # %% # Dateticks -# ~~~~~~~~~ +# ^^^^^^^^^ # # Matplotlib can accept `datetime.datetime` and `numpy.datetime64` # objects as plotting arguments. Dates and times require special From c6a570d0b5c5b5a5e9368fc3eb2aa32ccc53c7cc Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Mon, 16 Oct 2023 23:55:49 -0400 Subject: [PATCH 50/83] Backport PR #27039: Formatted docs --- doc/users/project/index.rst | 2 +- doc/users/release_notes.rst | 39 +++++++++++++++++++------------------ 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/doc/users/project/index.rst b/doc/users/project/index.rst index 80dd6e27bc3d..ad55576190ab 100644 --- a/doc/users/project/index.rst +++ b/doc/users/project/index.rst @@ -1,7 +1,7 @@ .. redirect-from:: /users/backmatter Project information -------------------- +=================== .. toctree:: :maxdepth: 2 diff --git a/doc/users/release_notes.rst b/doc/users/release_notes.rst index 1d281543b76c..7862305af65e 100644 --- a/doc/users/release_notes.rst +++ b/doc/users/release_notes.rst @@ -13,7 +13,7 @@ Release notes Version 3.8 -=========== +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -22,7 +22,7 @@ Version 3.8 github_stats.rst Version 3.7 -=========== +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -34,7 +34,7 @@ Version 3.7 prev_whats_new/github_stats_3.7.0.rst Version 3.6 -=========== +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -47,7 +47,7 @@ Version 3.6 prev_whats_new/github_stats_3.6.0.rst Version 3.5 -=========== +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -62,7 +62,7 @@ Version 3.5 prev_whats_new/github_stats_3.5.0.rst Version 3.4 -=========== +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -72,11 +72,12 @@ Version 3.4 prev_whats_new/github_stats_3.4.1.rst prev_whats_new/github_stats_3.4.0.rst +============= Past versions ============= Version 3.3 -~~~~~~~~~~~ +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -90,7 +91,7 @@ Version 3.3 prev_whats_new/github_stats_3.3.0.rst Version 3.2 -~~~~~~~~~~~ +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -101,7 +102,7 @@ Version 3.2 prev_whats_new/github_stats_3.2.0.rst Version 3.1 -~~~~~~~~~~~ +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -114,7 +115,7 @@ Version 3.1 prev_whats_new/github_stats_3.1.0.rst Version 3.0 -~~~~~~~~~~~ +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -127,7 +128,7 @@ Version 3.0 prev_whats_new/github_stats_3.0.0.rst Version 2.2 -~~~~~~~~~~~ +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -135,7 +136,7 @@ Version 2.2 ../api/prev_api_changes/api_changes_2.2.0.rst Version 2.1 -~~~~~~~~~~~ +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -145,7 +146,7 @@ Version 2.1 ../api/prev_api_changes/api_changes_2.1.0.rst Version 2.0 -~~~~~~~~~~~ +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -154,7 +155,7 @@ Version 2.0 ../api/prev_api_changes/api_changes_2.0.0.rst Version 1.5 -~~~~~~~~~~~ +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -164,7 +165,7 @@ Version 1.5 ../api/prev_api_changes/api_changes_1.5.0.rst Version 1.4 -~~~~~~~~~~~ +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -172,7 +173,7 @@ Version 1.4 ../api/prev_api_changes/api_changes_1.4.x.rst Version 1.3 -~~~~~~~~~~~ +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -180,7 +181,7 @@ Version 1.3 ../api/prev_api_changes/api_changes_1.3.x.rst Version 1.2 -~~~~~~~~~~~ +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -189,7 +190,7 @@ Version 1.2 ../api/prev_api_changes/api_changes_1.2.x.rst Version 1.1 -~~~~~~~~~~~ +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 @@ -197,14 +198,14 @@ Version 1.1 ../api/prev_api_changes/api_changes_1.1.x.rst Version 1.0 -~~~~~~~~~~~ +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 prev_whats_new/whats_new_1.0.rst Version 0.x -~~~~~~~~~~~ +^^^^^^^^^^^ .. toctree:: :maxdepth: 1 From 1ed30d033847240093072b714447c33bf616e1ae Mon Sep 17 00:00:00 2001 From: wemi3 <62965919+wemi3@users.noreply.github.com> Date: Tue, 17 Oct 2023 08:27:28 -0700 Subject: [PATCH 51/83] Backport PR #26930: Added documentation on getting full list of registered colormaps re: issue #26244 --- galleries/users_explain/colors/colormaps.py | 5 +++++ lib/matplotlib/cm.py | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/galleries/users_explain/colors/colormaps.py b/galleries/users_explain/colors/colormaps.py index a38dd2af0fc9..92b56d298976 100644 --- a/galleries/users_explain/colors/colormaps.py +++ b/galleries/users_explain/colors/colormaps.py @@ -15,6 +15,11 @@ help on creating your own colormaps, see :ref:`colormap-manipulation`. +To get a list of all registered colormaps, you can do:: + + from matplotlib import colormaps + list(colormaps) + Overview ======== diff --git a/lib/matplotlib/cm.py b/lib/matplotlib/cm.py index a2cd3788114d..3911986f3673 100644 --- a/lib/matplotlib/cm.py +++ b/lib/matplotlib/cm.py @@ -74,6 +74,11 @@ class ColormapRegistry(Mapping): Additional colormaps can be added via `.ColormapRegistry.register`:: mpl.colormaps.register(my_colormap) + + To get a list of all registered colormaps, you can do:: + + from matplotlib import colormaps + list(colormaps) """ def __init__(self, cmaps): self._cmaps = cmaps From 214ebb0299cc18e077c255f8da5493a45982e118 Mon Sep 17 00:00:00 2001 From: 0taj <89607583+0taj@users.noreply.github.com> Date: Tue, 17 Oct 2023 21:23:54 -0400 Subject: [PATCH 52/83] Backport PR #27118: Update developer release guide to follow conventions --- doc/devel/release_guide.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/devel/release_guide.rst b/doc/devel/release_guide.rst index fe7c1022e038..2bbe589282a3 100644 --- a/doc/devel/release_guide.rst +++ b/doc/devel/release_guide.rst @@ -157,7 +157,7 @@ Update release notes -------------------- What's new -~~~~~~~~~~ +^^^^^^^^^^ *Only needed for major and minor releases. Bugfix releases should not have new features.* @@ -167,7 +167,7 @@ file :file:`doc/users/prev_whats_new/whats_new_{X}.{Y}.0.rst` and delete the ind files. API changes -~~~~~~~~~~~ +^^^^^^^^^^^ *Primarily needed for major and minor releases. We may sometimes have API changes in bugfix releases.* @@ -177,7 +177,7 @@ file :file:`doc/api/prev_api_changes/api_changes_{X}.{Y}.{Z}.rst` and delete the individual files. Release notes TOC -~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^ Update :file:`doc/users/release_notes.rst`: @@ -202,7 +202,7 @@ Update :file:`doc/users/release_notes.rst`: prev_whats_new/github_stats_X.Y.Z.rst Update version switcher -~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^ Update ``doc/_static/switcher.json``: From 2bb600324ffca9e63551b9ec44bfcde05433bd16 Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Wed, 18 Oct 2023 07:55:53 +0100 Subject: [PATCH 53/83] Backport PR #27132: changed automated tests from subsection to section in workflow --- doc/devel/development_workflow.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/devel/development_workflow.rst b/doc/devel/development_workflow.rst index addc4315b94a..50170ee4ade3 100644 --- a/doc/devel/development_workflow.rst +++ b/doc/devel/development_workflow.rst @@ -430,7 +430,7 @@ of history which can cause confusion. .. _automated-tests: Automated tests ---------------- +=============== Whenever a pull request is created or updated, various automated test tools will run on all supported platforms and versions of Python. From 2aa38b2ca65ae237e13e6903687c7f28e9f37e33 Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Wed, 18 Oct 2023 07:55:53 +0100 Subject: [PATCH 54/83] Backport PR #27132: changed automated tests from subsection to section in workflow --- doc/devel/development_workflow.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/devel/development_workflow.rst b/doc/devel/development_workflow.rst index addc4315b94a..50170ee4ade3 100644 --- a/doc/devel/development_workflow.rst +++ b/doc/devel/development_workflow.rst @@ -430,7 +430,7 @@ of history which can cause confusion. .. _automated-tests: Automated tests ---------------- +=============== Whenever a pull request is created or updated, various automated test tools will run on all supported platforms and versions of Python. From d61da0580e41da822cf9da742c87ebf3aa07951d Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:35:19 +0200 Subject: [PATCH 55/83] Backport PR #27153: Link xkcd color survey in named colors example --- galleries/examples/color/named_colors.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/galleries/examples/color/named_colors.py b/galleries/examples/color/named_colors.py index 0181e0f06742..9ae4ec4957f3 100644 --- a/galleries/examples/color/named_colors.py +++ b/galleries/examples/color/named_colors.py @@ -101,8 +101,10 @@ def plot_colortable(colors, *, ncols=4, sort_colors=True): # ----------- # XKCD Colors # ----------- -# XKCD colors are supported, but they produce a large figure, so we skip them -# for now. You can use the following code if desired:: +# Matplotlib supports colors from the +# `xkcd color survey `_, e.g. ``"xkcd:sky blue"``. Since +# this contains almost 1000 colors, a figure of this would be very large and is thus +# omitted here. You can use the following code to generate the overview yourself :: # # xkcd_fig = plot_colortable(mcolors.XKCD_COLORS) # xkcd_fig.savefig("XKCD_Colors.png") From 16b2e0f9a274125c4819db62a93a4136cef347e4 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:35:19 +0200 Subject: [PATCH 56/83] Backport PR #27153: Link xkcd color survey in named colors example --- galleries/examples/color/named_colors.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/galleries/examples/color/named_colors.py b/galleries/examples/color/named_colors.py index 0181e0f06742..9ae4ec4957f3 100644 --- a/galleries/examples/color/named_colors.py +++ b/galleries/examples/color/named_colors.py @@ -101,8 +101,10 @@ def plot_colortable(colors, *, ncols=4, sort_colors=True): # ----------- # XKCD Colors # ----------- -# XKCD colors are supported, but they produce a large figure, so we skip them -# for now. You can use the following code if desired:: +# Matplotlib supports colors from the +# `xkcd color survey `_, e.g. ``"xkcd:sky blue"``. Since +# this contains almost 1000 colors, a figure of this would be very large and is thus +# omitted here. You can use the following code to generate the overview yourself :: # # xkcd_fig = plot_colortable(mcolors.XKCD_COLORS) # xkcd_fig.savefig("XKCD_Colors.png") From 916e39d9225bded716b3bfd35d4fed06604d657c Mon Sep 17 00:00:00 2001 From: hannah Date: Wed, 25 Oct 2023 13:29:09 -0400 Subject: [PATCH 57/83] Backport PR #27189: Fix typo in docstring of `matplotlib.colors.from_levels_and_colors` --- lib/matplotlib/colors.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 211286dec7da..bd89e70049c3 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -2725,8 +2725,8 @@ def from_levels_and_colors(levels, colors, extend='neither'): Returns ------- - cmap : `~matplotlib.colors.Normalize` - norm : `~matplotlib.colors.Colormap` + cmap : `~matplotlib.colors.Colormap` + norm : `~matplotlib.colors.Normalize` """ slice_map = { 'both': slice(1, -1), From cd46813c79b42816820868a02295069bb3142772 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Wed, 25 Oct 2023 16:43:09 -0400 Subject: [PATCH 58/83] Backport PR #27045: Ensure valid path mangling for ContourLabeler --- lib/matplotlib/contour.py | 16 +++++-- .../contour_disconnected_segments.png | Bin 0 -> 9795 bytes lib/matplotlib/tests/test_contour.py | 39 ++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_contour/contour_disconnected_segments.png diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index 2725dd6340a4..f1b6597b2460 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -350,6 +350,11 @@ def _split_path_and_get_label_rotation(self, path, idx, screen_pos, lw, spacing= taken into account when breaking the path, but not when computing the angle. """ if hasattr(self, "_old_style_split_collections"): + vis = False + for coll in self._old_style_split_collections: + vis |= coll.get_visible() + coll.remove() + self.set_visible(vis) del self._old_style_split_collections # Invalidate them. xys = path.vertices @@ -383,7 +388,7 @@ def _split_path_and_get_label_rotation(self, path, idx, screen_pos, lw, spacing= # If the path is closed, rotate it s.t. it starts at the label. is_closed_path = codes[stop - 1] == Path.CLOSEPOLY if is_closed_path: - cc_xys = np.concatenate([xys[idx:-1], xys[:idx+1]]) + cc_xys = np.concatenate([cc_xys[idx:-1], cc_xys[:idx+1]]) idx = 0 # Like np.interp, but additionally vectorized over fp. @@ -418,8 +423,13 @@ def interp_vec(x, xp, fp): return [np.interp(x, xp, col) for col in fp.T] new_code_blocks = [] if is_closed_path: if i0 != -1 and i1 != -1: - new_xy_blocks.extend([[(x1, y1)], cc_xys[i1:i0+1], [(x0, y0)]]) - new_code_blocks.extend([[Path.MOVETO], [Path.LINETO] * (i0 + 2 - i1)]) + # This is probably wrong in the case that the entire contour would + # be discarded, but ensures that a valid path is returned and is + # consistent with behavior of mpl <3.8 + points = cc_xys[i1:i0+1] + new_xy_blocks.extend([[(x1, y1)], points, [(x0, y0)]]) + nlines = len(points) + 1 + new_code_blocks.extend([[Path.MOVETO], [Path.LINETO] * nlines]) else: if i0 != -1: new_xy_blocks.extend([cc_xys[:i0 + 1], [(x0, y0)]]) diff --git a/lib/matplotlib/tests/baseline_images/test_contour/contour_disconnected_segments.png b/lib/matplotlib/tests/baseline_images/test_contour/contour_disconnected_segments.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb700e09de290f6c07c280904551e2b25114382 GIT binary patch literal 9795 zcmeHtcTkhr{&&<>)`IAI(FGLT6-A{9C_SLEiii;RA{~h=O=^VD5+Jdxx|W4C2uO{J zf^?*XP!bfS7ZF3~ks1Od0g@2Xe<%Cfz4QKk-+5==xpQZD9+-#cyy!DUBV z#citFAP|V6-G!h234v_934v_*`t26*l5h@aqx+{5sHWk z4f^F^jDI9D2oY|iXQp>T&(A;R|dkx5RrlUzngo)!3S0*ol`L{hcnq^SOW9-q~fiGe2)*US8gv?G^(OYSCj`DlVTk-n{um ziT}@g&kgR~CEjq={bI-qyRaV|QaGYRyUukE;c8)@*@6lCY*h0UN^AdthbJuec$%@D0$zAbDcjpFRwEq-){kf0-8tvck=l|zMlP?dV z-G+qqb@J#A-R$!CgCV8VXAZVI`+j@UQpsqaR1x<6ZuFdlr5vi<9~Bk#DlsBnsN`mV z&3)uCYB-(TH&b}Oz`yfVP=+B2J=YW78*g20bN&Fq)_5%Hj`Hf_#xB>Zr7p$J(4P>L z&!2Ii)SNUiDR}YX#X`ha#gV-=v$-LxJ|2A>r=VrEn%}oLT8_x99jY+eMo>@NedvDR z09eJEFr>86hmn?)lw>JremaKiNmMcXMY0s%%^H{H>NlOxhru!@l+oaxmI1R&U;D^J z2v3bNiOy@X8E+K(eyp3%?rr1#GF?c+$1Oj>cuP)w^n3V;%&b=06I4}JiYBPA!#=dI zO8ygB_F(!xupb84k4G*h&SQ>TeeD4)kjYcC@Li@H-ER=-mN`N45%OY}pBG$*kL9*u zWwO;SHmrRU;ZkoG2i~zlGqqH}thCrmpnD0rz1`MOD$(ImW?F$(td#$HUuOEc_!L$B znFB#3ceiJ3_#R%dQhU!n$q_zn{f77G>yjF8-!+x0kTnYotoSz9bd9#L!ZY+VSF^ly z&B2tPW*M~zcNGn)RK}b?P!%sX^`M6Fx*{A@DMNY&F~hJBc{i}L*g_VF&rUro;d~;K zu=kpf)6@fJ)xqKiy+mQ!T;9t0WSYoN&q_i^am%zSTdWQtzc3W&@14rqo9~@ky&HkI z106`nbzd!<;E!`}uV<>rx0<{ zlAtQ&blqrVi-0iukq%!#Cp16_otQRuDnIc<(Lv}P2>}UtL5*K4q$4FL!ra^nA#fr) zO%r>SDf+6#?@SUQ(n%5_i9w}ODE>|P(N*39^}~!iqp?uw>TOp;W`9PG_Sy2Xy^cAS zhqlwn*#+vEncx!EvyJM4E>nM)=^!5XPX`$NVs%!Kd zM_+yn^8B)fl}cebmQa&qa^50`LaX&S|9F2I@QAup!yq#59%A?@MWL+r3n%nMLepb2 z&L8_D7H$b7(Mo>rQG1ZG-<9a^9wg6zE2?x`l6iP?X!YR@KHKMa=Ez$HN|t zMD|hm{@`^uVZ`KmOHCEqpds+fTYGQjVi^eL#uH(Vxw&6Z^XoN~_wEC8jgv&R&`R$l zOXl+>>4TgB0y|6LXjj`*?MDWc40jZ*6F&D(JTWShMvjb*(ztwS;r;wMRN_? ztAw9le0O~1J=cslSwJB9INunBn)fMJAHSfyMBaRjFm%&xcp|ihJ)T$FA#IaQQ%K7G zXE?VnWmx8McCEf*5M$qOLPZQVYIan_hG!cDs^j>{n7;3n)ILLNJaoYiaBpF8ao5KJ z*^dNxL~O5YnqQ>Oj2_uXpigX7nyW`5P!i(pJ8G5uXXBN$6_?HKsJ|yx@%Cgku*N)B zm&1}{prn_sqWbC7yQM@Sa1EW-SiiV21v}z1uphbhVmQ37^zPSfQBqg^o*A0d0NyY~ zt7P3o#?+U`Ua+huby&4{fg2`|1~a`~@3DY?*RDM$!6Mf?&@ zT24~086oIM4H0L`#Jx4dg?Q?0>gG~A+>-{9c3XDh^$EcQ!PRoSXtrj%Re0mqwQSMH z?VLx$(`fMvKGkKjR(7mCtKnVILG5G-0kX7LZCBUm%fZ?)Bu~R|vhe}Jjj0yBq&^Jx z8$T9I`y3Y(gVfUy6?=(Nvg*r>#~C)G^m!wtp5IFEJIf~_scCeYw26<>vg0lq4@X|7 zOzYH`cq)$t@O3%wU@U*0P#>%U!=w5zqXFb;es_|H zC#H~I8^pI}dnL4{5>a9%V}9Ne5k|F{NIwL#FjYf@zYYu%3xe1hJZ&9W-96B`iQ@v zg{O4bZi{i*6TIbe&kmKhn2#wuojw@q2mFN8-u+YK3A@z?3H+yb) zVH3Ok2bn?rP>Y8rOPrJtB;IO=8`W#lhCwZP8VTqA+S;>Y0Geh;vZHGH$FN7*x!zmhe&yPI4 zb^-U;LV$ak@ViH;OBW1A(zFAWCcgfMRhsF-<2zM@U+;CtiHE%;chrj170`z_e5*Y? z26|Ba^7Ih!DZ(@4+Q&USo%@NBn&akS=}a3ceU+k@IC>YX~}2%;zz9)Ln~sy3M}K3hfjGn23F~0%Oa^^Pj9}~ zg7_Rp&-At-7yDS^tdwDivKQ`-RC352$-I>zZ3~R-I!7)=XQ#5#9$`{clC85&QBj^d zg?uGfsAKY%0vJAf`A+Ynf+ODIQA;#++Bx}~riV>RC7R4fqnwsKZ6Iqb!jl^l?>lJc zzM-Q>JvJfdJ2b$)qDGY6xt%W`YI&gcHdP+omotcZ*!)5ZtFuWh=f~xM2`Q_`aA9aX zMbp|e!s|)#$7PqTr`_zzEa+*VaX>@LpeJnck~x#r*8}&h8(>=i3P1+*_LO52oG8;J zC#mB3{BBf0xcs?>V9Clkd0_eg2aj*h3{mQSYByjsnf<^yc~jFp$gio_CbH)q%g}TS zFVJj1ohi>F4ZF3{d>d=5fl&Vh^V0RTN3e}J*^#cSR>7&8^XP=BfY_Q+dVzqR~x z_sxpi5(cRtvZZbmr>Q0WI>cp;62Sb)0JFq2v6;@aCOrU2%SUdxJl_}C^c0RkoW;#N zt5R~HVQN!eQwVTc_WB*)6iup(J1AyI3*-@R1p@Ulz+0HOsk$%0HA|=u3YD`W!W;A} z??8GoNlP9ojg=LrtSva5MQ!drn3y?dl)q0%?N9`#5zCD)QZJwmN77^cl3QZ!KxQbx z_NN1YQDl2t-2w7`TNG#AV)cVYZl`KUS?;uSak;3CkqYv;K3r%qIradB>D&%NRSe~G zOT4h&^vyfkeutK<^Y3DclVq*C-6dhgvk&6&-97uH`3n)xZTA2hbYmI%D*Odc)B%8s zR8D^ANuU*l#f%zSEEySsm@|?-?J8CeB&uOMXM;e;iDfr9oM#Ekz{E9M6x}Usv(cAv zeq&g%4mN|Z05|;xkqY@$dFG`PHW!8TFytOk^XERulW)sn&Dz3s1EPUjX31Or^02@i zBd_=WTk#A6u`j2B(B$OYlgDjnZ-1Wa3F^38;Qcet^ph{pMm~*Rf~%HQYo!?HymJcpPQC` zRS6Bp&AfP!;`$&q@j3$0XR}93%T6k2<~v*V6!~V26S~nhR0msIUH4KKQ#V zc@8|b3c8Y6DHEI8Ex8^1!a zg+;C?H>!YGzaZNn;S94ia$a%#xW`g*9!p)uV;EO6*5ffY2ier3QMW+p;?#Xs(Nz&IhC?v!5j;d0^r`o6_T&HUn-N z*}|r zbwdTD#48J~8h_YgL~-F{F$+X(^pR|&eSkw&O7y*woPI5)E6-HBdp_m7e~#i{XGsv! z@Xty%usDVpzKQ~M+=(o_DefX9m!S90uY7Z`L>V}&c!;+8c%VuXm1VZ=r zV$ITX6P@8S{yCdUz&V^jbu$4~ylOH) z%@1%bFW&f~+?I7SCB=qdT;*i`BE4BZ;SI=cS9!_Y;TCqB%u;&Ijw_X{Tyy388?tO zqKjs-qO(dB{Q)+SU-wyOYYIB(Z3Vp9LGXTt9PkEtR-2A4k^G+!I7687(yE?t_C-J^ ziOVNVcEfRU6p58F-)nZ9kx8F~)-kpy!@g;H1e)8@A1T(E?;P%|%IVpZ8ubcTs1dJU zB_nPHk)jF8tquVBa=1XDP@+pWIyTM|GKBMw!L+Ed^;U{}$t5OHwT6U*wnoW#7O;qaZCu~nu)x{$4>HY?MJG(sb zpd9D-2OjX?nWkC@OKb)TU{^8xMGKH9FtsH+11uXJpFB&9Ll`` zq;abZc}cjom=#|})W_CMz9_OS@&bLTE=AuCw`3GRIN6k#_fV^7;*+j%=Y+308*9p% zvG+2|otaqF=w@RQvGT!v7}@-fu-!Lj&p^(eyVq28EDyFnRa3A+*K2<{SV@!dl&IFv zY}x1^H@Ph04>>|B79!A(0Vg^tSrpNqSZL@=74DuZ4U-SJfJ@-Mk{B-KILJMe4*7MP zypOrZOIj^OGaSKSzjdef_O6EGasAql{uFlzNz$Kje%!5jhH=wplwlO)j)}O-=kXN? z+>EC$<{2D=J^RF3N8Y1ps+<-}{+E)Hs&^h{;-{O6Kvg*f%%D0{ao$n5vcec3z*u!+ zRzf(vd^ST1Uyd$GeF;=GIk9bRl)MtpaHa>ubb$)VKSkR-{i{53CfUIkIe0o<3$KAU zkVX9>C&1PE;pOP+)G6>0ee@Wq2T*8oxr|XQEy?;iAQ^cJZ=bss7n>E%=!O8P-`CeS zGb>B3{_{+^zocL|ZoTI7WFv&5J-`8#Eu>LDKK(7wmu5)VAdD!IRXa{AhG9eQqUoX37Zj#M)Z)3(jvEtBNxS+%M1N zpwtHUH6UF8S>aB`jfoFq*y)x+O0av#4I9!L2iw(-#kf+Y`@4p*+ndARZg^|ilWU+Q zlXM{Exm>UA8Q4Ce65Y*Gi5^pT#}0knREKKc<9@Eo-^z&3lyy82eKe^RIA zcm;3GhgSlTN!hWj=>1;=Sb0)zS4HclQ$Qbra^|WvI~H9w$Btneya^YL1q5ujJkgTJ z$5GlTrv|;C3JH@of+6}^>`}I^$EV5@WbwqWUV@yEsvFWSJDhIp#E)&+k_U1=c04zH zII46lC*Gb#4*DmR(i@@}-ag?Q)AeS0t-Uo%sW9%M%i({C8K9G`HiWRce&rmQd*P|U zK#Oaf-z6rGL)CV`%inL6y_NBs2Z&!o(r2Yv=B}p{N(Qa-VBe?SAzPX&-We>3t9Q2P z8WRx3WK3!ZCdzkj(`Qsfdjo&`h;Of@rmR|$uMFd3vrdJ@gs(G7i7U59fmB6cs(bp& zU@Rcm`Q7Jgd?LT!>hAovpDHayUpPc*!IaNp`Xiu~EBCt)Se(9jh{9K@s?ZY0bn_@_VBSxph(t3qR z3DC;OBZU7|K>w7HN4kSGwA22Q0kl0q-v&%gl5vBji*QpOA{9iH zRpNqSLh*~?sF~%*Lufak1Lgt++LCD2%(U`q`f>dNnwy@2KxB$eT z`N*tWuT6MQ7%JFKWg zb;MH%c^IKz1*DmL$6RT>HNP;qJ8qzvc5VIZ<2c@~)%?*NefhvJlF2*pSoS-h7jPOv zG}?LeridDLjmA&eTTa7#{+9VEwQqFEqG&qtb~zB)u9YrD4C$f#Ctm{Ms_UfHH(!6Z zou<~f^4wKvH>v)+laX%5W1#}|A79bscpVArS@1fxB=ot4p0hNHeb5K@?V(h44B8m| zvN#E}n+-%B&O#ol)WKodI<$1H|Il9<(ywL-cvM*m8}6wr_LL}ayDDN&HGwSy8Ib6( z-Oe0g#PQf+1toHx-ee^ATmtX`5myGhy8UmjrU0*EW0?~7KuL|c665#%Y54@iP+s^C zHhqM;u!sODgV=jCAud=>cjU({F~U!4E~5FrWnRd0{#%)&OKGf<0_3a4cQ+xBySx9r z8^e_cX|f9m2?3|l4OWPtpu!ufkeh_oZC?$)w}=Tgs|sRUNd9xog?*O?f#CP!WnR1QPYgrupAr-oLr4 z|Hs4rYqWnO-2Q8{|9hi_hdbh`tE;b^`VLa@*n1Q~4X$~pRhR_v+Tz=m)WayiOYgO1 zWo90KwgobuL`2f%62^kT@t<9_&9LeHv~oyqmWh7LJ;koaDn<`SZhClleE#y~DUc%a z|2(dBQ7s=`)VoDxMyEgj>-!}3`b|%320e-wB98lPzM=AkN-ZFfq>9NV#>RVj`{<_> z6&1Z>&or_s Date: Wed, 25 Oct 2023 17:59:51 -0400 Subject: [PATCH 59/83] Backport PR #27179: Restore default behavior of hexbin mincnt with C provided --- doc/api/next_api_changes/behavior/27179-KS.rst | 7 +++++++ .../prev_api_changes/api_changes_3.8.0/behaviour.rst | 6 ++++++ lib/matplotlib/axes/_axes.py | 11 ++++++++--- lib/matplotlib/tests/test_axes.py | 2 ++ 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 doc/api/next_api_changes/behavior/27179-KS.rst diff --git a/doc/api/next_api_changes/behavior/27179-KS.rst b/doc/api/next_api_changes/behavior/27179-KS.rst new file mode 100644 index 000000000000..873cd622bbd4 --- /dev/null +++ b/doc/api/next_api_changes/behavior/27179-KS.rst @@ -0,0 +1,7 @@ +Default behavior of ``hexbin`` with *C* provided requires at least 1 point +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The behavior changed in 3.8.0 to be inclusive of *mincnt*. However that resulted in +errors or warnings with some reduction functions, so now the default is to require at +least 1 point to call the reduction function. This effectively restores the default +behavior to match that of Matplotlib 3.7 and before. diff --git a/doc/api/prev_api_changes/api_changes_3.8.0/behaviour.rst b/doc/api/prev_api_changes/api_changes_3.8.0/behaviour.rst index 37176f99972b..fd38708c9243 100644 --- a/doc/api/prev_api_changes/api_changes_3.8.0/behaviour.rst +++ b/doc/api/prev_api_changes/api_changes_3.8.0/behaviour.rst @@ -165,3 +165,9 @@ PostScript paper type adds option to use figure size The :rc:`ps.papertype` rcParam can now be set to ``'figure'``, which will use a paper size that corresponds exactly with the size of the figure that is being saved. + +``hexbin`` *mincnt* parameter made consistently inclusive +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Previously, *mincnt* was inclusive with no *C* provided but exclusive when *C* is provided. +It is now inclusive of *mincnt* in both cases. diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 9997e660f40c..b4a41099beda 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -4858,8 +4858,8 @@ def hexbin(self, x, y, C=None, gridsize=100, bins=None, yscale : {'linear', 'log'}, default: 'linear' Use a linear or log10 scale on the vertical axis. - mincnt : int > 0, default: *None* - If not *None*, only display cells with more than *mincnt* + mincnt : int >= 0, default: *None* + If not *None*, only display cells with at least *mincnt* number of points in the cell. marginals : bool, default: *False* @@ -4926,6 +4926,11 @@ def reduce_C_function(C: array) -> float - `numpy.sum`: integral of the point values - `numpy.amax`: value taken from the largest point + By default will only reduce cells with at least 1 point because some + reduction functions (such as `numpy.amax`) will error/warn with empty + input. Changing *mincnt* will adjust the cutoff, and if set to 0 will + pass empty input to the reduction function. + data : indexable object, optional DATA_PARAMETER_PLACEHOLDER @@ -5023,7 +5028,7 @@ def reduce_C_function(C: array) -> float else: Cs_at_i2[i2[i]].append(C[i]) if mincnt is None: - mincnt = 0 + mincnt = 1 accum = np.array( [reduce_C_function(acc) if len(acc) >= mincnt else np.nan for Cs_at_i in [Cs_at_i1, Cs_at_i2] diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 30992d5780ed..6c5dd712b7fd 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -965,6 +965,8 @@ def test_hexbin_empty(): # From #23922: creating hexbin with log scaling from empty # dataset raises ValueError ax.hexbin([], [], bins='log') + # From #27103: np.max errors when handed empty data + ax.hexbin([], [], C=[], reduce_C_function=np.max) def test_hexbin_pickable(): From 152f261613e2cf68cd134d7c1276bb00fce68db7 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 25 Oct 2023 22:27:40 -0400 Subject: [PATCH 60/83] Backport PR #27178: Try/except import of Axes3D --- lib/matplotlib/projections/__init__.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/projections/__init__.py b/lib/matplotlib/projections/__init__.py index 16a5651da1d1..8ce118986065 100644 --- a/lib/matplotlib/projections/__init__.py +++ b/lib/matplotlib/projections/__init__.py @@ -55,7 +55,15 @@ from .. import axes, _docstring from .geo import AitoffAxes, HammerAxes, LambertAxes, MollweideAxes from .polar import PolarAxes -from mpl_toolkits.mplot3d import Axes3D + +try: + from mpl_toolkits.mplot3d import Axes3D +except ImportError: + import warnings + warnings.warn("Unable to import Axes3D. This may be due to multiple versions of " + "Matplotlib being installed (e.g. as a system package and as a pip " + "package). As a result, the 3D projection is not available.") + Axes3D = None class ProjectionRegistry: @@ -87,8 +95,12 @@ def get_projection_names(self): HammerAxes, LambertAxes, MollweideAxes, - Axes3D, ) +if Axes3D is not None: + projection_registry.register(Axes3D) +else: + # remove from namespace if not importable + del Axes3D def register_projection(cls): From b0859e68e72dae8696cc50722094f57014ff5127 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Thu, 26 Oct 2023 12:02:49 -0400 Subject: [PATCH 61/83] Backport PR #27205: Improve legend picking example --- .../examples/event_handling/legend_picking.py | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/galleries/examples/event_handling/legend_picking.py b/galleries/examples/event_handling/legend_picking.py index 79c27358a8ff..2fed3c9c1649 100644 --- a/galleries/examples/event_handling/legend_picking.py +++ b/galleries/examples/event_handling/legend_picking.py @@ -18,33 +18,46 @@ import numpy as np t = np.linspace(0, 1) -y1 = 2 * np.sin(2*np.pi*t) -y2 = 4 * np.sin(2*np.pi*2*t) +y1 = 2 * np.sin(2 * np.pi * t) +y2 = 4 * np.sin(2 * np.pi * 2 * t) fig, ax = plt.subplots() ax.set_title('Click on legend line to toggle line on/off') -line1, = ax.plot(t, y1, lw=2, label='1 Hz') -line2, = ax.plot(t, y2, lw=2, label='2 Hz') +(line1, ) = ax.plot(t, y1, lw=2, label='1 Hz') +(line2, ) = ax.plot(t, y2, lw=2, label='2 Hz') leg = ax.legend(fancybox=True, shadow=True) lines = [line1, line2] -lined = {} # Will map legend lines to original lines. -for legline, origline in zip(leg.get_lines(), lines): - legline.set_picker(True) # Enable picking on the legend line. - lined[legline] = origline +map_legend_to_ax = {} # Will map legend lines to original lines. + +pickradius = 5 # Points (Pt). How close the click needs to be to trigger an event. + +for legend_line, ax_line in zip(leg.get_lines(), lines): + legend_line.set_picker(pickradius) # Enable picking on the legend line. + map_legend_to_ax[legend_line] = ax_line def on_pick(event): # On the pick event, find the original line corresponding to the legend # proxy line, and toggle its visibility. - legline = event.artist - origline = lined[legline] - visible = not origline.get_visible() - origline.set_visible(visible) + legend_line = event.artist + + # Do nothing if the source of the event is not a legend line. + if legend_line not in map_legend_to_ax: + return + + ax_line = map_legend_to_ax[legend_line] + visible = not ax_line.get_visible() + ax_line.set_visible(visible) # Change the alpha on the line in the legend, so we can see what lines # have been toggled. - legline.set_alpha(1.0 if visible else 0.2) + legend_line.set_alpha(1.0 if visible else 0.2) fig.canvas.draw() + fig.canvas.mpl_connect('pick_event', on_pick) + +# Works even if the legend is draggable. This is independent from picking legend lines. +leg.set_draggable(True) + plt.show() From 271b948af79c314a871d215152e5d9b8a7fdd36f Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Thu, 26 Oct 2023 12:35:31 -0400 Subject: [PATCH 62/83] Backport PR #26970: FIX: Add PyOS_InputHook back to macos backend --- src/_macosx.m | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/_macosx.m b/src/_macosx.m index 8d92b75f6bfe..e9677a40e6b5 100755 --- a/src/_macosx.m +++ b/src/_macosx.m @@ -41,6 +41,66 @@ static bool keyChangeCapsLock = false; /* Keep track of the current mouse up/down state for open/closed cursor hand */ static bool leftMouseGrabbing = false; +/* Keep track of whether stdin has been received */ +static bool stdin_received = false; +static bool stdin_sigint = false; +// Global variable to store the original SIGINT handler +static struct sigaction originalSigintAction = {0}; + +// Signal handler for SIGINT, only sets a flag to exit the run loop +static void handleSigint(int signal) { + stdin_sigint = true; +} + +static int wait_for_stdin() { + @autoreleasepool { + stdin_received = false; + stdin_sigint = false; + + // Set up a SIGINT handler to interrupt the event loop if ctrl+c comes in too + struct sigaction customAction = {0}; + customAction.sa_handler = handleSigint; + // Set the new handler and store the old one + sigaction(SIGINT, &customAction, &originalSigintAction); + + // Create an NSFileHandle for standard input + NSFileHandle *stdinHandle = [NSFileHandle fileHandleWithStandardInput]; + + // Register for data available notifications on standard input + [[NSNotificationCenter defaultCenter] addObserverForName: NSFileHandleDataAvailableNotification + object: stdinHandle + queue: [NSOperationQueue mainQueue] // Use the main queue + usingBlock: ^(NSNotification *notification) { + // Mark that input has been received + stdin_received = true; + } + ]; + + // Wait in the background for anything that happens to stdin + [stdinHandle waitForDataInBackgroundAndNotify]; + + // continuously run an event loop until the stdin_received flag is set to exit + while (!stdin_received && !stdin_sigint) { + while (true) { + NSEvent *event = [NSApp nextEventMatchingMask: NSEventMaskAny + untilDate: [NSDate distantPast] + inMode: NSDefaultRunLoopMode + dequeue: YES]; + if (!event) { break; } + [NSApp sendEvent: event]; + } + // We need to run the run loop for a short time to allow the + // events to be processed and keep flushing them while we wait for stdin + [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.01]]; + } + // Remove the input handler as an observer + [[NSNotificationCenter defaultCenter] removeObserver: stdinHandle]; + + // Restore the original SIGINT handler upon exiting the function + sigaction(SIGINT, &originalSigintAction, NULL); + return 1; + } +} /* ---------------------------- Cocoa classes ---------------------------- */ @@ -139,6 +199,9 @@ static void lazy_init(void) { NSApp = [NSApplication sharedApplication]; [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; + // Run our own event loop while waiting for stdin on the Python side + // this is needed to keep the application responsive while waiting for input + PyOS_InputHook = wait_for_stdin; } static PyObject* From ad924570137485e805e19ea2354b5a69a2e689e5 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Thu, 26 Oct 2023 18:33:03 -0500 Subject: [PATCH 63/83] Backport PR #27088: Update `find_nearest_contour` and revert contour deprecations --- .../deprecations/27088-JK.rst | 5 ++ lib/matplotlib/contour.py | 79 +++++++------------ lib/matplotlib/contour.pyi | 2 +- lib/matplotlib/tests/test_contour.py | 32 +++----- 4 files changed, 45 insertions(+), 73 deletions(-) create mode 100644 doc/api/next_api_changes/deprecations/27088-JK.rst diff --git a/doc/api/next_api_changes/deprecations/27088-JK.rst b/doc/api/next_api_changes/deprecations/27088-JK.rst new file mode 100644 index 000000000000..ea7fef5abf64 --- /dev/null +++ b/doc/api/next_api_changes/deprecations/27088-JK.rst @@ -0,0 +1,5 @@ +Deprecations removed in ``contour`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``contour.allsegs``, ``contour.allkinds``, and ``contour.find_nearest_contour`` are no +longer marked for deprecation. diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index f1b6597b2460..f5ac14dff34d 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -2,6 +2,7 @@ Classes to support contour plotting and labelling for the Axes class. """ +from contextlib import ExitStack import functools import math from numbers import Integral @@ -944,12 +945,12 @@ def __init__(self, ax, *args, ", ".join(map(repr, kwargs)) ) - allsegs = _api.deprecated("3.8", pending=True)(property(lambda self: [ + allsegs = property(lambda self: [ [subp.vertices for subp in p._iter_connected_components()] - for p in self.get_paths()])) - allkinds = _api.deprecated("3.8", pending=True)(property(lambda self: [ + for p in self.get_paths()]) + allkinds = property(lambda self: [ [subp.codes for subp in p._iter_connected_components()] - for p in self.get_paths()])) + for p in self.get_paths()]) tcolors = _api.deprecated("3.8")(property(lambda self: [ (tuple(rgba),) for rgba in self.to_rgba(self.cvalues, self.alpha)])) tlinewidths = _api.deprecated("3.8")(property(lambda self: [ @@ -1403,7 +1404,6 @@ def _find_nearest_contour(self, xy, indices=None): return idx_level_min, idx_vtx_min, proj_min - @_api.deprecated("3.8") def find_nearest_contour(self, x, y, indices=None, pixel=True): """ Find the point in the contour plot that is closest to ``(x, y)``. @@ -1424,64 +1424,39 @@ def find_nearest_contour(self, x, y, indices=None, pixel=True): Returns ------- - contour : `.Collection` - The contour that is closest to ``(x, y)``. - segment : int - The index of the `.Path` in *contour* that is closest to - ``(x, y)``. + path : int + The index of the path that is closest to ``(x, y)``. Each path corresponds + to one contour level. + subpath : int + The index within that closest path of the subpath that is closest to + ``(x, y)``. Each subpath corresponds to one unbroken contour line. index : int - The index of the path segment in *segment* that is closest to + The index of the vertices within that subpath that are closest to ``(x, y)``. xmin, ymin : float The point in the contour plot that is closest to ``(x, y)``. d2 : float The squared distance from ``(xmin, ymin)`` to ``(x, y)``. """ + segment = index = d2 = None - # This function uses a method that is probably quite - # inefficient based on converting each contour segment to - # pixel coordinates and then comparing the given point to - # those coordinates for each contour. This will probably be - # quite slow for complex contours, but for normal use it works - # sufficiently well that the time is not noticeable. - # Nonetheless, improvements could probably be made. + with ExitStack() as stack: + if not pixel: + # _find_nearest_contour works in pixel space. We want axes space, so + # effectively disable the transformation here by setting to identity. + stack.enter_context(self._cm_set( + transform=mtransforms.IdentityTransform())) - if self.filled: - raise ValueError("Method does not support filled contours.") + i_level, i_vtx, (xmin, ymin) = self._find_nearest_contour((x, y), indices) - if indices is None: - indices = range(len(self.collections)) + if i_level is not None: + cc_cumlens = np.cumsum( + [*map(len, self._paths[i_level]._iter_connected_components())]) + segment = cc_cumlens.searchsorted(i_vtx, "right") + index = i_vtx if segment == 0 else i_vtx - cc_cumlens[segment - 1] + d2 = (xmin-x)**2 + (ymin-y)**2 - d2min = np.inf - conmin = None - segmin = None - imin = None - xmin = None - ymin = None - - point = np.array([x, y]) - - for icon in indices: - con = self.collections[icon] - trans = con.get_transform() - paths = con.get_paths() - - for segNum, linepath in enumerate(paths): - lc = linepath.vertices - # transfer all data points to screen coordinates if desired - if pixel: - lc = trans.transform(lc) - - d2, xc, leg = _find_closest_point_on_path(lc, point) - if d2 < d2min: - d2min = d2 - conmin = icon - segmin = segNum - imin = leg[1] - xmin = xc[0] - ymin = xc[1] - - return (conmin, segmin, imin, xmin, ymin, d2min) + return (i_level, segment, index, xmin, ymin, d2) def draw(self, renderer): paths = self._paths diff --git a/lib/matplotlib/contour.pyi b/lib/matplotlib/contour.pyi index 4a1e1e1d9d2e..8a987b762445 100644 --- a/lib/matplotlib/contour.pyi +++ b/lib/matplotlib/contour.pyi @@ -159,6 +159,6 @@ class ContourSet(ContourLabeler, Collection): ) -> tuple[list[Artist], list[str]]: ... def find_nearest_contour( self, x: float, y: float, indices: Iterable[int] | None = ..., pixel: bool = ... - ) -> tuple[Collection, int, int, float, float, float]: ... + ) -> tuple[int, int, int, float, float, float]: ... class QuadContourSet(ContourSet): ... diff --git a/lib/matplotlib/tests/test_contour.py b/lib/matplotlib/tests/test_contour.py index 74165faad9fc..db8ef03925cd 100644 --- a/lib/matplotlib/tests/test_contour.py +++ b/lib/matplotlib/tests/test_contour.py @@ -569,23 +569,19 @@ def test_find_nearest_contour(): img = np.exp(-np.pi * (np.sum((xy - 5)**2, 0)/5.**2)) cs = plt.contour(img, 10) - with pytest.warns(mpl._api.MatplotlibDeprecationWarning): - nearest_contour = cs.find_nearest_contour(1, 1, pixel=False) + nearest_contour = cs.find_nearest_contour(1, 1, pixel=False) expected_nearest = (1, 0, 33, 1.965966, 1.965966, 1.866183) assert_array_almost_equal(nearest_contour, expected_nearest) - with pytest.warns(mpl._api.MatplotlibDeprecationWarning): - nearest_contour = cs.find_nearest_contour(8, 1, pixel=False) + nearest_contour = cs.find_nearest_contour(8, 1, pixel=False) expected_nearest = (1, 0, 5, 7.550173, 1.587542, 0.547550) assert_array_almost_equal(nearest_contour, expected_nearest) - with pytest.warns(mpl._api.MatplotlibDeprecationWarning): - nearest_contour = cs.find_nearest_contour(2, 5, pixel=False) + nearest_contour = cs.find_nearest_contour(2, 5, pixel=False) expected_nearest = (3, 0, 21, 1.884384, 5.023335, 0.013911) assert_array_almost_equal(nearest_contour, expected_nearest) - with pytest.warns(mpl._api.MatplotlibDeprecationWarning): - nearest_contour = cs.find_nearest_contour(2, 5, indices=(5, 7), pixel=False) + nearest_contour = cs.find_nearest_contour(2, 5, indices=(5, 7), pixel=False) expected_nearest = (5, 0, 16, 2.628202, 5.0, 0.394638) assert_array_almost_equal(nearest_contour, expected_nearest) @@ -595,16 +591,13 @@ def test_find_nearest_contour_no_filled(): img = np.exp(-np.pi * (np.sum((xy - 5)**2, 0)/5.**2)) cs = plt.contourf(img, 10) - with pytest.warns(mpl._api.MatplotlibDeprecationWarning), \ - pytest.raises(ValueError, match="Method does not support filled contours."): + with pytest.raises(ValueError, match="Method does not support filled contours"): cs.find_nearest_contour(1, 1, pixel=False) - with pytest.warns(mpl._api.MatplotlibDeprecationWarning), \ - pytest.raises(ValueError, match="Method does not support filled contours."): + with pytest.raises(ValueError, match="Method does not support filled contours"): cs.find_nearest_contour(1, 10, indices=(5, 7), pixel=False) - with pytest.warns(mpl._api.MatplotlibDeprecationWarning), \ - pytest.raises(ValueError, match="Method does not support filled contours."): + with pytest.raises(ValueError, match="Method does not support filled contours"): cs.find_nearest_contour(2, 5, indices=(2, 7), pixel=True) @@ -864,12 +857,11 @@ def test_allsegs_allkinds(): cs = plt.contour(x, y, z, levels=[0, 0.5]) - # Expect two levels, first with 5 segments and the second with 4. - with pytest.warns(PendingDeprecationWarning, match="all"): - for result in [cs.allsegs, cs.allkinds]: - assert len(result) == 2 - assert len(result[0]) == 5 - assert len(result[1]) == 4 + # Expect two levels, the first with 5 segments and the second with 4. + for result in [cs.allsegs, cs.allkinds]: + assert len(result) == 2 + assert len(result[0]) == 5 + assert len(result[1]) == 4 def test_deprecated_apis(): From ea695ee18d197c89a5598981314be29cfc56b639 Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Sat, 28 Oct 2023 13:35:48 +0100 Subject: [PATCH 64/83] Backport PR #27217: Fix type hints for undeprecated contour APIs (cherry picked from commit 518b268a5e94f8dcec079cb07eb735981e5ac0ef) --- ci/mypy-stubtest-allowlist.txt | 4 ---- lib/matplotlib/contour.pyi | 11 ++++++++--- lib/matplotlib/path.pyi | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ci/mypy-stubtest-allowlist.txt b/ci/mypy-stubtest-allowlist.txt index 8a7ffb18df7f..778494446d38 100644 --- a/ci/mypy-stubtest-allowlist.txt +++ b/ci/mypy-stubtest-allowlist.txt @@ -46,10 +46,6 @@ matplotlib.widgets.MultiCursor.needclear # 3.8 deprecations matplotlib.cbook.get_sample_data -matplotlib.contour.ContourSet.allkinds -matplotlib.contour.ContourSet.allsegs -matplotlib.contour.ContourSet.tcolors -matplotlib.contour.ContourSet.tlinewidths matplotlib.ticker.LogLocator.__init__ matplotlib.ticker.LogLocator.set_params diff --git a/lib/matplotlib/contour.pyi b/lib/matplotlib/contour.pyi index 8a987b762445..d7bddfe8f1f5 100644 --- a/lib/matplotlib/contour.pyi +++ b/lib/matplotlib/contour.pyi @@ -103,12 +103,17 @@ class ContourSet(ContourLabeler, Collection): clip_path: Patch | Path | TransformedPath | TransformedPatchPath | None labelTexts: list[Text] labelCValues: list[ColorType] - allkinds: list[np.ndarray] - tcolors: list[tuple[float, float, float, float]] + @property + def tcolors(self) -> list[tuple[tuple[float, float, float, float]]]: ... # only for not filled - tlinewidths: list[tuple[float]] + @property + def tlinewidths(self) -> list[tuple[float]]: ... + @property + def allkinds(self) -> list[list[np.ndarray | None]]: ... + @property + def allsegs(self) -> list[list[np.ndarray]]: ... @property def alpha(self) -> float | None: ... @property diff --git a/lib/matplotlib/path.pyi b/lib/matplotlib/path.pyi index c96c5a0ba9e4..464fc6d9a912 100644 --- a/lib/matplotlib/path.pyi +++ b/lib/matplotlib/path.pyi @@ -30,7 +30,7 @@ class Path: @vertices.setter def vertices(self, vertices: ArrayLike) -> None: ... @property - def codes(self) -> ArrayLike: ... + def codes(self) -> ArrayLike | None: ... @codes.setter def codes(self, codes: ArrayLike) -> None: ... @property From 276e9286cd2d36a929d2160dd8e4459c9deef229 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Mon, 30 Oct 2023 12:09:08 -0500 Subject: [PATCH 65/83] Backport PR #27221: FIX: Enable interrupts on macosx event loops --- lib/matplotlib/backends/backend_macosx.py | 75 +++++++++++++++-------- src/_macosx.m | 6 +- 2 files changed, 51 insertions(+), 30 deletions(-) diff --git a/lib/matplotlib/backends/backend_macosx.py b/lib/matplotlib/backends/backend_macosx.py index ecf21b07aef4..a39f5b5b1497 100644 --- a/lib/matplotlib/backends/backend_macosx.py +++ b/lib/matplotlib/backends/backend_macosx.py @@ -1,3 +1,4 @@ +import contextlib import os import signal import socket @@ -106,6 +107,13 @@ def resize(self, width, height): ResizeEvent("resize_event", self)._process() self.draw_idle() + def start_event_loop(self, timeout=0): + # docstring inherited + with _maybe_allow_interrupt(): + # Call the objc implementation of the event loop after + # setting up the interrupt handling + self._start_event_loop(timeout=timeout) + class NavigationToolbar2Mac(_macosx.NavigationToolbar2, NavigationToolbar2): @@ -171,34 +179,8 @@ def start_main_loop(cls): # Set up a SIGINT handler to allow terminating a plot via CTRL-C. # The logic is largely copied from qt_compat._maybe_allow_interrupt; see its # docstring for details. Parts are implemented by wake_on_fd_write in ObjC. - - old_sigint_handler = signal.getsignal(signal.SIGINT) - if old_sigint_handler in (None, signal.SIG_IGN, signal.SIG_DFL): - _macosx.show() - return - - handler_args = None - wsock, rsock = socket.socketpair() - wsock.setblocking(False) - rsock.setblocking(False) - old_wakeup_fd = signal.set_wakeup_fd(wsock.fileno()) - _macosx.wake_on_fd_write(rsock.fileno()) - - def handle(*args): - nonlocal handler_args - handler_args = args - _macosx.stop() - - signal.signal(signal.SIGINT, handle) - try: + with _maybe_allow_interrupt(): _macosx.show() - finally: - wsock.close() - rsock.close() - signal.set_wakeup_fd(old_wakeup_fd) - signal.signal(signal.SIGINT, old_sigint_handler) - if handler_args is not None: - old_sigint_handler(*handler_args) def show(self): if not self._shown: @@ -208,6 +190,45 @@ def show(self): self._raise() +@contextlib.contextmanager +def _maybe_allow_interrupt(): + """ + This manager allows to terminate a plot by sending a SIGINT. It is + necessary because the running backend prevents Python interpreter to + run and process signals (i.e., to raise KeyboardInterrupt exception). To + solve this one needs to somehow wake up the interpreter and make it close + the plot window. The implementation is taken from qt_compat, see that + docstring for a more detailed description. + """ + old_sigint_handler = signal.getsignal(signal.SIGINT) + if old_sigint_handler in (None, signal.SIG_IGN, signal.SIG_DFL): + yield + return + + handler_args = None + wsock, rsock = socket.socketpair() + wsock.setblocking(False) + rsock.setblocking(False) + old_wakeup_fd = signal.set_wakeup_fd(wsock.fileno()) + _macosx.wake_on_fd_write(rsock.fileno()) + + def handle(*args): + nonlocal handler_args + handler_args = args + _macosx.stop() + + signal.signal(signal.SIGINT, handle) + try: + yield + finally: + wsock.close() + rsock.close() + signal.set_wakeup_fd(old_wakeup_fd) + signal.signal(signal.SIGINT, old_sigint_handler) + if handler_args is not None: + old_sigint_handler(*handler_args) + + @_Backend.export class _BackendMac(_Backend): FigureCanvas = FigureCanvasMac diff --git a/src/_macosx.m b/src/_macosx.m index e9677a40e6b5..6df00d0eca8e 100755 --- a/src/_macosx.m +++ b/src/_macosx.m @@ -451,7 +451,7 @@ int mpl_check_modifier( } static PyObject* -FigureCanvas_start_event_loop(FigureCanvas* self, PyObject* args, PyObject* keywords) +FigureCanvas__start_event_loop(FigureCanvas* self, PyObject* args, PyObject* keywords) { float timeout = 0.0; @@ -522,8 +522,8 @@ int mpl_check_modifier( (PyCFunction)FigureCanvas_remove_rubberband, METH_NOARGS, "Remove the current rubberband rectangle."}, - {"start_event_loop", - (PyCFunction)FigureCanvas_start_event_loop, + {"_start_event_loop", + (PyCFunction)FigureCanvas__start_event_loop, METH_KEYWORDS | METH_VARARGS, NULL}, // docstring inherited {"stop_event_loop", From 3127a29e2d6dae677009af83bcae93563e861fc2 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Mon, 30 Oct 2023 15:19:46 -0500 Subject: [PATCH 66/83] Backport PR #27226: DOC: link out to troubleshooting guide in install --- doc/devel/development_setup.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/devel/development_setup.rst b/doc/devel/development_setup.rst index 8537e1229df4..c1e7500f4913 100644 --- a/doc/devel/development_setup.rst +++ b/doc/devel/development_setup.rst @@ -162,6 +162,7 @@ using the command :: python -m pip install -ve . + The 'editable/develop mode', builds everything and places links in your Python environment so that Python will be able to import Matplotlib from your development source directory. This allows you to import your modified version @@ -170,6 +171,10 @@ true for ``*.py`` files. If you change the C-extension source (which might also happen if you change branches) you will have to re-run ``python -m pip install -ve .`` +If the installation is not working, please consult the :ref:`troubleshooting guide `. +If the guide does not offer a solution, please reach out via `chat `_ +or :ref:`open an issue `. + Verify the Installation ======================= From 0a775917db9747e5446794e52dc1a79d3d356d5d Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Tue, 31 Oct 2023 15:12:39 -0500 Subject: [PATCH 67/83] Backport PR #27165: Fixing Matplotlib Notebook Text --- .../users_explain/figure/figure_intro.rst | 9 +++ .../users_explain/figure/interactive.rst | 67 ++++++++++--------- 2 files changed, 43 insertions(+), 33 deletions(-) diff --git a/galleries/users_explain/figure/figure_intro.rst b/galleries/users_explain/figure/figure_intro.rst index 34adb541af84..ac7286c119e8 100644 --- a/galleries/users_explain/figure/figure_intro.rst +++ b/galleries/users_explain/figure/figure_intro.rst @@ -73,6 +73,15 @@ other than the default "inline" backend, you will likely need to use an ipython .. seealso:: :ref:`interactive_figures`. +.. note:: + + If you only need to use the classic notebook (i.e. ``notebook<7``), + you can use: + + .. sourcecode:: ipython + + %matplotlib notebook + Standalone scripts and interactive use -------------------------------------- diff --git a/galleries/users_explain/figure/interactive.rst b/galleries/users_explain/figure/interactive.rst index a32d1a1eb847..9a4c4956ed6d 100644 --- a/galleries/users_explain/figure/interactive.rst +++ b/galleries/users_explain/figure/interactive.rst @@ -36,11 +36,16 @@ that include interactive tools, a toolbar, a tool-tip, and `.pyplot.subplots` Creates a new `.Figure` and fills it with a grid of `~.axes.Axes` -`.pyplot` has a notion of "The Current Figure" which can be accessed -through `.pyplot.gcf` and a notion of "The Current Axes" accessed -through `.pyplot.gca`. Almost all of the functions in `.pyplot` pass -through the current `.Figure` / `~.axes.Axes` (or create one) as -appropriate. +`.pyplot.gcf` + Get the current `.Figure`. If there is current no figure on the pyplot figure + stack, a new figure is created + +`.pyplot.gca` + Get the current `~.axes.Axes`. If there is current no Axes on the Figure, + a new one is created + +Almost all of the functions in `.pyplot` pass through the current `.Figure` / `~.axes.Axes` +(or create one) as appropriate. Matplotlib keeps a reference to all of the open figures created via `pyplot.figure` or `pyplot.subplots` so that the figures will not be garbage @@ -51,7 +56,6 @@ collected. `.Figure`\s can be closed and deregistered from `.pyplot` individuall .. seealso:: For more discussion of Matplotlib's event system and integrated event loops: - - :ref:`interactive_figures_and_eventloops` - :ref:`event-handling` @@ -189,7 +193,7 @@ the GUI main loop in some other way. .. warning:: - Using `.Figure.show` it is possible to display a figure on + Using `.Figure.show`, it is possible to display a figure on the screen without starting the event loop and without being in interactive mode. This may work (depending on the GUI toolkit) but will likely result in a non-responsive figure. @@ -211,8 +215,7 @@ Interactive navigation .. image:: ../../../_static/toolbar.png All figure windows come with a navigation toolbar, which can be used -to navigate through the data set. Here is a description of each of -the buttons at the bottom of the toolbar +to navigate through the data set. .. image:: ../../../../lib/matplotlib/mpl-data/images/home_large.png @@ -221,20 +224,19 @@ the buttons at the bottom of the toolbar .. image:: ../../../../lib/matplotlib/mpl-data/images/forward_large.png The ``Home``, ``Forward`` and ``Back`` buttons - These are akin to a web browser's home, forward and back controls. + These are similar to a web browser's home, forward and back controls. ``Forward`` and ``Back`` are used to navigate back and forth between previously defined views. They have no meaning unless you have already navigated somewhere else using the pan and zoom buttons. This is analogous to trying to click ``Back`` on your web browser before visiting a new page or ``Forward`` before you have gone back to a page -- - nothing happens. ``Home`` always takes you to the - first, default view of your data. Again, all of these buttons should - feel very familiar to any user of a web browser. + nothing happens. ``Home`` takes you to the + first, default view of your data. .. image:: ../../../../lib/matplotlib/mpl-data/images/move_large.png The ``Pan/Zoom`` button - This button has two modes: pan and zoom. Click the toolbar button + This button has two modes: pan and zoom. Click the ``Pan/Zoom`` button to activate panning and zooming, then put your mouse somewhere over an axes. Press the left mouse button and hold it to pan the figure, dragging it to a new position. When you release it, the @@ -244,8 +246,8 @@ The ``Pan/Zoom`` button the right mouse button to zoom, dragging it to a new position. The x axis will be zoomed in proportionately to the rightward movement and zoomed out proportionately to the leftward movement. - The same is true for the y axis and up/down motions. The point under your - mouse when you begin the zoom remains stationary, allowing you to + The same is true for the y axis and up/down motions (up zooms in, down zooms out). + The point under your mouse when you begin the zoom remains stationary, allowing you to zoom in or out around that point as much as you wish. You can use the modifier keys 'x', 'y' or 'CONTROL' to constrain the zoom to the x axis, the y axis, or aspect ratio preserve, respectively. @@ -257,9 +259,8 @@ The ``Pan/Zoom`` button .. image:: ../../../../lib/matplotlib/mpl-data/images/zoom_to_rect_large.png -The ``Zoom-to-rectangle`` button - Click this toolbar button to activate this mode. Put your mouse somewhere - over an axes and press a mouse button. Define a rectangular region by +The ``Zoom-to-Rectangle`` button + Put your mouse somewhere over an axes and press a mouse button. Define a rectangular region by dragging the mouse while holding the button to a new location. When using the left mouse button, the axes view limits will be zoomed to the defined region. When using the right mouse button, the axes view limits will be @@ -268,8 +269,8 @@ The ``Zoom-to-rectangle`` button .. image:: ../../../../lib/matplotlib/mpl-data/images/subplots_large.png The ``Subplot-configuration`` button - Use this tool to configure the appearance of the subplot: - you can stretch or compress the left, right, top, or bottom + Use this button to configure the appearance of the subplot. + You can stretch or compress the left, right, top, or bottom side of the subplot, or the space between the rows or space between the columns. @@ -325,7 +326,7 @@ Interactive mode works in the default Python prompt: >>> plt.ion() >>> -however this does not ensure that the event hook is properly installed +However, this does not ensure that the event hook is properly installed and your figures may not be responsive. Please consult the documentation of your GUI toolkit for details. @@ -335,16 +336,6 @@ documentation of your GUI toolkit for details. Jupyter Notebooks / JupyterLab ------------------------------ -.. note:: - - To get the interactive functionality described here, you must be - using an interactive backend. The default backend in notebooks, - the inline backend, is not. `~ipykernel.pylab.backend_inline` - renders the figure once and inserts a static image into the - notebook when the cell is executed. Because the images are static, they - cannot be panned / zoomed, take user input, or be updated from other - cells. - To get interactive figures in the 'classic' notebook or Jupyter lab, use the `ipympl `__ backend (must be installed separately) which uses the **ipywidget** framework. @@ -356,7 +347,7 @@ If ``ipympl`` is installed use the magic: to select and enable it. -If you only need to use the classic notebook, you can use +If you only need to use the classic notebook (i.e. ``notebook<7``), you can use .. sourcecode:: ipython @@ -365,6 +356,16 @@ If you only need to use the classic notebook, you can use which uses the `.backend_nbagg` backend provided by Matplotlib; however, nbagg does not work in Jupyter Lab. +.. note:: + + To get the interactive functionality described here, you must be + using an interactive backend. The default backend in notebooks, + the inline backend, is not. `~ipykernel.pylab.backend_inline` + renders the figure once and inserts a static image into the + notebook when the cell is executed. Because the images are static, they + cannot be panned / zoomed, take user input, or be updated from other + cells. + GUIs + Jupyter ^^^^^^^^^^^^^^ From 58a7f9af474675f424aa94fcdae1ca51a2b1dfd0 Mon Sep 17 00:00:00 2001 From: Lucia Korpas <22487941+notchia@users.noreply.github.com> Date: Tue, 31 Oct 2023 16:33:00 -0400 Subject: [PATCH 68/83] Backport PR #27237: DOC: Add command to install appropriate `requirements.txt` during dev venv setup --- doc/devel/development_setup.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/devel/development_setup.rst b/doc/devel/development_setup.rst index c1e7500f4913..9da1c5737a36 100644 --- a/doc/devel/development_setup.rst +++ b/doc/devel/development_setup.rst @@ -131,9 +131,13 @@ The simplest way to do this is to use either Python's virtual environment On some systems, you may need to type ``python3`` instead of ``python``. For a discussion of the technical reasons, see `PEP-394 `_. + Install the Python dependencies with :: + + pip install -r requirements/dev/dev-requirements.txt + .. tab-item:: conda environment - Create a new `conda`_ environment with :: + Create a new `conda`_ environment and install the Python dependencies with :: conda env create -f environment.yml From be5b1f5c97db70351ad7797e4811d0a7476aa52d Mon Sep 17 00:00:00 2001 From: Lucia Korpas <22487941+notchia@users.noreply.github.com> Date: Tue, 31 Oct 2023 16:33:00 -0400 Subject: [PATCH 69/83] Backport PR #27237: DOC: Add command to install appropriate `requirements.txt` during dev venv setup --- doc/devel/development_setup.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/devel/development_setup.rst b/doc/devel/development_setup.rst index 8537e1229df4..b6f53dd0a834 100644 --- a/doc/devel/development_setup.rst +++ b/doc/devel/development_setup.rst @@ -131,9 +131,13 @@ The simplest way to do this is to use either Python's virtual environment On some systems, you may need to type ``python3`` instead of ``python``. For a discussion of the technical reasons, see `PEP-394 `_. + Install the Python dependencies with :: + + pip install -r requirements/dev/dev-requirements.txt + .. tab-item:: conda environment - Create a new `conda`_ environment with :: + Create a new `conda`_ environment and install the Python dependencies with :: conda env create -f environment.yml From 8c517cd03553a59e97bdb00289bfd17fec0c7aec Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Tue, 31 Oct 2023 16:33:12 -0500 Subject: [PATCH 70/83] Release prep v3.8.1 --- .../next_api_changes/behavior/27179-KS.rst | 7 - .../deprecations/27088-JK.rst | 5 - .../next_api_changes/development/26849-KS.rst | 5 - .../prev_api_changes/api_changes_3.8.1.rst | 33 + doc/users/github_stats.rst | 1112 +++-------------- .../prev_whats_new/github_stats_3.8.0.rst | 1003 +++++++++++++++ doc/users/release_notes.rst | 2 + galleries/tutorials/images.py | 5 +- galleries/users_explain/quick_start.py | 2 +- 9 files changed, 1180 insertions(+), 994 deletions(-) delete mode 100644 doc/api/next_api_changes/behavior/27179-KS.rst delete mode 100644 doc/api/next_api_changes/deprecations/27088-JK.rst delete mode 100644 doc/api/next_api_changes/development/26849-KS.rst create mode 100644 doc/api/prev_api_changes/api_changes_3.8.1.rst create mode 100644 doc/users/prev_whats_new/github_stats_3.8.0.rst diff --git a/doc/api/next_api_changes/behavior/27179-KS.rst b/doc/api/next_api_changes/behavior/27179-KS.rst deleted file mode 100644 index 873cd622bbd4..000000000000 --- a/doc/api/next_api_changes/behavior/27179-KS.rst +++ /dev/null @@ -1,7 +0,0 @@ -Default behavior of ``hexbin`` with *C* provided requires at least 1 point -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The behavior changed in 3.8.0 to be inclusive of *mincnt*. However that resulted in -errors or warnings with some reduction functions, so now the default is to require at -least 1 point to call the reduction function. This effectively restores the default -behavior to match that of Matplotlib 3.7 and before. diff --git a/doc/api/next_api_changes/deprecations/27088-JK.rst b/doc/api/next_api_changes/deprecations/27088-JK.rst deleted file mode 100644 index ea7fef5abf64..000000000000 --- a/doc/api/next_api_changes/deprecations/27088-JK.rst +++ /dev/null @@ -1,5 +0,0 @@ -Deprecations removed in ``contour`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -``contour.allsegs``, ``contour.allkinds``, and ``contour.find_nearest_contour`` are no -longer marked for deprecation. diff --git a/doc/api/next_api_changes/development/26849-KS.rst b/doc/api/next_api_changes/development/26849-KS.rst deleted file mode 100644 index 1a1deda40fca..000000000000 --- a/doc/api/next_api_changes/development/26849-KS.rst +++ /dev/null @@ -1,5 +0,0 @@ -Minimum version of setuptools bumped to 64 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To comply with requirements of ``setuptools_scm``, the minimum version of ``setuptools`` -has been increased from 42 to 64. diff --git a/doc/api/prev_api_changes/api_changes_3.8.1.rst b/doc/api/prev_api_changes/api_changes_3.8.1.rst new file mode 100644 index 000000000000..05715ec39ac9 --- /dev/null +++ b/doc/api/prev_api_changes/api_changes_3.8.1.rst @@ -0,0 +1,33 @@ +API Changes for 3.6.1 +===================== + +Behaviour +--------- + +Default behaviour of ``hexbin`` with *C* provided requires at least 1 point +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The behaviour changed in 3.8.0 to be inclusive of *mincnt*. However, that resulted in +errors or warnings with some reduction functions, so now the default is to require at +least 1 point to call the reduction function. This effectively restores the default +behaviour to match that of Matplotlib 3.7 and before. + + +Deprecations +------------ + +Deprecations removed in ``contour`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``contour.allsegs``, ``contour.allkinds``, and ``contour.find_nearest_contour`` are no +longer marked for deprecation. + + +Development +----------- + +Minimum version of setuptools bumped to 64 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To comply with requirements of ``setuptools_scm``, the minimum version of ``setuptools`` +has been increased from 42 to 64. diff --git a/doc/users/github_stats.rst b/doc/users/github_stats.rst index 8004087482ae..d521df2080fb 100644 --- a/doc/users/github_stats.rst +++ b/doc/users/github_stats.rst @@ -1,1005 +1,171 @@ .. _github-stats: -GitHub statistics for 3.8.0 (Sep 14, 2023) +GitHub statistics for 3.8.1 (Oct 31, 2023) ========================================== -GitHub statistics for 2023/02/13 (tag: v3.7.0) - 2023/09/14 +GitHub statistics for 2023/09/15 (tag: v3.8.0) - 2023/10/31 These lists are automatically generated, and may be incomplete or contain duplicates. -We closed 185 issues and merged 649 pull requests. -The full list can be seen `on GitHub `__ +We closed 24 issues and merged 95 pull requests. +The full list can be seen `on GitHub `__ -The following 146 authors contributed 2914 commits. +The following 27 authors contributed 165 commits. -* 0xedl -* Aalok Chhetri -* Adam J. Stewart -* Adam Turner -* Albert Y. Shih -* Alissa -* Alissa Hodge -* Almar Klein -* Andreas Deininger +* 0taj * Antony Lee -* Artem Shekhovtsov -* Astra -* Ben Root -* Brandon Dusch -* BuildTools -* Caden Gobat -* Chahak Mehta -* Clément Robert -* ColeBurch -* Daniele Nicolodi -* daniilS -* David Kaméus +* Anvi Verma +* Artyom Romanov +* Augusto Borges +* Chiraag Balu * David Stansby * dependabot[bot] -* Devilsaint -* devRD -* Dusch4593 -* DWesl -* Eero Vaher * Elliott Sales de Andrade * Eric Firing -* Eric Larson -* Eric Prestat -* Eric Wieser -* Evgenii Radchenko -* Fabian Joswig -* Felix Goudreault -* Gabriel Madeira -* Gautam Sagar -* Gokberk Gunes +* Gaurav-Kumar-Soni * Greg Lucas -* Hai Zhu +* Gurudatta Shanbhag * hannah -* Haojun Song -* Hasan Rashid -* haval0 -* Higgs32584 -* Ian Hunt-Isaak -* Ian Thomas -* II-Day-II -* Irtaza Khalid -* j1642 -* Jan-Hendrik Müller -* Jarrod Millman +* Hugues Hoppe * Jody Klymak -* Johann Krauter -* John Paul Jepko -* Jonathan Wheeler -* jsdodge -* Julian Chen -* kolibril13 -* krooijers +* Joshua Stevenson +* Junpei Ota +* katotaisei * Kyle Sunden -* Larry Bradley -* LemonBoy -* lganic -* Lukas Schrangl -* luke -* marbled-toast -* mariamalykh -* Marisa Wong -* Mateusz Sokół -* Matt Newville -* matt statham -* Matthew Feickert +* Lucia Korpas * Matthew Morrison -* Matthias Bussonnier -* MeeseeksMachine -* Melissa Weber Mendonça -* melissawm -* Michael Dittrich -* Michael Higgins -* Mubin Manasia -* Mudassir Chapra -* Niranjan -* NISHANT KUMAR -* Noy Hanan -* Olin Johnson * Oscar Gustafsson -* Pavel Zwerschke -* Peter Cock -* Petros Tzathas -* Photoniker -* photoniker -* Pierre Haessig -* Pieter Eendebak -* Prajwal Agrawal -* pre-commit-ci[bot] -* priyanshi -* Priyanshi Gaur -* RadostW -* Rahul Mohan -* Ratnabali Dutta -* rbt94 -* Richard Barnes -* richardsheridan -* RishabhSpark -* Rob Righter -* roberto.bodo -* root * Ruth Comer -* Sam -* saranti -* Scott Shambaugh -* Shreeya Ramesh -* Sia Ghelichkhan -* Sigma-Verma -* Smeet nagda -* SnorfYang -* Stefanie Molin -* Steffen Rehberg -* stevezhang -* stevezhang1999 -* Talha Irfan * Thomas A Caswell -* Thomas J. Fan -* Tigran Khachatryan * Tim Hoffmann -* Tom -* Tom Sarantis -* Tunç Başar Köse -* Utkarsh Verma -* vavanade -* Vishal Pankaj Chandratreya -* vivekvedant -* vizzy_viz -* Vladimir -* Vladimir Ilievski -* Waleed-Abdullah -* weijili -* whyvra -* xtanion -* Y.D.X -* Yi Wei -* yuzie007 -* 渡邉 美希 +* wemi3 GitHub issues and pull requests: -Pull Requests (649): +Pull Requests (95): -* :ghpull:`26777`: Backport PR #26702 on branch v3.8.x (converted coc to rst and put links in code_of_conduct.md) -* :ghpull:`26775`: Backport PR #26767 on branch v3.8.x (Trim Gouraud triangles that contain NaN) -* :ghpull:`26776`: Backport PR #26687 on branch v3.8.x (Remove usage of recarray) -* :ghpull:`26702`: converted coc to rst and put links in code_of_conduct.md -* :ghpull:`26687`: Remove usage of recarray -* :ghpull:`26767`: Trim Gouraud triangles that contain NaN -* :ghpull:`26770`: Backport PR #26762 on branch v3.8.x (MNT: Numpy 2.0 removals from ndarray class) -* :ghpull:`26762`: MNT: Numpy 2.0 removals from ndarray class -* :ghpull:`26769`: DOC: Pin mpl-sphinx-theme to 3.8.x -* :ghpull:`26768`: Backport PR #26700 on branch v3.8.x (Check type for set_clip_box) -* :ghpull:`26700`: Check type for set_clip_box -* :ghpull:`26766`: Backport PR #26763 on branch v3.8.x (DOC: Add redirects for old gitwash files) -* :ghpull:`26763`: DOC: Add redirects for old gitwash files -* :ghpull:`26756`: Pin numpy to <2 for 3.8.0 -* :ghpull:`26761`: Merge branch v3.7.x into v3.8.x -* :ghpull:`26757`: Backport PR #26628 on branch v3.8.x (DOC: move install related FAQ to install docs) -* :ghpull:`26628`: DOC: move install related FAQ to install docs -* :ghpull:`26753`: Backport PR #26705 on branch v3.8.x ([Doc] Small fixes found by velin) -* :ghpull:`26705`: [Doc] Small fixes found by velin -* :ghpull:`26746`: Backport PR #26671 on branch v3.8.x ([DOC] Enhance API reference index) -* :ghpull:`26671`: [DOC] Enhance API reference index -* :ghpull:`26740`: Backport PR #26676 on branch v3.8.x ([DOC] Slightly improve the LineCollection docstring) -* :ghpull:`26676`: [DOC] Slightly improve the LineCollection docstring -* :ghpull:`26712`: Backport PR #26491 on branch v3.8.x (TYP: Add common-type overloads of subplot_mosaic) -* :ghpull:`26726`: Backport PR #26719 on branch v3.8.x (Fix issue with missing attribute in Path3DCollection) -* :ghpull:`26724`: Backport PR #26721 on branch v3.8.x (Add a Python 3.12 classifier) -* :ghpull:`26711`: Backport PR #26709 on branch v3.8.x (DOC: consistency in docstrings of formatting of array-like) -* :ghpull:`26491`: TYP: Add common-type overloads of subplot_mosaic -* :ghpull:`26709`: DOC: consistency in docstrings of formatting of array-like -* :ghpull:`26708`: Backport PR #26601 on branch v3.8.x (Avoid checking limits when updating both min and max for contours) -* :ghpull:`26601`: Avoid checking limits when updating both min and max for contours -* :ghpull:`26701`: Backport PR #26695 on branch v3.8.x (Bump actions/checkout from 3 to 4) -* :ghpull:`26695`: Bump actions/checkout from 3 to 4 -* :ghpull:`26694`: Backport PR #26689 on branch v3.8.x (Fix error generation for missing pgf.texsystem.) -* :ghpull:`26522`: TST: Add failing test -* :ghpull:`26689`: Fix error generation for missing pgf.texsystem. -* :ghpull:`26688`: Backport PR #26680 on branch v3.8.x (Fix flaky CI tests) -* :ghpull:`26680`: Fix flaky CI tests -* :ghpull:`26675`: Backport PR #26665 on branch v3.8.x (Clarify loading of backend FigureCanvas and show().) -* :ghpull:`26673`: Backport PR #26193 on branch v3.8.x (Sort tex2uni data in mathtext) -* :ghpull:`26665`: Clarify loading of backend FigureCanvas and show(). -* :ghpull:`26193`: Sort tex2uni data in mathtext -* :ghpull:`26663`: Backport PR #26245 on branch v3.8.x ([pre-commit.ci] pre-commit autoupdate) -* :ghpull:`26668`: Backport PR #26541 on branch v3.8.x (TYP: Add typing on mathtext internals) -* :ghpull:`26666`: Backport PR #26657 on branch v3.8.x (DOC: Fix some small issues) -* :ghpull:`26541`: TYP: Add typing on mathtext internals -* :ghpull:`26662`: Backport PR #26542 on branch v3.8.x (TST: Ensure test_webagg subprocess is terminated) -* :ghpull:`26661`: Backport PR #26566 on branch v3.8.x (MAINT: Numpy 2.0 deprecations for row_stack and in1d) -* :ghpull:`26657`: DOC: Fix some small issues -* :ghpull:`26660`: Backport PR #26656 on branch v3.8.x (TYP: Fix some small bugs) -* :ghpull:`26659`: Backport PR #26470 on branch v3.8.x ([DOC]: mathtext tutorial-consolidate explain and notes) -* :ghpull:`26245`: [pre-commit.ci] pre-commit autoupdate -* :ghpull:`26658`: Backport PR #26608 on branch v3.8.x (Removed unnecessary origin keywords) -* :ghpull:`26542`: TST: Ensure test_webagg subprocess is terminated -* :ghpull:`26566`: MAINT: Numpy 2.0 deprecations for row_stack and in1d -* :ghpull:`26656`: TYP: Fix some small bugs -* :ghpull:`26651`: Backport PR #26348 on branch v3.8.x (Test some untested Locator code) -* :ghpull:`26470`: [DOC]: mathtext tutorial-consolidate explain and notes -* :ghpull:`26608`: Removed unnecessary origin keywords -* :ghpull:`26655`: Backport PR #26649 on branch v3.8.x ([DOC] Remove "Discouraged" notices that have been superseded by deprecation) -* :ghpull:`26654`: Backport PR #26597 on branch v3.8.x (Squeeze post-converted values when validating limits) -* :ghpull:`26652`: Backport PR #26646 on branch v3.8.x (Use standard method for closing QApp when last window is closed.) -* :ghpull:`26648`: Backport PR #26521 on branch v3.8.x (Replaced list with tuple in pyplot for axes) -* :ghpull:`26649`: [DOC] Remove "Discouraged" notices that have been superseded by deprecation -* :ghpull:`26647`: Backport PR #26582 on branch v3.8.x (MNT: Enable wheels for Python 3.12) -* :ghpull:`26646`: Use standard method for closing QApp when last window is closed. -* :ghpull:`26650`: Backport PR #26635 on branch v3.8.x ([MNT] Do not configure axes properties via subplots(..., subplot_kw={...})) -* :ghpull:`26644`: Backport PR #26641 on branch v3.8.x ([Doc] Add ACCEPTS for some Axes set methods) -* :ghpull:`26348`: Test some untested Locator code -* :ghpull:`26635`: [MNT] Do not configure axes properties via subplots(..., subplot_kw={...}) -* :ghpull:`26521`: Replaced list with tuple in pyplot for axes -* :ghpull:`26643`: Backport PR #26636 on branch v3.8.x ([Doc] Improve set_layout_engine docs) -* :ghpull:`26641`: [Doc] Add ACCEPTS for some Axes set methods -* :ghpull:`26640`: Backport PR #24209 on branch v3.8.x (List the webagg_core module in the sphinx docs.) -* :ghpull:`26638`: Backport PR #26633 on branch v3.8.x ([Doc] Shorten documentation links in widgets) -* :ghpull:`26636`: [Doc] Improve set_layout_engine docs -* :ghpull:`24209`: List the webagg_core module in the sphinx docs. -* :ghpull:`26633`: [Doc] Shorten documentation links in widgets -* :ghpull:`26632`: Backport PR #26540 on branch v3.8.x (TYP: Add overloads for FT2Font.get_sfnt_table) -* :ghpull:`26631`: Backport PR #26619 on branch v3.8.x ([DOC] Clarify some tick-related docstrings) -* :ghpull:`26540`: TYP: Add overloads for FT2Font.get_sfnt_table -* :ghpull:`26619`: [DOC] Clarify some tick-related docstrings -* :ghpull:`26625`: Backport PR #26622 on branch v3.8.x ([Doc] Improve DSP-related examples) -* :ghpull:`26622`: [Doc] Improve DSP-related examples -* :ghpull:`26618`: Backport PR #24711 on branch v3.8.x (Test with Python 3.12) -* :ghpull:`26617`: Backport PR #26598 on branch v3.8.x (FIX: array labelcolor for Tick) -* :ghpull:`26615`: Backport PR #26614 on branch v3.8.x (Properly disconnect machinery when removing child axes.) -* :ghpull:`26614`: Properly disconnect machinery when removing child axes. -* :ghpull:`24711`: Test with Python 3.12 -* :ghpull:`26607`: Backport PR #26606 on branch v3.8.x ([Doc] Revise histogram features example (Closes #26604)) -* :ghpull:`26606`: [Doc] Revise histogram features example (Closes #26604) -* :ghpull:`26599`: Backport PR #26565 on branch v3.8.x ([doc]: added section Verify installation) -* :ghpull:`26565`: [doc]: added section Verify installation -* :ghpull:`26595`: Backport PR #26591 on branch v3.8.x (Fix ToolBase.figure property setter.) -* :ghpull:`26591`: Fix ToolBase.figure property setter. -* :ghpull:`26584`: Backport PR #26581 on branch v3.8.x (Deduplicate test for toolbar button icon LA mode.) -* :ghpull:`26585`: Backport PR #26576 on branch v3.8.x (Use sys.platform over os.name) -* :ghpull:`26583`: Backport PR #26578 on branch v3.8.x (MAINT: add __pycache__/ to .gitignore) -* :ghpull:`26576`: Use sys.platform over os.name -* :ghpull:`26581`: Deduplicate test for toolbar button icon LA mode. -* :ghpull:`26578`: MAINT: add __pycache__/ to .gitignore -* :ghpull:`26579`: Backport PR #26572 on branch v3.8.x ([DOC]: clarify pre-commits and editing workflow) -* :ghpull:`26572`: [DOC]: clarify pre-commits and editing workflow -* :ghpull:`26575`: Backport PR #26573 on branch v3.8.x ([DOC]: codespace link in contribute index) -* :ghpull:`26573`: [DOC]: codespace link in contribute index -* :ghpull:`26568`: Backport PR #26462 on branch v3.8.x (Boxplot fix median line extending past box boundaries #19409) -* :ghpull:`26416`: [doc]: add 'validate' section to install docs #26379 -* :ghpull:`26564`: Backport PR #26543 on branch v3.8.x (Add ninja to Cygwin builder) -* :ghpull:`26462`: Boxplot fix median line extending past box boundaries #19409 -* :ghpull:`26563`: Backport PR #26519 on branch v3.8.x (Fix mathtext mismatched braces) -* :ghpull:`26543`: Add ninja to Cygwin builder -* :ghpull:`26519`: Fix mathtext mismatched braces -* :ghpull:`26556`: Backport PR #26554 on branch v3.8.x (Remove NumPy abs overrides from pylab) -* :ghpull:`26550`: Backport PR #26545 on branch v3.8.x (Fix size inferral when using cairocffi) -* :ghpull:`26547`: Backport PR #26493 on branch v3.8.x (Disable ````add_html_cache_busting```` on Sphinx 7.1+) -* :ghpull:`26546`: Backport PR #26201 on branch v3.8.x (DOC: Add documentation on codespaces usage) -* :ghpull:`26548`: Backport PR #26514 on branch v3.8.x (Clarify interaction between params of get_path_collection_extents.) -* :ghpull:`26514`: Clarify interaction between params of get_path_collection_extents. -* :ghpull:`26537`: Backport PR #26529 on branch v3.8.x (Fix MathText antialiasing) -* :ghpull:`26536`: Backport PR #26532 on branch v3.8.x (Fix input check in Poly3DCollection.__init__) -* :ghpull:`26529`: Fix MathText antialiasing -* :ghpull:`26534`: Backport PR #26513 on branch v3.8.x (Tweak shape repr in _api.check_shape error message.) -* :ghpull:`26533`: Backport PR #26526 on branch v3.8.x (Bump pypa/cibuildwheel from 2.14.1 to 2.15.0) -* :ghpull:`26513`: Tweak shape repr in _api.check_shape error message. -* :ghpull:`26526`: Bump pypa/cibuildwheel from 2.14.1 to 2.15.0 -* :ghpull:`26201`: DOC: Add documentation on codespaces usage -* :ghpull:`26530`: Backport PR #26509 on branch v3.8.x (Update/tweak SpanSelector docs.) -* :ghpull:`26509`: Update/tweak SpanSelector docs. -* :ghpull:`26528`: Backport PR #26504 on branch v3.8.x (TYP: Add overload to specify output of Colormap.__call__ when possible) -* :ghpull:`26527`: Backport PR #26173 on branch v3.8.x (Synchronize mathtext docs and handling) -* :ghpull:`26504`: TYP: Add overload to specify output of Colormap.__call__ when possible -* :ghpull:`26173`: Synchronize mathtext docs and handling -* :ghpull:`26511`: Backport PR #26490 on branch v3.8.x (Import PIL.Image explicitly over PIL) -* :ghpull:`26490`: Import PIL.Image explicitly over PIL -* :ghpull:`26503`: Backport PR #26502 on branch v3.8.x (TST: Increase some tolerances for non-x86 arches) -* :ghpull:`26502`: TST: Increase some tolerances for non-x86 arches -* :ghpull:`26499`: Backport PR #26498 on branch v3.8.x (Add plausible analytics to the documentation pages) -* :ghpull:`26498`: Add plausible analytics to the documentation pages -* :ghpull:`26493`: Disable ````add_html_cache_busting```` on Sphinx 7.1+ -* :ghpull:`26489`: Backport PR #26487 on branch v3.8.x (DOC: Remove unused image rotator) -* :ghpull:`26487`: DOC: Remove unused image rotator -* :ghpull:`26479`: ps: Add option to use figure size as paper size -* :ghpull:`26469`: Deprecate PdfPages(keep_empty=True). -* :ghpull:`24379`: DOC: Update dropped splines example -* :ghpull:`26326`: Only do pchanged and set stale when value changes + doc consistency -* :ghpull:`26443`: BLD: stop skipping musl wheel builds -* :ghpull:`26475`: [DOC]: Noto Sans for windows docs builds -* :ghpull:`26481`: Clarify behavior of norm clipping -* :ghpull:`26474`: [DOC]: filter non-gui backend warnings when building docs -* :ghpull:`26480`: [DOC] Documentation fixes -* :ghpull:`26476`: Remove auto from supported ps.papersizes in matplotlibrc. -* :ghpull:`25966`: Fix support for Ctrl-C on the macosx backend. -* :ghpull:`26473`: Fix codespaces setup.sh script -* :ghpull:`24376`: Support removing inner ticks in label_outer() -* :ghpull:`25785`: Deprecate papersize=auto in PostScript -* :ghpull:`26472`: Do not close figures on backend switch. -* :ghpull:`26402`: Restructure interface section of API Reference index page -* :ghpull:`26467`: MNT: Adjust for upcoming numpy repr changes -* :ghpull:`26451`: TYP: Add several missing return type annotations -* :ghpull:`26466`: Make annotate/OffsetFrom unaffected by later mutation of coordinates. -* :ghpull:`26445`: [DOC]: annotation tutorial: blended artist, headers, and user demo deletes -* :ghpull:`26454`: Rename an internal parameter of _label_outer_x/yaxis() -* :ghpull:`26130`: Enable branch coverage for C/C++ code -* :ghpull:`26448`: [DOC] Update dependency documentation -* :ghpull:`26450`: Fix return value of Text.update -* :ghpull:`26447`: DOC: Fix accidental cases of blockquotes -* :ghpull:`26401`: WARN: more direct warning ticklabels -* :ghpull:`26444`: Fix some bugs found by typing -* :ghpull:`26253`: Filter out inf values in plot_surface -* :ghpull:`26407`: Improve some smaller typing issues -* :ghpull:`26328`: [DOC]: improve consistency of plot types gallery -* :ghpull:`26434`: TYP: Adjust type hint of Norm.__call__ to return masked array -* :ghpull:`26376`: Text antialiasing for mathtext (reopen) -* :ghpull:`25830`: Specify ticks and axis label positions for 3D plots -* :ghpull:`25784`: ps: Fix anchoring of rotated usetex text -* :ghpull:`26403`: Update type hints for font manager and extension -* :ghpull:`26433`: Call out which pane is hovered over for 3d hover coordinates -* :ghpull:`26418`: Add next_whats_new entries for mathtext features -* :ghpull:`26429`: DOC: update ContourSet attributes deprecation advice -* :ghpull:`26051`: Type hinting developer docs -* :ghpull:`26427`: Improve button widget examples a bit -* :ghpull:`26423`: Fix pyparsing version check -* :ghpull:`26425`: Delete second MRI demo example -* :ghpull:`26424`: macos: Don't leak None in Timer cleanup -* :ghpull:`26332`: moved doc root to landing page, make user landing a guide page -* :ghpull:`26408`: DOC: add note about manually downloading qhull + freetype -* :ghpull:`26404`: Remove old What's new entries -* :ghpull:`26011`: Emit xlim_changed on shared axes. -* :ghpull:`25810`: Fix default return of Collection.get_{cap,join}style -* :ghpull:`26168`: Add _val_or_rc-function -* :ghpull:`26335`: Optimize imshow -* :ghpull:`26367`: Add typing for internal helpers -* :ghpull:`26397`: TYP: Add type hints to testing module -* :ghpull:`26399`: Reinstate & deprecate ContourSet.antialiased -* :ghpull:`26385`: Improve typing in pyplot -* :ghpull:`26151`: Add substack cmd for mathtext -* :ghpull:`26396`: Move pylab documentation to its own module page -* :ghpull:`26393`: TST: Remove extra dummy Axis classes -* :ghpull:`26384`: Fix triage tool due to Qt bump to 5.12 -* :ghpull:`26382`: Tweak hist2d docstring. -* :ghpull:`26359`: Simplify MRI with EEG example -* :ghpull:`26071`: ENH: macosx allow figures to be opened in tabs or windows -* :ghpull:`16473`: Make ``.axis(zmin=...)`` work on 3D axes -* :ghpull:`26333`: Add middle for delims -* :ghpull:`26365`: Fix removal of Figure-level artists -* :ghpull:`26341`: Fix pickling of axes property cycle. -* :ghpull:`26279`: DOC: remove users_explain/axis -* :ghpull:`26347`: Add tests for LogFormatter.format_data and format_data_short -* :ghpull:`26329`: Clarify that ImageGrid requires limits-sharing. -* :ghpull:`26349`: Tweak Sankey docs. -* :ghpull:`26352`: Fix bad histogramming bins in mri/eeg example. -* :ghpull:`26353`: Remove unused private method -* :ghpull:`26342`: ENH: Collection.set_paths -* :ghpull:`26344`: Some more micro optimizations -* :ghpull:`26346`: Increase coverage -* :ghpull:`26330`: Deprecate wrappers combining axes_grid1 and axisartist. -* :ghpull:`26338`: Bump pypa/cibuildwheel from 2.14.0 to 2.14.1 -* :ghpull:`26331`: Support standard Axes in RGBAxes. -* :ghpull:`26219`: DOC: Restore banner indicating docs are unreleased -* :ghpull:`25558`: Simplify outdated Image.contains check. -* :ghpull:`26324`: More micro optimizations of plot -* :ghpull:`26325`: Remove unused variables -* :ghpull:`26022`: MNT/FIX: macosx change Timer to NSTimer instance -* :ghpull:`26303`: Micro optimization of plotting -* :ghpull:`26249`: FIX: axes3d.scatter color parameter doesn't decrease in size for non-finite coordinate inputs. -* :ghpull:`26078`: Fix parasite_axes does not properly handle units -* :ghpull:`25839`: [ENH]: int / float-tuple like kwarg legend(loc) for rcParams['legend.loc'] -* :ghpull:`26056`: Privatize TexManager.texcache -* :ghpull:`25363`: Bump minimum QT5 version to 5.12 -* :ghpull:`26176`: Add more sizeable delimiters -* :ghpull:`26302`: FIX: move the font lock higher up the call and class tree -* :ghpull:`26309`: qt: Mark canvas for re-draw after savefig -* :ghpull:`26311`: FIX: labels at start of contours -* :ghpull:`26278`: ENH: clip_path keyword for contour and contourf -* :ghpull:`26295`: Deprecate inset_locator.InsetPosition. -* :ghpull:`26122`: Only change axes aspect in imshow if image transform is/contains transData -* :ghpull:`26297`: Use transformed paths for contour labelling decisions -* :ghpull:`26160`: add setters and getters for _AxLine's xy1, xy2 and slope parameters -* :ghpull:`26294`: Deprecate cbook.Stack. -* :ghpull:`26284`: Bump pypa/cibuildwheel from 2.13.1 to 2.14.0 -* :ghpull:`25661`: boldsymbol support for mathtext -* :ghpull:`26285`: Improve exception message for set_ticks() kwargs without labels -* :ghpull:`14593`: Simplify SecondaryAxis.set_color. -* :ghpull:`26273`: TST: simplify mask in pcolor writing to mask test -* :ghpull:`26263`: Doc fix toc users -* :ghpull:`26242`: Deprecate FigureCanvasBase.switch_backends. -* :ghpull:`26164`: Only clear Axis once when creating an Axes -* :ghpull:`26035`: issue #26031 - [MNT]: decrease timeout on interactive tests locally -* :ghpull:`23485`: Fix displayed 3d coordinates showing gibberish -* :ghpull:`25027`: Make pcolor more mesh-like -* :ghpull:`26235`: MNT:Decreased timeout for local interactive tests -* :ghpull:`26270`: Merge v3.7.x into main -* :ghpull:`26269`: DOC: Fix image_rotator -* :ghpull:`26265`: DOC: ensure that the bounding box is scaled with dpi in example -* :ghpull:`26255`: DOC: Modernize Colorbar Tick Labelling example -* :ghpull:`26258`: DOC: fix rst formatting -* :ghpull:`26257`: DOC: Clarify terminology -* :ghpull:`26256`: Better document the ContourSet API change. -* :ghpull:`26254`: DOC: Improve readability of date formatters/locators example -* :ghpull:`26233`: DOC: replaced step with stairs in basic plot types -* :ghpull:`26213`: Add ``CITATION.cff`` file -* :ghpull:`26226`: Use CLOSEPOLY kind code to close tricontourf polygons -* :ghpull:`26208`: FIX: also copy the axis units when creating twins -* :ghpull:`26185`: Set transform for offset text in 3d -* :ghpull:`26068`: Rewrite Tick formatters example -* :ghpull:`26218`: moved minimum dependencies to maintenance section -* :ghpull:`26217`: Doc/rm maintainer wf -* :ghpull:`26212`: Avoid deprecated typing hints -* :ghpull:`26198`: Limit Forward references in Mathtext parser -* :ghpull:`26210`: Re-export textpath types in text -* :ghpull:`25247`: Turn ContourSet into a standard Collection artist. -* :ghpull:`26204`: ci: Add tzdata to nightly builds -* :ghpull:`26200`: [Doc] Add note about (str, alpha) version added -* :ghpull:`26171`: precommit warns on main + instructions for fix -* :ghpull:`26189`: Factor out legend/figlegend nargs validation. -* :ghpull:`26199`: ci: Fix typo for nightly builds -* :ghpull:`26197`: CI: Add pre-release installs to upcoming tests -* :ghpull:`26086`: reorganize contributing landing page -* :ghpull:`17497`: Dedupe some C++ templates -* :ghpull:`26190`: Deprecate removal of explicit legend handles whose label starts with _. -* :ghpull:`26188`: Add note to remove texts in baselines when they are regenerated. -* :ghpull:`25714`: Fix ffmpeg framerates -* :ghpull:`26142`: [Doc] alphabetize mathtext symbols by unicode -* :ghpull:`25933`: Relational Operators for mathtext -* :ghpull:`26159`: DOC: Remove unused static images -* :ghpull:`25913`: DOC: contributing and documenting clean ups + community for incubator invites -* :ghpull:`26141`: Doc cards user explain -* :ghpull:`26110`: DOC: fix levels in user/explain/figure -* :ghpull:`26102`: Start basing mathtext tutorial on mathtext parser -* :ghpull:`26138`: MNT: add VNClte porte by default -* :ghpull:`26089`: Add public method to update ``Legend`` object's loc property . -* :ghpull:`26137`: Add codespaces configuration -* :ghpull:`25548`: FIX: macosx keep track of mouse up/down for cursor hand changes -* :ghpull:`26132`: MNT: remove test images from mathtext tests that have been removed -* :ghpull:`26125`: Stop building universal2 and win32 wheels -* :ghpull:`26105`: Doc user guide cards -* :ghpull:`26128`: Add missing spacer in tk toolmanager toolbar. -* :ghpull:`26129`: Remove outdated comment in ``Artist.__getstate__`` -* :ghpull:`25631`: API: forbid unsafe savefig kwargs to AbstractMovieWriter.grab_frame -* :ghpull:`25926`: DOC: restore navigation documentation -* :ghpull:`24666`: Setting color of legend shadow -* :ghpull:`26010`: Correct Unicode for [lg]napprox -* :ghpull:`26120`: Fix new warnings in compiled extensions -* :ghpull:`26060`: Mnt: GUI tests -* :ghpull:`25623`: Use classic style in old what's new entries -* :ghpull:`26113`: Fixes #12926 - inconsistency upon passing C in hexbin -* :ghpull:`25555`: Let widgets/clabel better handle overlapping axes. -* :ghpull:`26114`: Bump pypa/cibuildwheel from 2.13.0 to 2.13.1 -* :ghpull:`26112`: Skip tests for users-explain gallery -* :ghpull:`26111`: [MNT] Update nightly wheels install location -* :ghpull:`25779`: Adding ellipse_arrow.py example and closes #25477 -* :ghpull:`26101`: Correct bounding box calculation for text markers -* :ghpull:`26096`: FIX: Handle masked arrays for RGBA input with ScalarMappables -* :ghpull:`26024`: Add missing operators code -* :ghpull:`26072`: Pcolormesh with Gouraud shading: masked arrays -* :ghpull:`25381`: ENH: switch mpl_toolkits to implicit namespace package (PEP 420) -* :ghpull:`26070`: Factor out common checks for set_data in various Image subclasses. -* :ghpull:`26091`: Shorten axes_grid1 inset_locator code. -* :ghpull:`26090`: ci: Move Python 3.11 job to Ubuntu 22.04 -* :ghpull:`21054`: Deprecate many single-use rc validators. -* :ghpull:`26065`: Install extra requirements when testing with 3.11 on GH -* :ghpull:`26080`: Deprecate unused "frac" key in annotate() arrowprops. -* :ghpull:`25248`: added Ishikawa plot in response to issue #25222 add organizational ch… -* :ghpull:`26064`: add ishikawa diagram to examples -* :ghpull:`26079`: Tweak Annotation docstring. -* :ghpull:`26069`: Tweak AnnotationBbox coords specification. -* :ghpull:`26073`: Cleanup date tick locators and formatters -* :ghpull:`26057`: Further cleanup rainbow_text example. -* :ghpull:`26058`: Don't show type hints in rendered docs -* :ghpull:`26042`: Further simplify AxesGrid._init_locators. -* :ghpull:`25993`: Modify rainbow_text() function to use annotate() function -* :ghpull:`25850`: Handle exceptions in numpy::array_view<...>::set(). -* :ghpull:`25542`: ENH: offset parameter for MultipleLocator -* :ghpull:`25515`: DOC/BLD: plot directive srcset -* :ghpull:`26045`: 'Inactive' workflow: reduce run frequency -* :ghpull:`26047`: PR welcome: getting attention -* :ghpull:`26023`: CI: Use scientific-python/upload-nightly-action -* :ghpull:`25775`: Support customizing antialiasing for text and annotation -* :ghpull:`26036`: Cleanup AxesGrid -* :ghpull:`26025`: MNT: Use commit SHA of cibuildwheel action release -* :ghpull:`25938`: “Inactive” workflow: bump operations to 175 -* :ghpull:`26020`: Let AxesGrid support Axes subclasses that don't override axis(). -* :ghpull:`26017`: MNT: reduce number of implicit imports from toplevel __init__.py -* :ghpull:`26033`: removed wrapping from first-issue-bot -* :ghpull:`26003`: added alias to gray and grey match same colormaps -* :ghpull:`26027`: Correct spelling in 'Good first issue' -* :ghpull:`26026`: Simplify delaxes. -* :ghpull:`26028`: Better document the semantics of get_text_width_height_descent. -* :ghpull:`26018`: good first issue bot rewording -* :ghpull:`13482`: Allow sharing Locators and Formatters across Axises. -* :ghpull:`25950`: Upload nightlies to new location -* :ghpull:`25473`: ci: Merge sdist and wheel building workflows -* :ghpull:`25825`: Fix MarkerStyle types -* :ghpull:`26002`: Bump pypa/cibuildwheel from 2.12.3 to 2.13.0 -* :ghpull:`25999`: "Inactive" workflow: add close label for inactive issues -* :ghpull:`24493`: DOC: dropdowns in userguide -* :ghpull:`25970`: FIX: resolve an issue where no ticks would be drawn for a colorbar with SymLogNorm and ranging exactly from 0 to linthresh -* :ghpull:`25989`: test annotate(textcoords=offset fontsize) -* :ghpull:`25044`: Modify ``hexbin`` to respect :rc:``patch.linewidth`` -* :ghpull:`25667`: Fix bar datetime -* :ghpull:`25794`: Raise on plural scatter -* :ghpull:`25986`: Remove unused/unnecessary parts of _macosx.m View. -* :ghpull:`25689`: Update watermark example -* :ghpull:`25735`: Add comment on issues marked 'good first issue' -* :ghpull:`25968`: Cleanup scalarformatter.py example. -* :ghpull:`18715`: Allow setting default AutoMinorLocator -* :ghpull:`25961`: Fix nightly CI -* :ghpull:`25844`: [TYP] Reduce stubtest ignores -* :ghpull:`25952`: Switch from provision-with-micromamba to setup-micromamba -* :ghpull:`25940`: Cleanups to Annotation. -* :ghpull:`25948`: DOC: don't advocate deleting main branch -* :ghpull:`25939`: Cleanup time_series_histogram example. -* :ghpull:`25883`: Check gridspecness of colorbars on the right figure. -* :ghpull:`25904`: Support spine.set() in SpinesProxy. -* :ghpull:`25909`: #25900 update figure.py -* :ghpull:`25746`: Tick label font family via tick_params -* :ghpull:`25787`: [TYP/MNT] Remove unused imports from stub files -* :ghpull:`25891`: Adds tests for nargs_err in legend, stem, pcolorfast and cycler. -* :ghpull:`25886`: Simplify isort config. -* :ghpull:`25889`: Deprecate CbarAxesBase.toggle_label. -* :ghpull:`25884`: Correctly pass location when constructing ImageGrid colorbar. -* :ghpull:`25888`: Fix incorrect doc references. -* :ghpull:`25885`: Cleanup demo_axes_grid{,2}. -* :ghpull:`25872`: MNT: update Shadow init signature -* :ghpull:`25389`: Add configuration of Shadow and pie shadow -* :ghpull:`25859`: Deprecate passing extra arguments to Figure.add_axes -* :ghpull:`25863`: Fix incorrect usage of nargs_error. -* :ghpull:`25845`: more explicit about what remote means in context -* :ghpull:`23888`: Fix PolygonSelector.clear() -* :ghpull:`25848`: Simplify lasso_demo example. -* :ghpull:`25841`: Deprecate Tick.set_label{1,2}. -* :ghpull:`25728`: Remove and deprecate unused methods in src -* :ghpull:`25843`: Fix invalid range validators. -* :ghpull:`25821`: 3D plots shared view angles -* :ghpull:`25726`: Replace usage of WenQuanYi Zen Hei by Noto Sans CJK -* :ghpull:`25828`: DOC: add remote upstream -* :ghpull:`25814`: [TYP] Correct type hint for Transform.transform return -* :ghpull:`25812`: Fix typo in ruff config -* :ghpull:`25807`: Users guide->User guide -* :ghpull:`25799`: Discourage fontdict -* :ghpull:`25798`: [DOC/TYP]: Allow any array like for set_[xy]ticks, not just list of float -* :ghpull:`25632`: Include data kwarg in pyi stubs -* :ghpull:`25790`: Document default value of corner_mask in the corresponding example. -* :ghpull:`25788`: ci: Increase retry count on PR conflict check -* :ghpull:`25482`: Draw 3D gridlines below axis lines, labels, text, and ticks -* :ghpull:`25607`: Missing return type hints for Figure -* :ghpull:`25783`: Cleanup demo_text_path. -* :ghpull:`25780`: Shorten anchored_artists example. -* :ghpull:`25781`: Deprecate AnchoredEllipse. -* :ghpull:`25786`: DOC: Fix minor typo in API change notes -* :ghpull:`25773`: condensed pull request template -* :ghpull:`25712`: Prevents axes limits from being resized by axes.fill_between -* :ghpull:`25782`: Fix release note reference to pyplot.axis -* :ghpull:`25777`: Cleanup demo_axes_divider. -* :ghpull:`25774`: Small axislines.Axes cleanups. -* :ghpull:`25772`: Only print actually tested QT APIs when erroring -* :ghpull:`25769`: Set PostScript language level to 3 -* :ghpull:`25753`: Update, correct, and add badges/links -* :ghpull:`25747`: Tweak axis_direction demo. -* :ghpull:`23059`: FIX: Decrease figure refcount on close of a macosx figure -* :ghpull:`25606`: [pre-commit.ci] pre-commit autoupdate -* :ghpull:`25752`: Enable lazy-loading of images in HTML docs -* :ghpull:`25648`: Remove nonfunctional Axes3D.set_frame_on and get_frame_on methods. -* :ghpull:`25479`: FIX: Allow different colormap name from registered name -* :ghpull:`25763`: Bump pypa/cibuildwheel from 2.12.1 to 2.12.3 -* :ghpull:`24661`: Plots first and last minor ticks #22331 -* :ghpull:`25759`: Fix typo in api_interfaces.rst -* :ghpull:`20214`: Move AxisArtistHelpers to toplevel. -* :ghpull:`25737`: Update PULL_REQUEST_TEMPLATE.md to include issue cross-reference. -* :ghpull:`25729`: Cleanup GridHelperCurveLinear/GridFinder. -* :ghpull:`25730`: Add test for Path.contains_path -* :ghpull:`25359`: Add bfit bolditalic tex cmd -* :ghpull:`25739`: grammar/wording tweak for backports -* :ghpull:`25597`: Add (color, alpha) tuple as a valid ColorType in typing.py -* :ghpull:`25324`: Fix axes vlines and hlines using wrong coordinates -* :ghpull:`25713`: Remove print_figure overrides in backend subclasses -* :ghpull:`25719`: TYP: Clean up CapStyle/FillStyle type hints -* :ghpull:`25720`: ci: Set apt to retry operations on failure -* :ghpull:`25722`: DOC: Fix duplicated words -* :ghpull:`25584`: Expire remaining 3.6 deprecations -* :ghpull:`25721`: TST: Handle missing black more resiliently -* :ghpull:`25718`: Improve color documentation and typing -* :ghpull:`25652`: DOC: clarify the milestoning and backport policy wording -* :ghpull:`25711`: TYP: allow for xlim/ylim passed as single tuple -* :ghpull:`25594`: changed to RST -* :ghpull:`25708`: Deprecate unused NavigationToolbar2QT signal. -* :ghpull:`25618`: DOC: fix Sphinx Gallery discussion to explain mixed subddirs -* :ghpull:`25710`: TYP: Fix type hint (and docstring) for Bbox.intersection -* :ghpull:`25707`: CI: skip Azure Pipelines for doc-only change -* :ghpull:`25686`: Add Figure methods get_suptitle(), get_subxlabel(), get_supylabel() -* :ghpull:`25697`: Annotation cleanups. -* :ghpull:`25586`: Post stubtest results to GitHub checks -* :ghpull:`25696`: Use true positional args in check_foo APIs instead of simulating them. -* :ghpull:`25698`: Fix codecov.yml so it is valid. -* :ghpull:`25687`: More informative exception messages -* :ghpull:`25692`: Fixed bug: mathtext rendered width not being calculated correctly -* :ghpull:`25690`: TST: Import MatplotlibDeprecationWarning consistently -* :ghpull:`22286`: Fixed ``eventplot`` issues -* :ghpull:`25656`: DOC: update/fix autoscaling documentation -* :ghpull:`25668`: Fix what's new note for text -* :ghpull:`25651`: MNT: deprecate unused numdecs LogLocator param -* :ghpull:`25655`: Clean up FileIO type hints -* :ghpull:`25664`: Fix 'can not' -> 'cannot' typo -* :ghpull:`25657`: Bump cygwin/cygwin-install-action from 3 to 4 -* :ghpull:`25640`: pgf: Add clipping to text outputs -* :ghpull:`25639`: Fixing typos -* :ghpull:`25647`: Pin mypy to v1.1.1 for CI -* :ghpull:`25588`: Rename parameters for consistency -* :ghpull:`25628`: Bump invalid hatch removal -* :ghpull:`25610`: DOC: Update user_explain\text\README.txt to reference example page -* :ghpull:`25587`: Ensure tinypages ignored by mypy/stubtest -* :ghpull:`25609`: Use _api.nargs_error in more places -* :ghpull:`25414`: DOC: add a note about linewidth to scatter docs -* :ghpull:`23199`: Do not set clip path if it exists -* :ghpull:`22173`: Support ``\text`` in ``mathtext`` -* :ghpull:`24312`: Deprecate axes_divider.AxesLocator. -* :ghpull:`24969`: Optimize C code -* :ghpull:`25501`: FIX: Tk photoimage resize -* :ghpull:`25565`: making sure colors has the attribute size -* :ghpull:`25583`: MNT: use less eval -* :ghpull:`25569`: Use raw instead of png for font manager memory leak test -* :ghpull:`25253`: Use pybind11 in ttconv module -* :ghpull:`24976`: Initial implementation of type stubs (mypy/PEP484) -* :ghpull:`25576`: Skip pgf pdflatex text if cm-super is not installed -* :ghpull:`24991`: Fix issue with shared log axis -* :ghpull:`25221`: Add links and expand mathmpl docstring -* :ghpull:`25498`: FIX: Use mappable data when autoscaling colorbar norm -* :ghpull:`25570`: Use symbolic operator names (moveto, lineto) in contour_manual example. -* :ghpull:`25559`: Make guiEvent available only within the event handlers. -* :ghpull:`25405`: Fix incorrect stride calculations in LogLocator.tick_values() -* :ghpull:`25226`: Fix unintended space after comma as a decimal separator -* :ghpull:`25563`: Add pytest==7.0.0 on requirements/testing/minver.txt -* :ghpull:`25553`: FIX: macosx, always put timers on main thread -* :ghpull:`25557`: Rename parameter of Annotation.contains and Legend.contains. -* :ghpull:`25564`: Bump actions/stale from 7 to 8 -* :ghpull:`25562`: Add pytest==3.6.0 on requirements/testing/minver.txt -* :ghpull:`25551`: Restore autolimits status when pressing "home" key. -* :ghpull:`25554`: Remove unused private SpanSelector._pressv and ._prev. -* :ghpull:`25546`: In Artist.contains, check that moussevents occurred on the right canvas. -* :ghpull:`24728`: Add Axes.ecdf() method. -* :ghpull:`25291`: Limit full-invalidation of CompositeGenericTransforms. -* :ghpull:`25550`: "Inactive" workflow: bump operations to 150 -* :ghpull:`25539`: Remove explicit symbol visibility pragmas -* :ghpull:`25502`: DOC: Suggest replacement for tostring_rgb -* :ghpull:`25532`: Annotations tutorial -* :ghpull:`25456`: Expire more mpl3.6 deprecations. -* :ghpull:`25505`: DOC: combine marker examples -* :ghpull:`25510`: Remove unnecessary calls to Formatter.set_locs. -* :ghpull:`25487`: DOC/BLD: stop using sg head [ci doc] -* :ghpull:`25507`: gitignore doc/users/explain -* :ghpull:`25504`: "Inactive" workflow: bump operations to 125 -* :ghpull:`24691`: ENH: Add option to define a color as color=(some_color, some_alpha) -* :ghpull:`25475`: Stop building 32-bit Linux wheels -* :ghpull:`25484`: Deprecate tostring_rgb. -* :ghpull:`25395`: DOC: user/explain reorg (and moving a lot of tutorials). -* :ghpull:`25425`: Added get_shape as an alias for get_size + tests -* :ghpull:`25281`: Bugfix for loc legend validation -* :ghpull:`25469`: Autoload numpy arrays in get_sample_data. -* :ghpull:`25472`: Use get_sample_data(..., asfileobj=False) less. -* :ghpull:`25444`: Adjust parent axes limits when clearing floating axes. -* :ghpull:`25235`: Update release guide instructions post v3.7.0 -* :ghpull:`24531`: Use user-selected format in Tk savefig, rather than inferring it from the filename -* :ghpull:`25467`: DOC: update suptitle example to remove percent_bachelors_degrees csv -* :ghpull:`25454`: Remove unnecessary norm typecheck in tripcolor(). -* :ghpull:`25455`: “Inactive” workflow: bump operations to 100 -* :ghpull:`25464`: Skip Appveyor for doc only change (second attempt) -* :ghpull:`25430`: Edit error messages for when metadata is passed to ``savefig`` -* :ghpull:`23200`: Deprecate empty offsets in get_path_collection_extents -* :ghpull:`25427`: Store FloatingAxes "extremes" info in fewer places. -* :ghpull:`25434`: ci: Install pytz for Pandas nightly wheel -* :ghpull:`25404`: Move _SelectorWidget._props into SpanSelector -* :ghpull:`25421`: wx backend should flush the clipboard before closing it -* :ghpull:`25429`: DOC: remove default logo [ci doc] -* :ghpull:`25423`: DOC/BLD: make logo compatible with pydata-sphinx-theme -* :ghpull:`25424`: “Inactive” workflow: increase operations to 75 -* :ghpull:`25138`: Deprecate QuadContourSet.allsegs, .allkinds, .tcolors, .tlinewidths. -* :ghpull:`25415`: Add links for path types and general improvements -* :ghpull:`25420`: Print incorrect tz argument in error message -* :ghpull:`25413`: Make tk backend use native crosshair cursor -* :ghpull:`24984`: Expire deprecations from 3.6 -* :ghpull:`25380`: Merge 3.7.1 into main -* :ghpull:`24861`: Documentation fixes -* :ghpull:`24649`: Fix loc legend validation -* :ghpull:`25383`: CI: skip appveyor for doc only change -* :ghpull:`25081`: added a note to avoid f-strings in logging -* :ghpull:`25373`: Expire mpl_toolkits deprecations. -* :ghpull:`25387`: Remove LGTM references and minor doc fixes -* :ghpull:`25382`: Correct patheffects doc -* :ghpull:`25378`: "Inactive" workflow: bump operations-per-run -* :ghpull:`25358`: Remove unused menu field from macos NavigationToolbar2. -* :ghpull:`25352`: MNT: Use WeakKeyDictionary and WeakSet in Grouper -* :ghpull:`20649`: Add colour vision deficiency simulation -* :ghpull:`25287`: Fix unmatched offsetText label color -* :ghpull:`25332`: Support pickling of figures with aligned x/y labels. -* :ghpull:`25334`: Fix for all NANs in contour -* :ghpull:`25335`: "Inactive" workflow: fix typo -* :ghpull:`25163`: GitHub: auto set inactive label -* :ghpull:`22816`: FIX: savefig)...,transparent=True) now makes inset_axes transparent a… -* :ghpull:`25316`: Use setattr_cm more. -* :ghpull:`25258`: Document PowerNorm parameters -* :ghpull:`25209`: MNT: re-organize galleries under one subdir -* :ghpull:`25304`: Add import sorting to ``/plot_types`` -* :ghpull:`25296`: Remove straggler 3.7 release notes -* :ghpull:`25147`: Add ruff config to pyproject.toml for devs who are interested -* :ghpull:`25282`: Simplify transforms invalidation system. -* :ghpull:`25270`: merge up 3.7.0 -* :ghpull:`25255`: Make default facecolor for subfigures be transparent ("none"). Fix for issue #24910 -* :ghpull:`25252`: Support make_compound_path concatenating only empty paths. -* :ghpull:`25211`: Em dashes instead of consecutive hyphens. -* :ghpull:`25243`: Cleanup wx docstrings. -* :ghpull:`25261`: [CI] Skip tests on doc-only changes -* :ghpull:`25192`: Expire wx canvas param deprecation -* :ghpull:`25249`: DOC: remove constrained_layout kwarg from tutorials and user guide -* :ghpull:`25232`: Remove a redundant comma in ``AsinhScale`` -* :ghpull:`25195`: DOC: explain how to make a fixed-size axes -* :ghpull:`25207`: Add mpl_round_to_int -* :ghpull:`24983`: Refactor parts of Axis for readability -* :ghpull:`25203`: Replace checking Number with Real -* :ghpull:`25202`: DOC: reorder CI control guidance -* :ghpull:`25200`: Don't handle unknown_symbols in ``\operatorname``. -* :ghpull:`24849`: Stripey ``LineCollection`` -* :ghpull:`25177`: Add locator API links to tick-locators example -* :ghpull:`25166`: Clean + comment MaxNLocator -* :ghpull:`25157`: Small tweak in chapter sorting of the example gallery -* :ghpull:`25099`: Add isort (import sorting) to pre-commit hooks -* :ghpull:`25175`: BLD: Unbreak github tests workflow -* :ghpull:`25125`: Use "array" instead of "numpy array" except when emphasis is needed. -* :ghpull:`25144`: FIX: improve CL description and remove constrained_layout text -* :ghpull:`25101`: Deprecate LocationEvent.lastevent. -* :ghpull:`25152`: Group shape/dtype validation logic in image_resample. -* :ghpull:`25145`: BLD: only doc CI build -* :ghpull:`25153`: Delete redundant examples from user gallery that are also present in the annotations tutorial -* :ghpull:`25156`: On macOS, limit symbols exported by extension modules linking FreeType. -* :ghpull:`25150`: DOC: use 'none' in set_layout_engine -* :ghpull:`25131`: FIX: Correctly report command keypress on mac for Tk + Gtk -* :ghpull:`25112`: Connect stream lines if no varying width or color -* :ghpull:`25142`: Minor style tweaks to freetype build. -* :ghpull:`25143`: Don't special-case getSaveFileName in qt_compat anymore. -* :ghpull:`24436`: Make LogLocator only return one tick out of range -* :ghpull:`25135`: Whisker length, more precise description -* :ghpull:`25100`: add section on annotating an artist using axes.annotate -* :ghpull:`24486`: Minor cleanup and add test for offsetbox -* :ghpull:`24964`: Minor cleanup and optimization of Sketch -* :ghpull:`25121`: Inline ContourSet._make_paths. -* :ghpull:`25120`: Consistently document shapes as (M, N), not MxN. -* :ghpull:`24445`: Makefile html-noplot,clean: constrained layout tutorial image handling -* :ghpull:`25115`: Remove tests.py runner from repo root -* :ghpull:`24866`: write addfont example -* :ghpull:`24638`: MNT: Remove auto-flattening of input data to pcolormesh -* :ghpull:`24985`: Deprecate unused/undocumented functions in proj3d -* :ghpull:`25104`: tk blitting to destroyed canvases should be a noop, not a segfault. -* :ghpull:`25108`: Update flake8 per-file ignores -* :ghpull:`25091`: Caching figures generated by plot directive -* :ghpull:`25096`: Remove unused import of re introduced in #23442 -* :ghpull:`24749`: Support only positional args in contour. Error if no positional argument. -* :ghpull:`23442`: Remove need to detect math mode in pgf strings -* :ghpull:`25023`: Update Release guide to current practices -* :ghpull:`24816`: [FIX]: Make inset axes transparent on savefig(..., transparent=True) -* :ghpull:`24967`: Rewrite bullseye example to use bar() instead of pcolormesh(). -* :ghpull:`24994`: Use ``_axis_map`` instead of ``getattr`` in ``Axes`` and ``Figure`` -* :ghpull:`25087`: feat: add new SI prefixes to ticker -* :ghpull:`25073`: MAINT: don't format logs in log call. -* :ghpull:`25061`: Ensure TwoSlopeNorm always has two slopes -* :ghpull:`25064`: Bump mamba-org/provision-with-micromamba from 14 to 15 -* :ghpull:`25046`: ci: Re-add the login shell to nightlies jobs -* :ghpull:`24980`: Python 3.9 upgrade -* :ghpull:`25035`: ci: Only attempt to upload nightlies from successful builds -* :ghpull:`24995`: Improve 3D quiver test -* :ghpull:`24992`: Bump NumPy to 1.21 -* :ghpull:`25007`: Minor refactoring of Axes3D -* :ghpull:`25021`: Doc: sg section separator -* :ghpull:`25028`: separate out folders in gallery ordering -* :ghpull:`24981`: ENH: pad_inches='layout' for savefig -* :ghpull:`25022`: DOC: tweak array indexing in constrained layout tutorial -* :ghpull:`24990`: Make arguments other than ``renderer`` keyword-only for ``get_tightbbox`` -* :ghpull:`25013`: Clarify/shorten gca management in colorbar(). -* :ghpull:`25003`: Bump cygwin/cygwin-install-action from 2 to 3 -* :ghpull:`24978`: Simplify handling of out-of-bound values ``Colormap.__call__``. -* :ghpull:`24998`: Unbreak Azure CI -* :ghpull:`24907`: DOC/BUILD add ability for conf to skip whole sections -* :ghpull:`22999`: CI: Add a Cygwin run to GHA CI. -* :ghpull:`24919`: Remove support for python 3.8 -* :ghpull:`24942`: Expire module deprecations -* :ghpull:`24943`: Remove special casing for PyPy not required anymore -* :ghpull:`24929`: Small unrelated cleanups/style fixes. -* :ghpull:`24923`: Cleanup cbook deprecations and layout -* :ghpull:`24920`: Add --only-binary to nightly pip install -* :ghpull:`24913`: Deprecate Bbox.anchored() with no container. -* :ghpull:`24905`: Remove some long-obsolete commented code in grid_helper_curvelinear. +* :ghpull:`27239`: Backport PR #27237 on branch v3.8.x (DOC: Add command to install appropriate ``requirements.txt`` during dev venv setup) +* :ghpull:`27238`: Backport PR #27165 on branch v3.8.x (Fixing Matplotlib Notebook Text) +* :ghpull:`27165`: Fixing Matplotlib Notebook Text +* :ghpull:`27229`: Backport PR #27226 on branch v3.8.x (DOC: link out to troubleshooting guide in install) +* :ghpull:`27226`: DOC: link out to troubleshooting guide in install +* :ghpull:`27227`: Backport PR #27221 on branch v3.8.x (FIX: Enable interrupts on macosx event loops) +* :ghpull:`27221`: FIX: Enable interrupts on macosx event loops +* :ghpull:`27220`: Backport PR #27217 on branch v3.8.x: Fix type hints for undeprecated contour APIs +* :ghpull:`27217`: Fix type hints for undeprecated contour APIs +* :ghpull:`27212`: Backport PR #27088 on branch v3.8.x (Update ``find_nearest_contour`` and revert contour deprecations) +* :ghpull:`27207`: Backport PR #26970 on branch v3.8.x (FIX: Add PyOS_InputHook back to macos backend) +* :ghpull:`27088`: Update ``find_nearest_contour`` and revert contour deprecations +* :ghpull:`27206`: Backport PR #27205 on branch v3.8.x (Improve legend picking example) +* :ghpull:`26970`: FIX: Add PyOS_InputHook back to macos backend +* :ghpull:`27205`: Improve legend picking example +* :ghpull:`27202`: Backport PR #27178 on branch v3.8.x (Try/except import of Axes3D) +* :ghpull:`27178`: Try/except import of Axes3D +* :ghpull:`27201`: Backport PR #27179 on branch v3.8.x (Restore default behavior of hexbin mincnt with C provided) +* :ghpull:`27197`: Backport PR #27045 on branch v3.8.x (Ensure valid path mangling for ContourLabeler) +* :ghpull:`27179`: Restore default behavior of hexbin mincnt with C provided +* :ghpull:`27045`: Ensure valid path mangling for ContourLabeler +* :ghpull:`27191`: Backport PR #27189 on branch v3.8.x (Fix typo in docstring of ``matplotlib.colors.from_levels_and_colors``) +* :ghpull:`27189`: Fix typo in docstring of ``matplotlib.colors.from_levels_and_colors`` +* :ghpull:`27154`: Backport PR #27153 on branch v3.8.x (Link xkcd color survey in named colors example) +* :ghpull:`27133`: Backport PR #27132 on branch v3.8.x (changed automated tests from subsection to section in workflow) +* :ghpull:`27131`: Backport PR #27118 on branch v3.8.x (Update developer release guide to follow conventions) +* :ghpull:`27118`: Update developer release guide to follow conventions +* :ghpull:`27122`: Backport PR #26930 on branch v3.8.x (Added documentation on getting full list of registered colormaps re: issue #26244) +* :ghpull:`26930`: Added documentation on getting full list of registered colormaps re: issue #26244 +* :ghpull:`27113`: Backport PR #27039 on branch v3.8.x (Formatted docs) +* :ghpull:`27039`: Formatted release note docs +* :ghpull:`27101`: Backport PR #27096 on branch v3.8.x (make fonts.py, mathtext.py, text_intro.py confirm to docs guidelines) +* :ghpull:`27097`: Backport PR #27093 on branch v3.8.x ([Doc]: Move Automated Tests section to workflow docs #26998) +* :ghpull:`27065`: Backport PR #26943 on branch v3.8.x (ci: Run mypy against typed cycler) +* :ghpull:`26943`: ci: Run mypy against typed cycler +* :ghpull:`27060`: Backport PR #27059: ci: Clean up Python 3.12 builds +* :ghpull:`27057`: Backport PR #27040 on branch v3.8.x (Bump pypa/cibuildwheel from 2.16.1 to 2.16.2) +* :ghpull:`27059`: ci: Clean up Python 3.12 builds +* :ghpull:`27055`: Backport PR #27054 on branch v3.8.x (updated interactive.rst) +* :ghpull:`27052`: Backport PR #27036 on branch v3.8.x (updated artist_intro.rst) +* :ghpull:`27051`: Backport PR #26995 on branch v3.8.x (user/project/citing updated) +* :ghpull:`27046`: Backport PR #27043 on branch v3.8.x (updated api_interfaces.rst) +* :ghpull:`27040`: Bump pypa/cibuildwheel from 2.16.1 to 2.16.2 +* :ghpull:`27041`: Backport PR #26908 on branch v3.8.x (``allsegs`` and ``allkinds`` return individual segments) +* :ghpull:`26908`: ``allsegs`` and ``allkinds`` return individual segments +* :ghpull:`27034`: Backport PR #27017 on branch v3.8.x (DOC: clarify usetex versus mathtext) +* :ghpull:`27017`: DOC: clarify usetex versus mathtext +* :ghpull:`27031`: Backport PR #27015 on branch v3.8.x (ValueError exception added to handle mix of {} and % string in colorbar format) +* :ghpull:`27015`: ValueError exception added to handle mix of {} and % string in colorbar format +* :ghpull:`27022`: BLD: Remove development dependencies from sdists +* :ghpull:`27023`: Backport PR #26883 on branch v3.8.x ([TYP] Type changes from running against Pandas) +* :ghpull:`26883`: [TYP] Type changes from running against Pandas +* :ghpull:`27018`: Backport PR #26961 on branch v3.8.x (DOC: made "open PR on MPL" a section in contribute guide) +* :ghpull:`27009`: Backport PR #27006 on branch v3.8.x (DOC: Fix resizing of animation examples) +* :ghpull:`26999`: Backport PR #26940 on branch v3.8.x (Add typing to pyplot.show() to avoid errors with mypy --strict.) +* :ghpull:`27000`: Backport PR #26605 on branch v3.8.x (ci: Install GTK4 from brew on macOS) +* :ghpull:`26982`: Backport PR #26976 on branch v3.8.x (Bump pypa/cibuildwheel from 2.16.0 to 2.16.1) +* :ghpull:`26940`: Add typing to pyplot.show() to avoid errors with mypy --strict. +* :ghpull:`26997`: Backport PR #26850 on branch v3.8.x (DOC: Fix missing-reference generation on Windows) +* :ghpull:`26860`: Backport PR #26849 on branch v3.8.x (Bump setuptools required version because of setuptools_scm v8) +* :ghpull:`26850`: DOC: Fix missing-reference generation on Windows +* :ghpull:`26987`: Backport PR #26985 on branch v3.8.x (Reformatted documentation under toolkits and tutorials directory ) +* :ghpull:`26979`: Backport PR #26959 on branch v3.8.x (Move papersize="auto" deprecation to backend_bases.) +* :ghpull:`26976`: Bump pypa/cibuildwheel from 2.16.0 to 2.16.1 +* :ghpull:`26959`: Move papersize="auto" deprecation to backend_bases. +* :ghpull:`26939`: Backport PR #26937 on branch v3.8.x (Add ArrayLike to scatter c arg type hint) +* :ghpull:`26964`: Backport PR #26952 on branch v3.8.x (FIX 2-tuple of colors in to_rgba_array) +* :ghpull:`26956`: Backport PR #26955 on branch v3.8.x (Fix incorrect skip check in test_backend_ps.) +* :ghpull:`26952`: FIX 2-tuple of colors in to_rgba_array +* :ghpull:`26955`: Fix incorrect skip check in test_backend_ps. +* :ghpull:`26945`: Backport PR #26927 on branch v3.8.x ([TYP] Remove some stubtest allowlist entries) +* :ghpull:`26927`: [TYP] Remove some stubtest allowlist entries +* :ghpull:`26937`: Add ArrayLike to scatter c arg type hint +* :ghpull:`26933`: Backport PR #26914 on branch v3.8.x (DOC: add a couple more placement examples, crosslink axes_grid [ci doc]) +* :ghpull:`26849`: Bump setuptools required version because of setuptools_scm v8 +* :ghpull:`26844`: Backport PR #26843 on branch v3.8.x (DOC: Use ax.xaxis rather ax.get_xaxis()) +* :ghpull:`26836`: Backport PR #26834 on branch v3.8.x (Fix Issue 26821: [Bug]: ValueError: The truth value... when an ndarray is passed to the color kwarg of axes3d.scatter) +* :ghpull:`26834`: Fix Issue 26821: [Bug]: ValueError: The truth value... when an ndarray is passed to the color kwarg of axes3d.scatter +* :ghpull:`26835`: Backport PR #26814 on branch v3.8.x (Bump pypa/cibuildwheel from 2.15.0 to 2.16.0) +* :ghpull:`26828`: Backport PR #26825 on branch v3.8.x (Fix issue with non-string labels and legend) +* :ghpull:`26825`: Fix issue with non-string labels and legend +* :ghpull:`26814`: Bump pypa/cibuildwheel from 2.15.0 to 2.16.0 +* :ghpull:`26816`: Backport PR #26799 on branch v3.8.x (Update kiwisolver and pillow versions to be consistent with requirements) +* :ghpull:`26820`: Backport PR #26811 on branch v3.8.x (Add overload for slice to Spines.__getitem__) +* :ghpull:`26811`: Add overload for slice to Spines.__getitem__ +* :ghpull:`26799`: Update kiwisolver and pillow versions to be consistent with requirements +* :ghpull:`26809`: Backport PR #26804 on branch v3.8.x (Fix issue with locale comma when not using math text) +* :ghpull:`26789`: Backport changes to contribute from PR #26737 +* :ghpull:`26810`: Backport PR #26807 on branch v3.8.x (Catch ValueError to support pytorch (and others) plotting) +* :ghpull:`26807`: Catch ValueError to support pytorch (and others) plotting +* :ghpull:`26804`: Fix issue with locale comma when not using math text +* :ghpull:`26781`: Backport PR #26780 on branch v3.8.x (fix Axes.errorbar docstring) +* :ghpull:`26780`: fix Axes.errorbar docstring +* :ghpull:`26699`: Improve naming of cibuildwheel jobs +* :ghpull:`26605`: ci: Install GTK4 from brew on macOS -Issues (185): +Issues (24): -* :ghissue:`26765`: [Bug]: Crash in Windows 10 if polar axis lim is lower than lowest data point. -* :ghissue:`26674`: [Doc]: Line3DCollection segments -* :ghissue:`26531`: [Bug]: ValueError thrown when ``levels`` is set to a lower value than ``vmin`` when using ``contours`` method of Axes -* :ghissue:`26029`: [MNT]: Unify tex2uni -* :ghissue:`26637`: [Doc]: Reduce references to set_tight_layout -* :ghissue:`26639`: [Bug]: Incorrect type annotation for legend handes? -* :ghissue:`26600`: [Doc]: contourf demo use of origin keyword -* :ghissue:`26508`: [Doc]: Pyplot Axes – tuple or list? -* :ghissue:`21524`: [Bug]: Removing an inset_axes that shares an axes does not remove it from the sharing group -* :ghissue:`26604`: [Doc]: Inappropriate example in gallery -* :ghissue:`26379`: [doc]: add 'validate' section to install docs -* :ghissue:`19409`: Boxplot: Median line too long after changing linewidth -* :ghissue:`26510`: [Bug]: mathtext silently ignores content after mismatched opening brace -* :ghissue:`26501`: [Bug]: type-checking errors with mypy + matplotlib 3.8.0rc1 -* :ghissue:`16657`: Postscript backend gives wrong page sizes -* :ghissue:`11771`: Change PdfPages to default to keep_empty=False and eventually deprecate keep_empty -* :ghissue:`26438`: [ENH]: ``musllinux`` wheels for Alpine -* :ghissue:`26446`: Disallow ``clip`` when ``vmin`` and ``vmax`` are not set in ``matplotlib.colors.Normalize`` -* :ghissue:`10002`: can't stop macosx mainloop -* :ghissue:`7551`: automatic papersize selection by ps backend is almost certainly broken -* :ghissue:`15913`: Switching to inline backend closes GUI windows -* :ghissue:`26460`: [TST] Upcoming dependency test failures -* :ghissue:`17566`: Updating an array passed as the xy parameter to annotate updates the anottation -* :ghissue:`24723`: [Doc]: Delete examples made redundant by annotation tutorial rewrite (annotate_simple01, ...) -* :ghissue:`26398`: [Bug]: fig.subplots_adjust and ax.set_yticklabels together can produce unexpected results -* :ghissue:`10767`: ENH: Possibility to decide tick and label position in mplot3d -* :ghissue:`9158`: Angled text not placed correctly with usetex in EPS -* :ghissue:`26400`: [Doc]: advice to use QuadContourSet.collections -* :ghissue:`26409`: [TST] Upcoming dependency test failures -* :ghissue:`26351`: [Doc]: Bad rendering of the title of the MRI example -* :ghissue:`26156`: [Doc]: navigating to the User Guide -* :ghissue:`15785`: xlim_changed not emitted on shared axis -* :ghissue:`26343`: [Bug]: ContourSet.antialiased attribute not present -* :ghissue:`14247`: latex \substack doesn't work -* :ghissue:`17190`: ipython autocomplete does not work for plt.figure() -* :ghissue:`13164`: Figures in windows not tabs -* :ghissue:`23212`: Support ``\middle`` -* :ghissue:`26082`: [MNT]: Make cyclers indexable and rely on indexing them rather than itertools.cycle -* :ghissue:`16938`: keyword share_all in ImageGrid class -* :ghissue:`26340`: [ENH]: ContourSet.set_paths -* :ghissue:`26236`: [Bug]: ax.scatter (projection='3d') - incorrect handling of NaN -* :ghissue:`22714`: [Bug]: parasite_axes does not properly handle units -* :ghissue:`22338`: [Bug]: rcParams['legend.loc'] can't use float-tuple like kwarg legend(loc...) -* :ghissue:`25942`: Make ``TexManager.texcache`` private -* :ghissue:`26289`: [Bug]: mathtext caching issue in multi-threaded environment with tight_layout=True -* :ghissue:`26272`: [Bug]: qt window blank after using save button -* :ghissue:`26308`: [Bug]: labels can't be placed at start of contours -* :ghissue:`2369`: Cleaning up kwargs in ContourSet -* :ghissue:`14118`: imshow() should not modify axes aspect if transform != ax.transData. -* :ghissue:`26081`: [ENH]: Add setters for _AxLine._xy1, ._xy2, ._slope -* :ghissue:`25643`: [ENH]: Support for ``\boldsymbol`` -* :ghissue:`1366`: Support \boldsymbol. (Feature request.) -* :ghissue:`26283`: [Bug]: set_ticks provides mysterious error message -* :ghissue:`25162`: [Bug]: pcolormesh properties and getter shapes changed w/o notice -* :ghissue:`26261`: [Doc]: Double entries in navigation menu of Using Matplotlib -* :ghissue:`4334`: Axes3D: factor out 3D coordinate guessing from format_coord() -* :ghissue:`22775`: [Bug]: 3d mouse coords values reported in toolbar are meaningless -* :ghissue:`25770`: [ENH]: support RGB(A) in pcolor -* :ghissue:`26031`: [MNT]: decrease timeout on interactive tests locally -* :ghissue:`26264`: [Doc]: Incorrectly drawn bounding box -* :ghissue:`26206`: [Doc]: follow on to #25247 -* :ghissue:`26225`: [Bug]: MultiCursor in inset axes -* :ghissue:`22277`: [Doc]: Exchange step() for stairs() in the Plot types - Basic section -* :ghissue:`25493`: [Doc]: users/explain bare index looks bad -* :ghissue:`25114`: [Bug]: matplotlib.path.Path.to_polygons fails with TriContourSet paths -* :ghissue:`26194`: [Bug]: dataLims get replaced by inf for charts with twinx if ax1 is a stackplot -* :ghissue:`6139`: 'QuadContourSet' object has no attribute 'set_visible' or 'set_animated' -* :ghissue:`25128`: [MNT]: Turn ContourSet into a (nearly) plain Collection -* :ghissue:`26100`: [Bug]: Axis multiplier when using plot_surface appears outside of the figure window -* :ghissue:`15518`: Collections could check x- and y- transforms separately to decide whether to autoscale each direction -* :ghissue:`26182`: [TST] Upcoming dependency test failures -* :ghissue:`25857`: [Doc]: gitwash deleting main branch -* :ghissue:`15054`: Improve tests by removing text or using figure comparisons -* :ghissue:`8794`: animation.save problems with ffmpeg -* :ghissue:`26140`: [Doc]: Sort greek/hebrew letters in math docs alphabetically -* :ghissue:`25042`: [Bug]: ``\geqslant``, ``\leqslant`` and ``\eqslantgtr`` are not spaced like their non-slanted versions -* :ghissue:`25014`: [ENH]: Add public method to update ``Legend`` object's loc property . -* :ghissue:`26124`: [Bug]: NavigationToolbar2 mouse over event causes toolbar height increase and axes reposition -* :ghissue:`24663`: [ENH]: Set color of legend shadow -* :ghissue:`7199`: Old whatsnews should be rendered using classic style -* :ghissue:`12926`: Inconsistent behavior of hexbins mincnt parameter, depending on C parameter -* :ghissue:`25030`: [BUG]: Button widgets don't work in inset axes -* :ghissue:`10009`: document event handling with twined axes -* :ghissue:`25477`: Plot ellipse with arrow showing rotation -* :ghissue:`26083`: [Bug]: Star marker (using mathtext) is not center-aligned -* :ghissue:`26015`: [ENH]: Missing mathematical operations -* :ghissue:`8802`: Masked pcolormesh is not tested correctly -* :ghissue:`25244`: [Bug]: DeprecationWarning for pkg_resources.declare_namespace usage in mpl_toolkit -* :ghissue:`25344`: pydata-sphinx-theme 0.13 causes doc builds to fail -* :ghissue:`25590`: [Doc]: type annotations rendering -* :ghissue:`25941`: [Doc]: Rewrite rainbow_text example to use annotate() -* :ghissue:`25497`: [ENH]: hi-res plot directive... -* :ghissue:`25675`: [ENH]: Add get/set_antialiased to Text objects -* :ghissue:`17069`: Error creating AxisGrid with non-default axis class -* :ghissue:`8965`: Add alias for colormaps for grey vs gray English issues -* :ghissue:`25945`: [Bug]: (edge case) no ticks are drawn in colorbars with SymLogNorm -* :ghissue:`25907`: [ENH]: Add test for annotate(textcoods="offset fontsize") -* :ghissue:`25654`: [Bug]: bar/barh don't trigger datetime units -* :ghissue:`19120`: Raise when both singular and plural scatter attributes are specified -* :ghissue:`14233`: Feature Request: Allow setting default AutoMinorLocator -* :ghissue:`25900`: [Doc]: I think you missed a ``fig`` here. -* :ghissue:`18425`: Add fontfamily/labelfont to tick_params -* :ghissue:`25864`: [MNT]: add tests for nargs_error -* :ghissue:`23595`: [Bug]: ``CbarAxesBase.toggle_label`` doesn't seem to work properly -* :ghissue:`25835`: [MNT]: Do not accept arbitrary positional parameters in Figure.add_axes() -* :ghissue:`25833`: [MNT]: Privatize Tick.set_label1() / Tick.set_label2() -* :ghissue:`11181`: [feature request] multiple 3d plots with tied viewing angles -* :ghissue:`25724`: [MNT]: Switch docs/examples to use Noto Sans CJK instead of WenQuanYi Zen Hei as CJK font -* :ghissue:`24779`: [Doc]: windows install instructions do not work -* :ghissue:`24701`: VS Code: Autocomplete and Syntax Highlighting do not work for matplotlib -* :ghissue:`25682`: [Bug]: fill_between{x} does not respect Axes transform -* :ghissue:`23061`: [Bug]: macosx timers don't fire if plt.show() hasn't been called -* :ghissue:`19769`: Memory leak when plotting multiple figures with the macOS backend -* :ghissue:`24331`: [Doc]: Lazy loading for images -* :ghissue:`24689`: [Bug]: Axes3D.set_frame_on not working as documented -* :ghissue:`5087`: Confusing (broken?) colormap name handling -* :ghissue:`22331`: [Bug]: First and or last minor ticks sometimes not plotted -* :ghissue:`19393`: \bf\it in mathtext -* :ghissue:`23171`: [Bug]: axes vlines() / hlines() incorrectly use data coordinate as min when blended transform is applied -* :ghissue:`5234`: Unicode with usetex=True and pgf backend -* :ghissue:`25677`: [Doc]: Axes.hlines and Axes.vlines (and probably others) can accept a single color as well as a list of colors. -* :ghissue:`25649`: [Doc]: backport strategy: inconsistency in guide -* :ghissue:`25582`: [Doc]: Commented Out Code in Downloadable Examples for Toolkits Tutorials -* :ghissue:`25695`: [Bug]: codecov.yml is invalid -* :ghissue:`23810`: [Bug]: Text objects don't take Mathtext into account while wrapping. -* :ghissue:`7560`: Edge cases in eventplot are likely broken -* :ghissue:`25613`: [Doc]: better document default margins -* :ghissue:`25638`: [MNT]: numdecs parameter in ``LogLocator`` -* :ghissue:`11375`: PGF output: Contour labels extend beyond figure boundary -* :ghissue:`25608`: [Bug]: ``bbox_inches="tight"`` does not work for writer.grab_frame() -* :ghissue:`25599`: [MNT]: The new default x and ymargin setting is too wasteful -* :ghissue:`25410`: [Bug]: Small Scatter Plot Marker Size Results in Circles -* :ghissue:`25053`: [Doc]: How to show an ASCII hyphen in math text without using TeX? -* :ghissue:`18520`: Matplotlib cannot parse TeX with \text command -* :ghissue:`25560`: [Bug]: legend for Poly3dCollection fails -* :ghissue:`20504`: Support type checking with mypy -* :ghissue:`7160`: pgf_pdflatex test fails on Windows -* :ghissue:`14527`: Log scale messed up in histograms when sharing axes -* :ghissue:`25521`: [Doc]: ``TABLEAU_COLORS`` ``XKCD_COLORS`` etc undocumented -* :ghissue:`5424`: Update colorbar after changing mappable.norm -* :ghissue:`22211`: [Bug]: scroll_event is broken after motion_notify_event in WXAgg -* :ghissue:`24092`: [Bug]: LogLocator with subs argument fragile. -* :ghissue:`23626`: [Bug]: unintended space between comma and digit when using useMathText = True together with comma as decimal separator -* :ghissue:`23154`: [MNT]: requirements/testing/minver.txt could also test oldest-supported pytest version -* :ghissue:`5675`: plt.pause() with threading is extremely slow for MacOSX backend -* :ghissue:`6630`: handling of zeros in log-scale changes irreversibly after user zoom -* :ghissue:`6324`: artist.contains should check that the event occurred in the same figure -* :ghissue:`16561`: Feature request: proper ECDF -* :ghissue:`25426`: [ENH]: Update grid_helper on FloatingSubplot -* :ghissue:`22663`: [Doc]: Consoldiate scatter symbol examples -* :ghissue:`24681`: [ENH]: set facecolor and edgecolor alpha separately -* :ghissue:`5336`: RendererAgg.tostring_rgb merely truncates alpha -* :ghissue:`22494`: [ENH]: Add ``get_shape`` as alias for ``get_size`` in AxesImage, or make that include depth too -* :ghissue:`5327`: Make ``mpl_toolkits`` a non-namespace package -* :ghissue:`9823`: Missing __init__.py file in mpl_toolkits -* :ghissue:`24605`: [Bug]: Validation not performed for ``loc`` argument to ``legend`` -* :ghissue:`25445`: [Doc]: Not possible to see upcoming what's new etc? -* :ghissue:`24450`: [MNT]: Fix or drop support for Tk 8.4 -* :ghissue:`25453`: [ENH]: Let norm argument accept string values in tripcolour -* :ghissue:`25401`: [Bug]: savefig + jpg + metadata fails with inscrutable error message -* :ghissue:`1735`: ``_path.get_path_collection_extents`` potentially wrong return value -* :ghissue:`25431`: [TST] Upcoming dependency test failures -* :ghissue:`25199`: [Bug]: AttributeError: 'LassoSelector' object has no attribute '_props' -* :ghissue:`25080`: Add note in contrib guide admonishing against use of f strings in logs -* :ghissue:`25165`: [Bug]: offsetText is colored based on tick.color instead of tick.labelcolor -* :ghissue:`25329`: [Bug]: Unable to pickle figure with aligned labels -* :ghissue:`14124`: plt.contour with all NaNs fails assertion in _contour.cpp -* :ghissue:`22674`: [Bug]: savefig(..., transparent=True) does not make inset_axes transparent -* :ghissue:`25303`: CI: isort should check plot_types? -* :ghissue:`25137`: [Bug]: stop responding in demo program "matplotlib/examples/event_handling/lasso_demo.py" -* :ghissue:`24910`: [Bug]: Suptitle not visible with subfigures -* :ghissue:`25222`: [ENH]: add organizational charts to supported plots -* :ghissue:`24796`: [Bug]: gapcolor not supported for LineCollections -* :ghissue:`25172`: [Doc]: cross link locator example with locator API -* :ghissue:`24419`: [Doc]: add from file to font family example -* :ghissue:`23809`: [Bug]: blitting after closing second tkinter embed causes silent crash -* :ghissue:`16580`: Segmentation fault when blitting onto closed figure (TkAgg) -* :ghissue:`24743`: [Bug]: contour raises IndexError if Z is specified as keyword argument -* :ghissue:`24283`: [Bug]: colorbar interacts poorly with TwoSlopeNorm when one slope is infinite -* :ghissue:`24906`: [DOC/BUILD] add ability to selectively build docs -* :ghissue:`24901`: [TST] Upcoming dependency test failures -* :ghissue:`17991`: type stubs for matplotlib -* :ghissue:`17583`: Linter complains about unexpected data-type, however, docs say this is possible -* :ghissue:`15926`: Support for Python Type Hints (PEP 484) -* :ghissue:`13798`: Add PEP484 type hints to the code (For IDE autocompletion / hints) +* :ghissue:`27120`: [Bug]: macosx backend pause() cannot be ctrl-c'd +* :ghissue:`27070`: [Bug]: find_nearest_contour deprecated with no replacement? +* :ghissue:`26913`: Should ``ContourSet.allsegs`` and ``.allkinds`` be deprecated? +* :ghissue:`26869`: [Bug]: Plot window not shown in Mac OS with backend set to default MacOSX +* :ghissue:`16865`: Hexbin mincnt parameter docstring should say "more than or equal to" not "more than" +* :ghissue:`27103`: [Bug]: hexbin cannot always accept np.max like functions as reduce_C_function +* :ghissue:`27062`: [Bug]: ContourLabeler.clabel with manual != False breaks unconnected contours +* :ghissue:`26971`: [Bug]: plt.clabel raises exception at very low DPI: ``ValueError: 'codes' must be a 1D list or array with the same length of 'vertices'. Your vertices have shape (2, 2) but your codes have shape (1,)`` +* :ghissue:`27188`: Small error in docstring of matplotlib.colors.from_levels_and_colors +* :ghissue:`27126`: [Bug]: LinearSegmentedColormap.from_list cannot process list with two colors +* :ghissue:`26244`: [Doc]: document how to get list of registered colormaps +* :ghissue:`26863`: [Doc]: ``ContourSet`` ``allsegs`` and ``allkinds`` after #25247 +* :ghissue:`26932`: [Bug]: Poetry installs setuptools-scm and setuptools +* :ghissue:`27007`: [Bug]: Colorbar format string kind guess could be made more robust +* :ghissue:`26919`: [Bug]: Missing file pyplot.pyi for mypy typing +* :ghissue:`26949`: [Bug]: colors.LinearSegmentedColormap.from_list does not take two tuples in 3.8.0 +* :ghissue:`26936`: [Bug/TYPE]: Scatter ``c`` Typehint does not support list of numbers when using ``cmap`` +* :ghissue:`26846`: [MNT]: setuptools-scm v8.0.1 compatibility +* :ghissue:`26821`: [Bug]: ``ValueError: The truth value...`` when an ndarray is passed to the ``color`` kwarg of ``axes3d.scatter`` +* :ghissue:`26822`: [Bug]: QuadMesh.get_array change breaks seaborn heatmap annotation +* :ghissue:`26824`: [Bug]: Legend fails for bar plot with numeric label +* :ghissue:`26808`: [Bug]: No overload variant of "__getitem__" of "Spines" matches argument type "slice" [call-overload] +* :ghissue:`26806`: [Bug]: ValueError when plotting 2D pytorch tensor using matplotlib==3.8.0 +* :ghissue:`26803`: [Bug]: use_locale leads to curly brackets around decimal separator Previous GitHub statistics diff --git a/doc/users/prev_whats_new/github_stats_3.8.0.rst b/doc/users/prev_whats_new/github_stats_3.8.0.rst new file mode 100644 index 000000000000..219e60f399ac --- /dev/null +++ b/doc/users/prev_whats_new/github_stats_3.8.0.rst @@ -0,0 +1,1003 @@ +.. _github-stats-3-8-0: + +GitHub statistics for 3.8.0 (Sep 14, 2023) +========================================== + +GitHub statistics for 2023/02/13 (tag: v3.7.0) - 2023/09/14 + +These lists are automatically generated, and may be incomplete or contain duplicates. + +We closed 185 issues and merged 649 pull requests. +The full list can be seen `on GitHub `__ + +The following 146 authors contributed 2914 commits. + +* 0xedl +* Aalok Chhetri +* Adam J. Stewart +* Adam Turner +* Albert Y. Shih +* Alissa +* Alissa Hodge +* Almar Klein +* Andreas Deininger +* Antony Lee +* Artem Shekhovtsov +* Astra +* Ben Root +* Brandon Dusch +* BuildTools +* Caden Gobat +* Chahak Mehta +* Clément Robert +* ColeBurch +* Daniele Nicolodi +* daniilS +* David Kaméus +* David Stansby +* dependabot[bot] +* Devilsaint +* devRD +* Dusch4593 +* DWesl +* Eero Vaher +* Elliott Sales de Andrade +* Eric Firing +* Eric Larson +* Eric Prestat +* Eric Wieser +* Evgenii Radchenko +* Fabian Joswig +* Felix Goudreault +* Gabriel Madeira +* Gautam Sagar +* Gokberk Gunes +* Greg Lucas +* Hai Zhu +* hannah +* Haojun Song +* Hasan Rashid +* haval0 +* Higgs32584 +* Ian Hunt-Isaak +* Ian Thomas +* II-Day-II +* Irtaza Khalid +* j1642 +* Jan-Hendrik Müller +* Jarrod Millman +* Jody Klymak +* Johann Krauter +* John Paul Jepko +* Jonathan Wheeler +* jsdodge +* Julian Chen +* kolibril13 +* krooijers +* Kyle Sunden +* Larry Bradley +* LemonBoy +* lganic +* Lukas Schrangl +* luke +* marbled-toast +* mariamalykh +* Marisa Wong +* Mateusz Sokół +* Matt Newville +* matt statham +* Matthew Feickert +* Matthew Morrison +* Matthias Bussonnier +* MeeseeksMachine +* Melissa Weber Mendonça +* melissawm +* Michael Dittrich +* Michael Higgins +* Mubin Manasia +* Mudassir Chapra +* Niranjan +* NISHANT KUMAR +* Noy Hanan +* Olin Johnson +* Oscar Gustafsson +* Pavel Zwerschke +* Peter Cock +* Petros Tzathas +* Photoniker +* photoniker +* Pierre Haessig +* Pieter Eendebak +* Prajwal Agrawal +* pre-commit-ci[bot] +* priyanshi +* Priyanshi Gaur +* RadostW +* Rahul Mohan +* Ratnabali Dutta +* rbt94 +* Richard Barnes +* richardsheridan +* RishabhSpark +* Rob Righter +* roberto.bodo +* root +* Ruth Comer +* Sam +* saranti +* Scott Shambaugh +* Shreeya Ramesh +* Sia Ghelichkhan +* Sigma-Verma +* Smeet nagda +* SnorfYang +* Stefanie Molin +* Steffen Rehberg +* stevezhang +* stevezhang1999 +* Talha Irfan +* Thomas A Caswell +* Thomas J. Fan +* Tigran Khachatryan +* Tim Hoffmann +* Tom +* Tom Sarantis +* Tunç Başar Köse +* Utkarsh Verma +* vavanade +* Vishal Pankaj Chandratreya +* vivekvedant +* vizzy_viz +* Vladimir +* Vladimir Ilievski +* Waleed-Abdullah +* weijili +* whyvra +* xtanion +* Y.D.X +* Yi Wei +* yuzie007 +* 渡邉 美希 + +GitHub issues and pull requests: + +Pull Requests (649): + +* :ghpull:`26777`: Backport PR #26702 on branch v3.8.x (converted coc to rst and put links in code_of_conduct.md) +* :ghpull:`26775`: Backport PR #26767 on branch v3.8.x (Trim Gouraud triangles that contain NaN) +* :ghpull:`26776`: Backport PR #26687 on branch v3.8.x (Remove usage of recarray) +* :ghpull:`26702`: converted coc to rst and put links in code_of_conduct.md +* :ghpull:`26687`: Remove usage of recarray +* :ghpull:`26767`: Trim Gouraud triangles that contain NaN +* :ghpull:`26770`: Backport PR #26762 on branch v3.8.x (MNT: Numpy 2.0 removals from ndarray class) +* :ghpull:`26762`: MNT: Numpy 2.0 removals from ndarray class +* :ghpull:`26769`: DOC: Pin mpl-sphinx-theme to 3.8.x +* :ghpull:`26768`: Backport PR #26700 on branch v3.8.x (Check type for set_clip_box) +* :ghpull:`26700`: Check type for set_clip_box +* :ghpull:`26766`: Backport PR #26763 on branch v3.8.x (DOC: Add redirects for old gitwash files) +* :ghpull:`26763`: DOC: Add redirects for old gitwash files +* :ghpull:`26756`: Pin numpy to <2 for 3.8.0 +* :ghpull:`26761`: Merge branch v3.7.x into v3.8.x +* :ghpull:`26757`: Backport PR #26628 on branch v3.8.x (DOC: move install related FAQ to install docs) +* :ghpull:`26628`: DOC: move install related FAQ to install docs +* :ghpull:`26753`: Backport PR #26705 on branch v3.8.x ([Doc] Small fixes found by velin) +* :ghpull:`26705`: [Doc] Small fixes found by velin +* :ghpull:`26746`: Backport PR #26671 on branch v3.8.x ([DOC] Enhance API reference index) +* :ghpull:`26671`: [DOC] Enhance API reference index +* :ghpull:`26740`: Backport PR #26676 on branch v3.8.x ([DOC] Slightly improve the LineCollection docstring) +* :ghpull:`26676`: [DOC] Slightly improve the LineCollection docstring +* :ghpull:`26712`: Backport PR #26491 on branch v3.8.x (TYP: Add common-type overloads of subplot_mosaic) +* :ghpull:`26726`: Backport PR #26719 on branch v3.8.x (Fix issue with missing attribute in Path3DCollection) +* :ghpull:`26724`: Backport PR #26721 on branch v3.8.x (Add a Python 3.12 classifier) +* :ghpull:`26711`: Backport PR #26709 on branch v3.8.x (DOC: consistency in docstrings of formatting of array-like) +* :ghpull:`26491`: TYP: Add common-type overloads of subplot_mosaic +* :ghpull:`26709`: DOC: consistency in docstrings of formatting of array-like +* :ghpull:`26708`: Backport PR #26601 on branch v3.8.x (Avoid checking limits when updating both min and max for contours) +* :ghpull:`26601`: Avoid checking limits when updating both min and max for contours +* :ghpull:`26701`: Backport PR #26695 on branch v3.8.x (Bump actions/checkout from 3 to 4) +* :ghpull:`26695`: Bump actions/checkout from 3 to 4 +* :ghpull:`26694`: Backport PR #26689 on branch v3.8.x (Fix error generation for missing pgf.texsystem.) +* :ghpull:`26522`: TST: Add failing test +* :ghpull:`26689`: Fix error generation for missing pgf.texsystem. +* :ghpull:`26688`: Backport PR #26680 on branch v3.8.x (Fix flaky CI tests) +* :ghpull:`26680`: Fix flaky CI tests +* :ghpull:`26675`: Backport PR #26665 on branch v3.8.x (Clarify loading of backend FigureCanvas and show().) +* :ghpull:`26673`: Backport PR #26193 on branch v3.8.x (Sort tex2uni data in mathtext) +* :ghpull:`26665`: Clarify loading of backend FigureCanvas and show(). +* :ghpull:`26193`: Sort tex2uni data in mathtext +* :ghpull:`26663`: Backport PR #26245 on branch v3.8.x ([pre-commit.ci] pre-commit autoupdate) +* :ghpull:`26668`: Backport PR #26541 on branch v3.8.x (TYP: Add typing on mathtext internals) +* :ghpull:`26666`: Backport PR #26657 on branch v3.8.x (DOC: Fix some small issues) +* :ghpull:`26541`: TYP: Add typing on mathtext internals +* :ghpull:`26662`: Backport PR #26542 on branch v3.8.x (TST: Ensure test_webagg subprocess is terminated) +* :ghpull:`26661`: Backport PR #26566 on branch v3.8.x (MAINT: Numpy 2.0 deprecations for row_stack and in1d) +* :ghpull:`26657`: DOC: Fix some small issues +* :ghpull:`26660`: Backport PR #26656 on branch v3.8.x (TYP: Fix some small bugs) +* :ghpull:`26659`: Backport PR #26470 on branch v3.8.x ([DOC]: mathtext tutorial-consolidate explain and notes) +* :ghpull:`26245`: [pre-commit.ci] pre-commit autoupdate +* :ghpull:`26658`: Backport PR #26608 on branch v3.8.x (Removed unnecessary origin keywords) +* :ghpull:`26542`: TST: Ensure test_webagg subprocess is terminated +* :ghpull:`26566`: MAINT: Numpy 2.0 deprecations for row_stack and in1d +* :ghpull:`26656`: TYP: Fix some small bugs +* :ghpull:`26651`: Backport PR #26348 on branch v3.8.x (Test some untested Locator code) +* :ghpull:`26470`: [DOC]: mathtext tutorial-consolidate explain and notes +* :ghpull:`26608`: Removed unnecessary origin keywords +* :ghpull:`26655`: Backport PR #26649 on branch v3.8.x ([DOC] Remove "Discouraged" notices that have been superseded by deprecation) +* :ghpull:`26654`: Backport PR #26597 on branch v3.8.x (Squeeze post-converted values when validating limits) +* :ghpull:`26652`: Backport PR #26646 on branch v3.8.x (Use standard method for closing QApp when last window is closed.) +* :ghpull:`26648`: Backport PR #26521 on branch v3.8.x (Replaced list with tuple in pyplot for axes) +* :ghpull:`26649`: [DOC] Remove "Discouraged" notices that have been superseded by deprecation +* :ghpull:`26647`: Backport PR #26582 on branch v3.8.x (MNT: Enable wheels for Python 3.12) +* :ghpull:`26646`: Use standard method for closing QApp when last window is closed. +* :ghpull:`26650`: Backport PR #26635 on branch v3.8.x ([MNT] Do not configure axes properties via subplots(..., subplot_kw={...})) +* :ghpull:`26644`: Backport PR #26641 on branch v3.8.x ([Doc] Add ACCEPTS for some Axes set methods) +* :ghpull:`26348`: Test some untested Locator code +* :ghpull:`26635`: [MNT] Do not configure axes properties via subplots(..., subplot_kw={...}) +* :ghpull:`26521`: Replaced list with tuple in pyplot for axes +* :ghpull:`26643`: Backport PR #26636 on branch v3.8.x ([Doc] Improve set_layout_engine docs) +* :ghpull:`26641`: [Doc] Add ACCEPTS for some Axes set methods +* :ghpull:`26640`: Backport PR #24209 on branch v3.8.x (List the webagg_core module in the sphinx docs.) +* :ghpull:`26638`: Backport PR #26633 on branch v3.8.x ([Doc] Shorten documentation links in widgets) +* :ghpull:`26636`: [Doc] Improve set_layout_engine docs +* :ghpull:`24209`: List the webagg_core module in the sphinx docs. +* :ghpull:`26633`: [Doc] Shorten documentation links in widgets +* :ghpull:`26632`: Backport PR #26540 on branch v3.8.x (TYP: Add overloads for FT2Font.get_sfnt_table) +* :ghpull:`26631`: Backport PR #26619 on branch v3.8.x ([DOC] Clarify some tick-related docstrings) +* :ghpull:`26540`: TYP: Add overloads for FT2Font.get_sfnt_table +* :ghpull:`26619`: [DOC] Clarify some tick-related docstrings +* :ghpull:`26625`: Backport PR #26622 on branch v3.8.x ([Doc] Improve DSP-related examples) +* :ghpull:`26622`: [Doc] Improve DSP-related examples +* :ghpull:`26618`: Backport PR #24711 on branch v3.8.x (Test with Python 3.12) +* :ghpull:`26617`: Backport PR #26598 on branch v3.8.x (FIX: array labelcolor for Tick) +* :ghpull:`26615`: Backport PR #26614 on branch v3.8.x (Properly disconnect machinery when removing child axes.) +* :ghpull:`26614`: Properly disconnect machinery when removing child axes. +* :ghpull:`24711`: Test with Python 3.12 +* :ghpull:`26607`: Backport PR #26606 on branch v3.8.x ([Doc] Revise histogram features example (Closes #26604)) +* :ghpull:`26606`: [Doc] Revise histogram features example (Closes #26604) +* :ghpull:`26599`: Backport PR #26565 on branch v3.8.x ([doc]: added section Verify installation) +* :ghpull:`26565`: [doc]: added section Verify installation +* :ghpull:`26595`: Backport PR #26591 on branch v3.8.x (Fix ToolBase.figure property setter.) +* :ghpull:`26591`: Fix ToolBase.figure property setter. +* :ghpull:`26584`: Backport PR #26581 on branch v3.8.x (Deduplicate test for toolbar button icon LA mode.) +* :ghpull:`26585`: Backport PR #26576 on branch v3.8.x (Use sys.platform over os.name) +* :ghpull:`26583`: Backport PR #26578 on branch v3.8.x (MAINT: add __pycache__/ to .gitignore) +* :ghpull:`26576`: Use sys.platform over os.name +* :ghpull:`26581`: Deduplicate test for toolbar button icon LA mode. +* :ghpull:`26578`: MAINT: add __pycache__/ to .gitignore +* :ghpull:`26579`: Backport PR #26572 on branch v3.8.x ([DOC]: clarify pre-commits and editing workflow) +* :ghpull:`26572`: [DOC]: clarify pre-commits and editing workflow +* :ghpull:`26575`: Backport PR #26573 on branch v3.8.x ([DOC]: codespace link in contribute index) +* :ghpull:`26573`: [DOC]: codespace link in contribute index +* :ghpull:`26568`: Backport PR #26462 on branch v3.8.x (Boxplot fix median line extending past box boundaries #19409) +* :ghpull:`26416`: [doc]: add 'validate' section to install docs #26379 +* :ghpull:`26564`: Backport PR #26543 on branch v3.8.x (Add ninja to Cygwin builder) +* :ghpull:`26462`: Boxplot fix median line extending past box boundaries #19409 +* :ghpull:`26563`: Backport PR #26519 on branch v3.8.x (Fix mathtext mismatched braces) +* :ghpull:`26543`: Add ninja to Cygwin builder +* :ghpull:`26519`: Fix mathtext mismatched braces +* :ghpull:`26556`: Backport PR #26554 on branch v3.8.x (Remove NumPy abs overrides from pylab) +* :ghpull:`26550`: Backport PR #26545 on branch v3.8.x (Fix size inferral when using cairocffi) +* :ghpull:`26547`: Backport PR #26493 on branch v3.8.x (Disable ````add_html_cache_busting```` on Sphinx 7.1+) +* :ghpull:`26546`: Backport PR #26201 on branch v3.8.x (DOC: Add documentation on codespaces usage) +* :ghpull:`26548`: Backport PR #26514 on branch v3.8.x (Clarify interaction between params of get_path_collection_extents.) +* :ghpull:`26514`: Clarify interaction between params of get_path_collection_extents. +* :ghpull:`26537`: Backport PR #26529 on branch v3.8.x (Fix MathText antialiasing) +* :ghpull:`26536`: Backport PR #26532 on branch v3.8.x (Fix input check in Poly3DCollection.__init__) +* :ghpull:`26529`: Fix MathText antialiasing +* :ghpull:`26534`: Backport PR #26513 on branch v3.8.x (Tweak shape repr in _api.check_shape error message.) +* :ghpull:`26533`: Backport PR #26526 on branch v3.8.x (Bump pypa/cibuildwheel from 2.14.1 to 2.15.0) +* :ghpull:`26513`: Tweak shape repr in _api.check_shape error message. +* :ghpull:`26526`: Bump pypa/cibuildwheel from 2.14.1 to 2.15.0 +* :ghpull:`26201`: DOC: Add documentation on codespaces usage +* :ghpull:`26530`: Backport PR #26509 on branch v3.8.x (Update/tweak SpanSelector docs.) +* :ghpull:`26509`: Update/tweak SpanSelector docs. +* :ghpull:`26528`: Backport PR #26504 on branch v3.8.x (TYP: Add overload to specify output of Colormap.__call__ when possible) +* :ghpull:`26527`: Backport PR #26173 on branch v3.8.x (Synchronize mathtext docs and handling) +* :ghpull:`26504`: TYP: Add overload to specify output of Colormap.__call__ when possible +* :ghpull:`26173`: Synchronize mathtext docs and handling +* :ghpull:`26511`: Backport PR #26490 on branch v3.8.x (Import PIL.Image explicitly over PIL) +* :ghpull:`26490`: Import PIL.Image explicitly over PIL +* :ghpull:`26503`: Backport PR #26502 on branch v3.8.x (TST: Increase some tolerances for non-x86 arches) +* :ghpull:`26502`: TST: Increase some tolerances for non-x86 arches +* :ghpull:`26499`: Backport PR #26498 on branch v3.8.x (Add plausible analytics to the documentation pages) +* :ghpull:`26498`: Add plausible analytics to the documentation pages +* :ghpull:`26493`: Disable ````add_html_cache_busting```` on Sphinx 7.1+ +* :ghpull:`26489`: Backport PR #26487 on branch v3.8.x (DOC: Remove unused image rotator) +* :ghpull:`26487`: DOC: Remove unused image rotator +* :ghpull:`26479`: ps: Add option to use figure size as paper size +* :ghpull:`26469`: Deprecate PdfPages(keep_empty=True). +* :ghpull:`24379`: DOC: Update dropped splines example +* :ghpull:`26326`: Only do pchanged and set stale when value changes + doc consistency +* :ghpull:`26443`: BLD: stop skipping musl wheel builds +* :ghpull:`26475`: [DOC]: Noto Sans for windows docs builds +* :ghpull:`26481`: Clarify behavior of norm clipping +* :ghpull:`26474`: [DOC]: filter non-gui backend warnings when building docs +* :ghpull:`26480`: [DOC] Documentation fixes +* :ghpull:`26476`: Remove auto from supported ps.papersizes in matplotlibrc. +* :ghpull:`25966`: Fix support for Ctrl-C on the macosx backend. +* :ghpull:`26473`: Fix codespaces setup.sh script +* :ghpull:`24376`: Support removing inner ticks in label_outer() +* :ghpull:`25785`: Deprecate papersize=auto in PostScript +* :ghpull:`26472`: Do not close figures on backend switch. +* :ghpull:`26402`: Restructure interface section of API Reference index page +* :ghpull:`26467`: MNT: Adjust for upcoming numpy repr changes +* :ghpull:`26451`: TYP: Add several missing return type annotations +* :ghpull:`26466`: Make annotate/OffsetFrom unaffected by later mutation of coordinates. +* :ghpull:`26445`: [DOC]: annotation tutorial: blended artist, headers, and user demo deletes +* :ghpull:`26454`: Rename an internal parameter of _label_outer_x/yaxis() +* :ghpull:`26130`: Enable branch coverage for C/C++ code +* :ghpull:`26448`: [DOC] Update dependency documentation +* :ghpull:`26450`: Fix return value of Text.update +* :ghpull:`26447`: DOC: Fix accidental cases of blockquotes +* :ghpull:`26401`: WARN: more direct warning ticklabels +* :ghpull:`26444`: Fix some bugs found by typing +* :ghpull:`26253`: Filter out inf values in plot_surface +* :ghpull:`26407`: Improve some smaller typing issues +* :ghpull:`26328`: [DOC]: improve consistency of plot types gallery +* :ghpull:`26434`: TYP: Adjust type hint of Norm.__call__ to return masked array +* :ghpull:`26376`: Text antialiasing for mathtext (reopen) +* :ghpull:`25830`: Specify ticks and axis label positions for 3D plots +* :ghpull:`25784`: ps: Fix anchoring of rotated usetex text +* :ghpull:`26403`: Update type hints for font manager and extension +* :ghpull:`26433`: Call out which pane is hovered over for 3d hover coordinates +* :ghpull:`26418`: Add next_whats_new entries for mathtext features +* :ghpull:`26429`: DOC: update ContourSet attributes deprecation advice +* :ghpull:`26051`: Type hinting developer docs +* :ghpull:`26427`: Improve button widget examples a bit +* :ghpull:`26423`: Fix pyparsing version check +* :ghpull:`26425`: Delete second MRI demo example +* :ghpull:`26424`: macos: Don't leak None in Timer cleanup +* :ghpull:`26332`: moved doc root to landing page, make user landing a guide page +* :ghpull:`26408`: DOC: add note about manually downloading qhull + freetype +* :ghpull:`26404`: Remove old What's new entries +* :ghpull:`26011`: Emit xlim_changed on shared axes. +* :ghpull:`25810`: Fix default return of Collection.get_{cap,join}style +* :ghpull:`26168`: Add _val_or_rc-function +* :ghpull:`26335`: Optimize imshow +* :ghpull:`26367`: Add typing for internal helpers +* :ghpull:`26397`: TYP: Add type hints to testing module +* :ghpull:`26399`: Reinstate & deprecate ContourSet.antialiased +* :ghpull:`26385`: Improve typing in pyplot +* :ghpull:`26151`: Add substack cmd for mathtext +* :ghpull:`26396`: Move pylab documentation to its own module page +* :ghpull:`26393`: TST: Remove extra dummy Axis classes +* :ghpull:`26384`: Fix triage tool due to Qt bump to 5.12 +* :ghpull:`26382`: Tweak hist2d docstring. +* :ghpull:`26359`: Simplify MRI with EEG example +* :ghpull:`26071`: ENH: macosx allow figures to be opened in tabs or windows +* :ghpull:`16473`: Make ``.axis(zmin=...)`` work on 3D axes +* :ghpull:`26333`: Add middle for delims +* :ghpull:`26365`: Fix removal of Figure-level artists +* :ghpull:`26341`: Fix pickling of axes property cycle. +* :ghpull:`26279`: DOC: remove users_explain/axis +* :ghpull:`26347`: Add tests for LogFormatter.format_data and format_data_short +* :ghpull:`26329`: Clarify that ImageGrid requires limits-sharing. +* :ghpull:`26349`: Tweak Sankey docs. +* :ghpull:`26352`: Fix bad histogramming bins in mri/eeg example. +* :ghpull:`26353`: Remove unused private method +* :ghpull:`26342`: ENH: Collection.set_paths +* :ghpull:`26344`: Some more micro optimizations +* :ghpull:`26346`: Increase coverage +* :ghpull:`26330`: Deprecate wrappers combining axes_grid1 and axisartist. +* :ghpull:`26338`: Bump pypa/cibuildwheel from 2.14.0 to 2.14.1 +* :ghpull:`26331`: Support standard Axes in RGBAxes. +* :ghpull:`26219`: DOC: Restore banner indicating docs are unreleased +* :ghpull:`25558`: Simplify outdated Image.contains check. +* :ghpull:`26324`: More micro optimizations of plot +* :ghpull:`26325`: Remove unused variables +* :ghpull:`26022`: MNT/FIX: macosx change Timer to NSTimer instance +* :ghpull:`26303`: Micro optimization of plotting +* :ghpull:`26249`: FIX: axes3d.scatter color parameter doesn't decrease in size for non-finite coordinate inputs. +* :ghpull:`26078`: Fix parasite_axes does not properly handle units +* :ghpull:`25839`: [ENH]: int / float-tuple like kwarg legend(loc) for rcParams['legend.loc'] +* :ghpull:`26056`: Privatize TexManager.texcache +* :ghpull:`25363`: Bump minimum QT5 version to 5.12 +* :ghpull:`26176`: Add more sizeable delimiters +* :ghpull:`26302`: FIX: move the font lock higher up the call and class tree +* :ghpull:`26309`: qt: Mark canvas for re-draw after savefig +* :ghpull:`26311`: FIX: labels at start of contours +* :ghpull:`26278`: ENH: clip_path keyword for contour and contourf +* :ghpull:`26295`: Deprecate inset_locator.InsetPosition. +* :ghpull:`26122`: Only change axes aspect in imshow if image transform is/contains transData +* :ghpull:`26297`: Use transformed paths for contour labelling decisions +* :ghpull:`26160`: add setters and getters for _AxLine's xy1, xy2 and slope parameters +* :ghpull:`26294`: Deprecate cbook.Stack. +* :ghpull:`26284`: Bump pypa/cibuildwheel from 2.13.1 to 2.14.0 +* :ghpull:`25661`: boldsymbol support for mathtext +* :ghpull:`26285`: Improve exception message for set_ticks() kwargs without labels +* :ghpull:`14593`: Simplify SecondaryAxis.set_color. +* :ghpull:`26273`: TST: simplify mask in pcolor writing to mask test +* :ghpull:`26263`: Doc fix toc users +* :ghpull:`26242`: Deprecate FigureCanvasBase.switch_backends. +* :ghpull:`26164`: Only clear Axis once when creating an Axes +* :ghpull:`26035`: issue #26031 - [MNT]: decrease timeout on interactive tests locally +* :ghpull:`23485`: Fix displayed 3d coordinates showing gibberish +* :ghpull:`25027`: Make pcolor more mesh-like +* :ghpull:`26235`: MNT:Decreased timeout for local interactive tests +* :ghpull:`26270`: Merge v3.7.x into main +* :ghpull:`26269`: DOC: Fix image_rotator +* :ghpull:`26265`: DOC: ensure that the bounding box is scaled with dpi in example +* :ghpull:`26255`: DOC: Modernize Colorbar Tick Labelling example +* :ghpull:`26258`: DOC: fix rst formatting +* :ghpull:`26257`: DOC: Clarify terminology +* :ghpull:`26256`: Better document the ContourSet API change. +* :ghpull:`26254`: DOC: Improve readability of date formatters/locators example +* :ghpull:`26233`: DOC: replaced step with stairs in basic plot types +* :ghpull:`26213`: Add ``CITATION.cff`` file +* :ghpull:`26226`: Use CLOSEPOLY kind code to close tricontourf polygons +* :ghpull:`26208`: FIX: also copy the axis units when creating twins +* :ghpull:`26185`: Set transform for offset text in 3d +* :ghpull:`26068`: Rewrite Tick formatters example +* :ghpull:`26218`: moved minimum dependencies to maintenance section +* :ghpull:`26217`: Doc/rm maintainer wf +* :ghpull:`26212`: Avoid deprecated typing hints +* :ghpull:`26198`: Limit Forward references in Mathtext parser +* :ghpull:`26210`: Re-export textpath types in text +* :ghpull:`25247`: Turn ContourSet into a standard Collection artist. +* :ghpull:`26204`: ci: Add tzdata to nightly builds +* :ghpull:`26200`: [Doc] Add note about (str, alpha) version added +* :ghpull:`26171`: precommit warns on main + instructions for fix +* :ghpull:`26189`: Factor out legend/figlegend nargs validation. +* :ghpull:`26199`: ci: Fix typo for nightly builds +* :ghpull:`26197`: CI: Add pre-release installs to upcoming tests +* :ghpull:`26086`: reorganize contributing landing page +* :ghpull:`17497`: Dedupe some C++ templates +* :ghpull:`26190`: Deprecate removal of explicit legend handles whose label starts with _. +* :ghpull:`26188`: Add note to remove texts in baselines when they are regenerated. +* :ghpull:`25714`: Fix ffmpeg framerates +* :ghpull:`26142`: [Doc] alphabetize mathtext symbols by unicode +* :ghpull:`25933`: Relational Operators for mathtext +* :ghpull:`26159`: DOC: Remove unused static images +* :ghpull:`25913`: DOC: contributing and documenting clean ups + community for incubator invites +* :ghpull:`26141`: Doc cards user explain +* :ghpull:`26110`: DOC: fix levels in user/explain/figure +* :ghpull:`26102`: Start basing mathtext tutorial on mathtext parser +* :ghpull:`26138`: MNT: add VNClte porte by default +* :ghpull:`26089`: Add public method to update ``Legend`` object's loc property . +* :ghpull:`26137`: Add codespaces configuration +* :ghpull:`25548`: FIX: macosx keep track of mouse up/down for cursor hand changes +* :ghpull:`26132`: MNT: remove test images from mathtext tests that have been removed +* :ghpull:`26125`: Stop building universal2 and win32 wheels +* :ghpull:`26105`: Doc user guide cards +* :ghpull:`26128`: Add missing spacer in tk toolmanager toolbar. +* :ghpull:`26129`: Remove outdated comment in ``Artist.__getstate__`` +* :ghpull:`25631`: API: forbid unsafe savefig kwargs to AbstractMovieWriter.grab_frame +* :ghpull:`25926`: DOC: restore navigation documentation +* :ghpull:`24666`: Setting color of legend shadow +* :ghpull:`26010`: Correct Unicode for [lg]napprox +* :ghpull:`26120`: Fix new warnings in compiled extensions +* :ghpull:`26060`: Mnt: GUI tests +* :ghpull:`25623`: Use classic style in old what's new entries +* :ghpull:`26113`: Fixes #12926 - inconsistency upon passing C in hexbin +* :ghpull:`25555`: Let widgets/clabel better handle overlapping axes. +* :ghpull:`26114`: Bump pypa/cibuildwheel from 2.13.0 to 2.13.1 +* :ghpull:`26112`: Skip tests for users-explain gallery +* :ghpull:`26111`: [MNT] Update nightly wheels install location +* :ghpull:`25779`: Adding ellipse_arrow.py example and closes #25477 +* :ghpull:`26101`: Correct bounding box calculation for text markers +* :ghpull:`26096`: FIX: Handle masked arrays for RGBA input with ScalarMappables +* :ghpull:`26024`: Add missing operators code +* :ghpull:`26072`: Pcolormesh with Gouraud shading: masked arrays +* :ghpull:`25381`: ENH: switch mpl_toolkits to implicit namespace package (PEP 420) +* :ghpull:`26070`: Factor out common checks for set_data in various Image subclasses. +* :ghpull:`26091`: Shorten axes_grid1 inset_locator code. +* :ghpull:`26090`: ci: Move Python 3.11 job to Ubuntu 22.04 +* :ghpull:`21054`: Deprecate many single-use rc validators. +* :ghpull:`26065`: Install extra requirements when testing with 3.11 on GH +* :ghpull:`26080`: Deprecate unused "frac" key in annotate() arrowprops. +* :ghpull:`25248`: added Ishikawa plot in response to issue #25222 add organizational ch… +* :ghpull:`26064`: add ishikawa diagram to examples +* :ghpull:`26079`: Tweak Annotation docstring. +* :ghpull:`26069`: Tweak AnnotationBbox coords specification. +* :ghpull:`26073`: Cleanup date tick locators and formatters +* :ghpull:`26057`: Further cleanup rainbow_text example. +* :ghpull:`26058`: Don't show type hints in rendered docs +* :ghpull:`26042`: Further simplify AxesGrid._init_locators. +* :ghpull:`25993`: Modify rainbow_text() function to use annotate() function +* :ghpull:`25850`: Handle exceptions in numpy::array_view<...>::set(). +* :ghpull:`25542`: ENH: offset parameter for MultipleLocator +* :ghpull:`25515`: DOC/BLD: plot directive srcset +* :ghpull:`26045`: 'Inactive' workflow: reduce run frequency +* :ghpull:`26047`: PR welcome: getting attention +* :ghpull:`26023`: CI: Use scientific-python/upload-nightly-action +* :ghpull:`25775`: Support customizing antialiasing for text and annotation +* :ghpull:`26036`: Cleanup AxesGrid +* :ghpull:`26025`: MNT: Use commit SHA of cibuildwheel action release +* :ghpull:`25938`: “Inactive” workflow: bump operations to 175 +* :ghpull:`26020`: Let AxesGrid support Axes subclasses that don't override axis(). +* :ghpull:`26017`: MNT: reduce number of implicit imports from toplevel __init__.py +* :ghpull:`26033`: removed wrapping from first-issue-bot +* :ghpull:`26003`: added alias to gray and grey match same colormaps +* :ghpull:`26027`: Correct spelling in 'Good first issue' +* :ghpull:`26026`: Simplify delaxes. +* :ghpull:`26028`: Better document the semantics of get_text_width_height_descent. +* :ghpull:`26018`: good first issue bot rewording +* :ghpull:`13482`: Allow sharing Locators and Formatters across Axises. +* :ghpull:`25950`: Upload nightlies to new location +* :ghpull:`25473`: ci: Merge sdist and wheel building workflows +* :ghpull:`25825`: Fix MarkerStyle types +* :ghpull:`26002`: Bump pypa/cibuildwheel from 2.12.3 to 2.13.0 +* :ghpull:`25999`: "Inactive" workflow: add close label for inactive issues +* :ghpull:`24493`: DOC: dropdowns in userguide +* :ghpull:`25970`: FIX: resolve an issue where no ticks would be drawn for a colorbar with SymLogNorm and ranging exactly from 0 to linthresh +* :ghpull:`25989`: test annotate(textcoords=offset fontsize) +* :ghpull:`25044`: Modify ``hexbin`` to respect :rc:``patch.linewidth`` +* :ghpull:`25667`: Fix bar datetime +* :ghpull:`25794`: Raise on plural scatter +* :ghpull:`25986`: Remove unused/unnecessary parts of _macosx.m View. +* :ghpull:`25689`: Update watermark example +* :ghpull:`25735`: Add comment on issues marked 'good first issue' +* :ghpull:`25968`: Cleanup scalarformatter.py example. +* :ghpull:`18715`: Allow setting default AutoMinorLocator +* :ghpull:`25961`: Fix nightly CI +* :ghpull:`25844`: [TYP] Reduce stubtest ignores +* :ghpull:`25952`: Switch from provision-with-micromamba to setup-micromamba +* :ghpull:`25940`: Cleanups to Annotation. +* :ghpull:`25948`: DOC: don't advocate deleting main branch +* :ghpull:`25939`: Cleanup time_series_histogram example. +* :ghpull:`25883`: Check gridspecness of colorbars on the right figure. +* :ghpull:`25904`: Support spine.set() in SpinesProxy. +* :ghpull:`25909`: #25900 update figure.py +* :ghpull:`25746`: Tick label font family via tick_params +* :ghpull:`25787`: [TYP/MNT] Remove unused imports from stub files +* :ghpull:`25891`: Adds tests for nargs_err in legend, stem, pcolorfast and cycler. +* :ghpull:`25886`: Simplify isort config. +* :ghpull:`25889`: Deprecate CbarAxesBase.toggle_label. +* :ghpull:`25884`: Correctly pass location when constructing ImageGrid colorbar. +* :ghpull:`25888`: Fix incorrect doc references. +* :ghpull:`25885`: Cleanup demo_axes_grid{,2}. +* :ghpull:`25872`: MNT: update Shadow init signature +* :ghpull:`25389`: Add configuration of Shadow and pie shadow +* :ghpull:`25859`: Deprecate passing extra arguments to Figure.add_axes +* :ghpull:`25863`: Fix incorrect usage of nargs_error. +* :ghpull:`25845`: more explicit about what remote means in context +* :ghpull:`23888`: Fix PolygonSelector.clear() +* :ghpull:`25848`: Simplify lasso_demo example. +* :ghpull:`25841`: Deprecate Tick.set_label{1,2}. +* :ghpull:`25728`: Remove and deprecate unused methods in src +* :ghpull:`25843`: Fix invalid range validators. +* :ghpull:`25821`: 3D plots shared view angles +* :ghpull:`25726`: Replace usage of WenQuanYi Zen Hei by Noto Sans CJK +* :ghpull:`25828`: DOC: add remote upstream +* :ghpull:`25814`: [TYP] Correct type hint for Transform.transform return +* :ghpull:`25812`: Fix typo in ruff config +* :ghpull:`25807`: Users guide->User guide +* :ghpull:`25799`: Discourage fontdict +* :ghpull:`25798`: [DOC/TYP]: Allow any array like for set_[xy]ticks, not just list of float +* :ghpull:`25632`: Include data kwarg in pyi stubs +* :ghpull:`25790`: Document default value of corner_mask in the corresponding example. +* :ghpull:`25788`: ci: Increase retry count on PR conflict check +* :ghpull:`25482`: Draw 3D gridlines below axis lines, labels, text, and ticks +* :ghpull:`25607`: Missing return type hints for Figure +* :ghpull:`25783`: Cleanup demo_text_path. +* :ghpull:`25780`: Shorten anchored_artists example. +* :ghpull:`25781`: Deprecate AnchoredEllipse. +* :ghpull:`25786`: DOC: Fix minor typo in API change notes +* :ghpull:`25773`: condensed pull request template +* :ghpull:`25712`: Prevents axes limits from being resized by axes.fill_between +* :ghpull:`25782`: Fix release note reference to pyplot.axis +* :ghpull:`25777`: Cleanup demo_axes_divider. +* :ghpull:`25774`: Small axislines.Axes cleanups. +* :ghpull:`25772`: Only print actually tested QT APIs when erroring +* :ghpull:`25769`: Set PostScript language level to 3 +* :ghpull:`25753`: Update, correct, and add badges/links +* :ghpull:`25747`: Tweak axis_direction demo. +* :ghpull:`23059`: FIX: Decrease figure refcount on close of a macosx figure +* :ghpull:`25606`: [pre-commit.ci] pre-commit autoupdate +* :ghpull:`25752`: Enable lazy-loading of images in HTML docs +* :ghpull:`25648`: Remove nonfunctional Axes3D.set_frame_on and get_frame_on methods. +* :ghpull:`25479`: FIX: Allow different colormap name from registered name +* :ghpull:`25763`: Bump pypa/cibuildwheel from 2.12.1 to 2.12.3 +* :ghpull:`24661`: Plots first and last minor ticks #22331 +* :ghpull:`25759`: Fix typo in api_interfaces.rst +* :ghpull:`20214`: Move AxisArtistHelpers to toplevel. +* :ghpull:`25737`: Update PULL_REQUEST_TEMPLATE.md to include issue cross-reference. +* :ghpull:`25729`: Cleanup GridHelperCurveLinear/GridFinder. +* :ghpull:`25730`: Add test for Path.contains_path +* :ghpull:`25359`: Add bfit bolditalic tex cmd +* :ghpull:`25739`: grammar/wording tweak for backports +* :ghpull:`25597`: Add (color, alpha) tuple as a valid ColorType in typing.py +* :ghpull:`25324`: Fix axes vlines and hlines using wrong coordinates +* :ghpull:`25713`: Remove print_figure overrides in backend subclasses +* :ghpull:`25719`: TYP: Clean up CapStyle/FillStyle type hints +* :ghpull:`25720`: ci: Set apt to retry operations on failure +* :ghpull:`25722`: DOC: Fix duplicated words +* :ghpull:`25584`: Expire remaining 3.6 deprecations +* :ghpull:`25721`: TST: Handle missing black more resiliently +* :ghpull:`25718`: Improve color documentation and typing +* :ghpull:`25652`: DOC: clarify the milestoning and backport policy wording +* :ghpull:`25711`: TYP: allow for xlim/ylim passed as single tuple +* :ghpull:`25594`: changed to RST +* :ghpull:`25708`: Deprecate unused NavigationToolbar2QT signal. +* :ghpull:`25618`: DOC: fix Sphinx Gallery discussion to explain mixed subddirs +* :ghpull:`25710`: TYP: Fix type hint (and docstring) for Bbox.intersection +* :ghpull:`25707`: CI: skip Azure Pipelines for doc-only change +* :ghpull:`25686`: Add Figure methods get_suptitle(), get_subxlabel(), get_supylabel() +* :ghpull:`25697`: Annotation cleanups. +* :ghpull:`25586`: Post stubtest results to GitHub checks +* :ghpull:`25696`: Use true positional args in check_foo APIs instead of simulating them. +* :ghpull:`25698`: Fix codecov.yml so it is valid. +* :ghpull:`25687`: More informative exception messages +* :ghpull:`25692`: Fixed bug: mathtext rendered width not being calculated correctly +* :ghpull:`25690`: TST: Import MatplotlibDeprecationWarning consistently +* :ghpull:`22286`: Fixed ``eventplot`` issues +* :ghpull:`25656`: DOC: update/fix autoscaling documentation +* :ghpull:`25668`: Fix what's new note for text +* :ghpull:`25651`: MNT: deprecate unused numdecs LogLocator param +* :ghpull:`25655`: Clean up FileIO type hints +* :ghpull:`25664`: Fix 'can not' -> 'cannot' typo +* :ghpull:`25657`: Bump cygwin/cygwin-install-action from 3 to 4 +* :ghpull:`25640`: pgf: Add clipping to text outputs +* :ghpull:`25639`: Fixing typos +* :ghpull:`25647`: Pin mypy to v1.1.1 for CI +* :ghpull:`25588`: Rename parameters for consistency +* :ghpull:`25628`: Bump invalid hatch removal +* :ghpull:`25610`: DOC: Update user_explain\text\README.txt to reference example page +* :ghpull:`25587`: Ensure tinypages ignored by mypy/stubtest +* :ghpull:`25609`: Use _api.nargs_error in more places +* :ghpull:`25414`: DOC: add a note about linewidth to scatter docs +* :ghpull:`23199`: Do not set clip path if it exists +* :ghpull:`22173`: Support ``\text`` in ``mathtext`` +* :ghpull:`24312`: Deprecate axes_divider.AxesLocator. +* :ghpull:`24969`: Optimize C code +* :ghpull:`25501`: FIX: Tk photoimage resize +* :ghpull:`25565`: making sure colors has the attribute size +* :ghpull:`25583`: MNT: use less eval +* :ghpull:`25569`: Use raw instead of png for font manager memory leak test +* :ghpull:`25253`: Use pybind11 in ttconv module +* :ghpull:`24976`: Initial implementation of type stubs (mypy/PEP484) +* :ghpull:`25576`: Skip pgf pdflatex text if cm-super is not installed +* :ghpull:`24991`: Fix issue with shared log axis +* :ghpull:`25221`: Add links and expand mathmpl docstring +* :ghpull:`25498`: FIX: Use mappable data when autoscaling colorbar norm +* :ghpull:`25570`: Use symbolic operator names (moveto, lineto) in contour_manual example. +* :ghpull:`25559`: Make guiEvent available only within the event handlers. +* :ghpull:`25405`: Fix incorrect stride calculations in LogLocator.tick_values() +* :ghpull:`25226`: Fix unintended space after comma as a decimal separator +* :ghpull:`25563`: Add pytest==7.0.0 on requirements/testing/minver.txt +* :ghpull:`25553`: FIX: macosx, always put timers on main thread +* :ghpull:`25557`: Rename parameter of Annotation.contains and Legend.contains. +* :ghpull:`25564`: Bump actions/stale from 7 to 8 +* :ghpull:`25562`: Add pytest==3.6.0 on requirements/testing/minver.txt +* :ghpull:`25551`: Restore autolimits status when pressing "home" key. +* :ghpull:`25554`: Remove unused private SpanSelector._pressv and ._prev. +* :ghpull:`25546`: In Artist.contains, check that moussevents occurred on the right canvas. +* :ghpull:`24728`: Add Axes.ecdf() method. +* :ghpull:`25291`: Limit full-invalidation of CompositeGenericTransforms. +* :ghpull:`25550`: "Inactive" workflow: bump operations to 150 +* :ghpull:`25539`: Remove explicit symbol visibility pragmas +* :ghpull:`25502`: DOC: Suggest replacement for tostring_rgb +* :ghpull:`25532`: Annotations tutorial +* :ghpull:`25456`: Expire more mpl3.6 deprecations. +* :ghpull:`25505`: DOC: combine marker examples +* :ghpull:`25510`: Remove unnecessary calls to Formatter.set_locs. +* :ghpull:`25487`: DOC/BLD: stop using sg head [ci doc] +* :ghpull:`25507`: gitignore doc/users/explain +* :ghpull:`25504`: "Inactive" workflow: bump operations to 125 +* :ghpull:`24691`: ENH: Add option to define a color as color=(some_color, some_alpha) +* :ghpull:`25475`: Stop building 32-bit Linux wheels +* :ghpull:`25484`: Deprecate tostring_rgb. +* :ghpull:`25395`: DOC: user/explain reorg (and moving a lot of tutorials). +* :ghpull:`25425`: Added get_shape as an alias for get_size + tests +* :ghpull:`25281`: Bugfix for loc legend validation +* :ghpull:`25469`: Autoload numpy arrays in get_sample_data. +* :ghpull:`25472`: Use get_sample_data(..., asfileobj=False) less. +* :ghpull:`25444`: Adjust parent axes limits when clearing floating axes. +* :ghpull:`25235`: Update release guide instructions post v3.7.0 +* :ghpull:`24531`: Use user-selected format in Tk savefig, rather than inferring it from the filename +* :ghpull:`25467`: DOC: update suptitle example to remove percent_bachelors_degrees csv +* :ghpull:`25454`: Remove unnecessary norm typecheck in tripcolor(). +* :ghpull:`25455`: “Inactive” workflow: bump operations to 100 +* :ghpull:`25464`: Skip Appveyor for doc only change (second attempt) +* :ghpull:`25430`: Edit error messages for when metadata is passed to ``savefig`` +* :ghpull:`23200`: Deprecate empty offsets in get_path_collection_extents +* :ghpull:`25427`: Store FloatingAxes "extremes" info in fewer places. +* :ghpull:`25434`: ci: Install pytz for Pandas nightly wheel +* :ghpull:`25404`: Move _SelectorWidget._props into SpanSelector +* :ghpull:`25421`: wx backend should flush the clipboard before closing it +* :ghpull:`25429`: DOC: remove default logo [ci doc] +* :ghpull:`25423`: DOC/BLD: make logo compatible with pydata-sphinx-theme +* :ghpull:`25424`: “Inactive” workflow: increase operations to 75 +* :ghpull:`25138`: Deprecate QuadContourSet.allsegs, .allkinds, .tcolors, .tlinewidths. +* :ghpull:`25415`: Add links for path types and general improvements +* :ghpull:`25420`: Print incorrect tz argument in error message +* :ghpull:`25413`: Make tk backend use native crosshair cursor +* :ghpull:`24984`: Expire deprecations from 3.6 +* :ghpull:`25380`: Merge 3.7.1 into main +* :ghpull:`24861`: Documentation fixes +* :ghpull:`24649`: Fix loc legend validation +* :ghpull:`25383`: CI: skip appveyor for doc only change +* :ghpull:`25081`: added a note to avoid f-strings in logging +* :ghpull:`25373`: Expire mpl_toolkits deprecations. +* :ghpull:`25387`: Remove LGTM references and minor doc fixes +* :ghpull:`25382`: Correct patheffects doc +* :ghpull:`25378`: "Inactive" workflow: bump operations-per-run +* :ghpull:`25358`: Remove unused menu field from macos NavigationToolbar2. +* :ghpull:`25352`: MNT: Use WeakKeyDictionary and WeakSet in Grouper +* :ghpull:`20649`: Add colour vision deficiency simulation +* :ghpull:`25287`: Fix unmatched offsetText label color +* :ghpull:`25332`: Support pickling of figures with aligned x/y labels. +* :ghpull:`25334`: Fix for all NANs in contour +* :ghpull:`25335`: "Inactive" workflow: fix typo +* :ghpull:`25163`: GitHub: auto set inactive label +* :ghpull:`22816`: FIX: savefig)...,transparent=True) now makes inset_axes transparent a… +* :ghpull:`25316`: Use setattr_cm more. +* :ghpull:`25258`: Document PowerNorm parameters +* :ghpull:`25209`: MNT: re-organize galleries under one subdir +* :ghpull:`25304`: Add import sorting to ``/plot_types`` +* :ghpull:`25296`: Remove straggler 3.7 release notes +* :ghpull:`25147`: Add ruff config to pyproject.toml for devs who are interested +* :ghpull:`25282`: Simplify transforms invalidation system. +* :ghpull:`25270`: merge up 3.7.0 +* :ghpull:`25255`: Make default facecolor for subfigures be transparent ("none"). Fix for issue #24910 +* :ghpull:`25252`: Support make_compound_path concatenating only empty paths. +* :ghpull:`25211`: Em dashes instead of consecutive hyphens. +* :ghpull:`25243`: Cleanup wx docstrings. +* :ghpull:`25261`: [CI] Skip tests on doc-only changes +* :ghpull:`25192`: Expire wx canvas param deprecation +* :ghpull:`25249`: DOC: remove constrained_layout kwarg from tutorials and user guide +* :ghpull:`25232`: Remove a redundant comma in ``AsinhScale`` +* :ghpull:`25195`: DOC: explain how to make a fixed-size axes +* :ghpull:`25207`: Add mpl_round_to_int +* :ghpull:`24983`: Refactor parts of Axis for readability +* :ghpull:`25203`: Replace checking Number with Real +* :ghpull:`25202`: DOC: reorder CI control guidance +* :ghpull:`25200`: Don't handle unknown_symbols in ``\operatorname``. +* :ghpull:`24849`: Stripey ``LineCollection`` +* :ghpull:`25177`: Add locator API links to tick-locators example +* :ghpull:`25166`: Clean + comment MaxNLocator +* :ghpull:`25157`: Small tweak in chapter sorting of the example gallery +* :ghpull:`25099`: Add isort (import sorting) to pre-commit hooks +* :ghpull:`25175`: BLD: Unbreak github tests workflow +* :ghpull:`25125`: Use "array" instead of "numpy array" except when emphasis is needed. +* :ghpull:`25144`: FIX: improve CL description and remove constrained_layout text +* :ghpull:`25101`: Deprecate LocationEvent.lastevent. +* :ghpull:`25152`: Group shape/dtype validation logic in image_resample. +* :ghpull:`25145`: BLD: only doc CI build +* :ghpull:`25153`: Delete redundant examples from user gallery that are also present in the annotations tutorial +* :ghpull:`25156`: On macOS, limit symbols exported by extension modules linking FreeType. +* :ghpull:`25150`: DOC: use 'none' in set_layout_engine +* :ghpull:`25131`: FIX: Correctly report command keypress on mac for Tk + Gtk +* :ghpull:`25112`: Connect stream lines if no varying width or color +* :ghpull:`25142`: Minor style tweaks to freetype build. +* :ghpull:`25143`: Don't special-case getSaveFileName in qt_compat anymore. +* :ghpull:`24436`: Make LogLocator only return one tick out of range +* :ghpull:`25135`: Whisker length, more precise description +* :ghpull:`25100`: add section on annotating an artist using axes.annotate +* :ghpull:`24486`: Minor cleanup and add test for offsetbox +* :ghpull:`24964`: Minor cleanup and optimization of Sketch +* :ghpull:`25121`: Inline ContourSet._make_paths. +* :ghpull:`25120`: Consistently document shapes as (M, N), not MxN. +* :ghpull:`24445`: Makefile html-noplot,clean: constrained layout tutorial image handling +* :ghpull:`25115`: Remove tests.py runner from repo root +* :ghpull:`24866`: write addfont example +* :ghpull:`24638`: MNT: Remove auto-flattening of input data to pcolormesh +* :ghpull:`24985`: Deprecate unused/undocumented functions in proj3d +* :ghpull:`25104`: tk blitting to destroyed canvases should be a noop, not a segfault. +* :ghpull:`25108`: Update flake8 per-file ignores +* :ghpull:`25091`: Caching figures generated by plot directive +* :ghpull:`25096`: Remove unused import of re introduced in #23442 +* :ghpull:`24749`: Support only positional args in contour. Error if no positional argument. +* :ghpull:`23442`: Remove need to detect math mode in pgf strings +* :ghpull:`25023`: Update Release guide to current practices +* :ghpull:`24816`: [FIX]: Make inset axes transparent on savefig(..., transparent=True) +* :ghpull:`24967`: Rewrite bullseye example to use bar() instead of pcolormesh(). +* :ghpull:`24994`: Use ``_axis_map`` instead of ``getattr`` in ``Axes`` and ``Figure`` +* :ghpull:`25087`: feat: add new SI prefixes to ticker +* :ghpull:`25073`: MAINT: don't format logs in log call. +* :ghpull:`25061`: Ensure TwoSlopeNorm always has two slopes +* :ghpull:`25064`: Bump mamba-org/provision-with-micromamba from 14 to 15 +* :ghpull:`25046`: ci: Re-add the login shell to nightlies jobs +* :ghpull:`24980`: Python 3.9 upgrade +* :ghpull:`25035`: ci: Only attempt to upload nightlies from successful builds +* :ghpull:`24995`: Improve 3D quiver test +* :ghpull:`24992`: Bump NumPy to 1.21 +* :ghpull:`25007`: Minor refactoring of Axes3D +* :ghpull:`25021`: Doc: sg section separator +* :ghpull:`25028`: separate out folders in gallery ordering +* :ghpull:`24981`: ENH: pad_inches='layout' for savefig +* :ghpull:`25022`: DOC: tweak array indexing in constrained layout tutorial +* :ghpull:`24990`: Make arguments other than ``renderer`` keyword-only for ``get_tightbbox`` +* :ghpull:`25013`: Clarify/shorten gca management in colorbar(). +* :ghpull:`25003`: Bump cygwin/cygwin-install-action from 2 to 3 +* :ghpull:`24978`: Simplify handling of out-of-bound values ``Colormap.__call__``. +* :ghpull:`24998`: Unbreak Azure CI +* :ghpull:`24907`: DOC/BUILD add ability for conf to skip whole sections +* :ghpull:`22999`: CI: Add a Cygwin run to GHA CI. +* :ghpull:`24919`: Remove support for python 3.8 +* :ghpull:`24942`: Expire module deprecations +* :ghpull:`24943`: Remove special casing for PyPy not required anymore +* :ghpull:`24929`: Small unrelated cleanups/style fixes. +* :ghpull:`24923`: Cleanup cbook deprecations and layout +* :ghpull:`24920`: Add --only-binary to nightly pip install +* :ghpull:`24913`: Deprecate Bbox.anchored() with no container. +* :ghpull:`24905`: Remove some long-obsolete commented code in grid_helper_curvelinear. + +Issues (185): + +* :ghissue:`26765`: [Bug]: Crash in Windows 10 if polar axis lim is lower than lowest data point. +* :ghissue:`26674`: [Doc]: Line3DCollection segments +* :ghissue:`26531`: [Bug]: ValueError thrown when ``levels`` is set to a lower value than ``vmin`` when using ``contours`` method of Axes +* :ghissue:`26029`: [MNT]: Unify tex2uni +* :ghissue:`26637`: [Doc]: Reduce references to set_tight_layout +* :ghissue:`26639`: [Bug]: Incorrect type annotation for legend handes? +* :ghissue:`26600`: [Doc]: contourf demo use of origin keyword +* :ghissue:`26508`: [Doc]: Pyplot Axes – tuple or list? +* :ghissue:`21524`: [Bug]: Removing an inset_axes that shares an axes does not remove it from the sharing group +* :ghissue:`26604`: [Doc]: Inappropriate example in gallery +* :ghissue:`26379`: [doc]: add 'validate' section to install docs +* :ghissue:`19409`: Boxplot: Median line too long after changing linewidth +* :ghissue:`26510`: [Bug]: mathtext silently ignores content after mismatched opening brace +* :ghissue:`26501`: [Bug]: type-checking errors with mypy + matplotlib 3.8.0rc1 +* :ghissue:`16657`: Postscript backend gives wrong page sizes +* :ghissue:`11771`: Change PdfPages to default to keep_empty=False and eventually deprecate keep_empty +* :ghissue:`26438`: [ENH]: ``musllinux`` wheels for Alpine +* :ghissue:`26446`: Disallow ``clip`` when ``vmin`` and ``vmax`` are not set in ``matplotlib.colors.Normalize`` +* :ghissue:`10002`: can't stop macosx mainloop +* :ghissue:`7551`: automatic papersize selection by ps backend is almost certainly broken +* :ghissue:`15913`: Switching to inline backend closes GUI windows +* :ghissue:`26460`: [TST] Upcoming dependency test failures +* :ghissue:`17566`: Updating an array passed as the xy parameter to annotate updates the anottation +* :ghissue:`24723`: [Doc]: Delete examples made redundant by annotation tutorial rewrite (annotate_simple01, ...) +* :ghissue:`26398`: [Bug]: fig.subplots_adjust and ax.set_yticklabels together can produce unexpected results +* :ghissue:`10767`: ENH: Possibility to decide tick and label position in mplot3d +* :ghissue:`9158`: Angled text not placed correctly with usetex in EPS +* :ghissue:`26400`: [Doc]: advice to use QuadContourSet.collections +* :ghissue:`26409`: [TST] Upcoming dependency test failures +* :ghissue:`26351`: [Doc]: Bad rendering of the title of the MRI example +* :ghissue:`26156`: [Doc]: navigating to the User Guide +* :ghissue:`15785`: xlim_changed not emitted on shared axis +* :ghissue:`26343`: [Bug]: ContourSet.antialiased attribute not present +* :ghissue:`14247`: latex \substack doesn't work +* :ghissue:`17190`: ipython autocomplete does not work for plt.figure() +* :ghissue:`13164`: Figures in windows not tabs +* :ghissue:`23212`: Support ``\middle`` +* :ghissue:`26082`: [MNT]: Make cyclers indexable and rely on indexing them rather than itertools.cycle +* :ghissue:`16938`: keyword share_all in ImageGrid class +* :ghissue:`26340`: [ENH]: ContourSet.set_paths +* :ghissue:`26236`: [Bug]: ax.scatter (projection='3d') - incorrect handling of NaN +* :ghissue:`22714`: [Bug]: parasite_axes does not properly handle units +* :ghissue:`22338`: [Bug]: rcParams['legend.loc'] can't use float-tuple like kwarg legend(loc...) +* :ghissue:`25942`: Make ``TexManager.texcache`` private +* :ghissue:`26289`: [Bug]: mathtext caching issue in multi-threaded environment with tight_layout=True +* :ghissue:`26272`: [Bug]: qt window blank after using save button +* :ghissue:`26308`: [Bug]: labels can't be placed at start of contours +* :ghissue:`2369`: Cleaning up kwargs in ContourSet +* :ghissue:`14118`: imshow() should not modify axes aspect if transform != ax.transData. +* :ghissue:`26081`: [ENH]: Add setters for _AxLine._xy1, ._xy2, ._slope +* :ghissue:`25643`: [ENH]: Support for ``\boldsymbol`` +* :ghissue:`1366`: Support \boldsymbol. (Feature request.) +* :ghissue:`26283`: [Bug]: set_ticks provides mysterious error message +* :ghissue:`25162`: [Bug]: pcolormesh properties and getter shapes changed w/o notice +* :ghissue:`26261`: [Doc]: Double entries in navigation menu of Using Matplotlib +* :ghissue:`4334`: Axes3D: factor out 3D coordinate guessing from format_coord() +* :ghissue:`22775`: [Bug]: 3d mouse coords values reported in toolbar are meaningless +* :ghissue:`25770`: [ENH]: support RGB(A) in pcolor +* :ghissue:`26031`: [MNT]: decrease timeout on interactive tests locally +* :ghissue:`26264`: [Doc]: Incorrectly drawn bounding box +* :ghissue:`26206`: [Doc]: follow on to #25247 +* :ghissue:`26225`: [Bug]: MultiCursor in inset axes +* :ghissue:`22277`: [Doc]: Exchange step() for stairs() in the Plot types - Basic section +* :ghissue:`25493`: [Doc]: users/explain bare index looks bad +* :ghissue:`25114`: [Bug]: matplotlib.path.Path.to_polygons fails with TriContourSet paths +* :ghissue:`26194`: [Bug]: dataLims get replaced by inf for charts with twinx if ax1 is a stackplot +* :ghissue:`6139`: 'QuadContourSet' object has no attribute 'set_visible' or 'set_animated' +* :ghissue:`25128`: [MNT]: Turn ContourSet into a (nearly) plain Collection +* :ghissue:`26100`: [Bug]: Axis multiplier when using plot_surface appears outside of the figure window +* :ghissue:`15518`: Collections could check x- and y- transforms separately to decide whether to autoscale each direction +* :ghissue:`26182`: [TST] Upcoming dependency test failures +* :ghissue:`25857`: [Doc]: gitwash deleting main branch +* :ghissue:`15054`: Improve tests by removing text or using figure comparisons +* :ghissue:`8794`: animation.save problems with ffmpeg +* :ghissue:`26140`: [Doc]: Sort greek/hebrew letters in math docs alphabetically +* :ghissue:`25042`: [Bug]: ``\geqslant``, ``\leqslant`` and ``\eqslantgtr`` are not spaced like their non-slanted versions +* :ghissue:`25014`: [ENH]: Add public method to update ``Legend`` object's loc property . +* :ghissue:`26124`: [Bug]: NavigationToolbar2 mouse over event causes toolbar height increase and axes reposition +* :ghissue:`24663`: [ENH]: Set color of legend shadow +* :ghissue:`7199`: Old whatsnews should be rendered using classic style +* :ghissue:`12926`: Inconsistent behavior of hexbins mincnt parameter, depending on C parameter +* :ghissue:`25030`: [BUG]: Button widgets don't work in inset axes +* :ghissue:`10009`: document event handling with twined axes +* :ghissue:`25477`: Plot ellipse with arrow showing rotation +* :ghissue:`26083`: [Bug]: Star marker (using mathtext) is not center-aligned +* :ghissue:`26015`: [ENH]: Missing mathematical operations +* :ghissue:`8802`: Masked pcolormesh is not tested correctly +* :ghissue:`25244`: [Bug]: DeprecationWarning for pkg_resources.declare_namespace usage in mpl_toolkit +* :ghissue:`25344`: pydata-sphinx-theme 0.13 causes doc builds to fail +* :ghissue:`25590`: [Doc]: type annotations rendering +* :ghissue:`25941`: [Doc]: Rewrite rainbow_text example to use annotate() +* :ghissue:`25497`: [ENH]: hi-res plot directive... +* :ghissue:`25675`: [ENH]: Add get/set_antialiased to Text objects +* :ghissue:`17069`: Error creating AxisGrid with non-default axis class +* :ghissue:`8965`: Add alias for colormaps for grey vs gray English issues +* :ghissue:`25945`: [Bug]: (edge case) no ticks are drawn in colorbars with SymLogNorm +* :ghissue:`25907`: [ENH]: Add test for annotate(textcoods="offset fontsize") +* :ghissue:`25654`: [Bug]: bar/barh don't trigger datetime units +* :ghissue:`19120`: Raise when both singular and plural scatter attributes are specified +* :ghissue:`14233`: Feature Request: Allow setting default AutoMinorLocator +* :ghissue:`25900`: [Doc]: I think you missed a ``fig`` here. +* :ghissue:`18425`: Add fontfamily/labelfont to tick_params +* :ghissue:`25864`: [MNT]: add tests for nargs_error +* :ghissue:`23595`: [Bug]: ``CbarAxesBase.toggle_label`` doesn't seem to work properly +* :ghissue:`25835`: [MNT]: Do not accept arbitrary positional parameters in Figure.add_axes() +* :ghissue:`25833`: [MNT]: Privatize Tick.set_label1() / Tick.set_label2() +* :ghissue:`11181`: [feature request] multiple 3d plots with tied viewing angles +* :ghissue:`25724`: [MNT]: Switch docs/examples to use Noto Sans CJK instead of WenQuanYi Zen Hei as CJK font +* :ghissue:`24779`: [Doc]: windows install instructions do not work +* :ghissue:`24701`: VS Code: Autocomplete and Syntax Highlighting do not work for matplotlib +* :ghissue:`25682`: [Bug]: fill_between{x} does not respect Axes transform +* :ghissue:`23061`: [Bug]: macosx timers don't fire if plt.show() hasn't been called +* :ghissue:`19769`: Memory leak when plotting multiple figures with the macOS backend +* :ghissue:`24331`: [Doc]: Lazy loading for images +* :ghissue:`24689`: [Bug]: Axes3D.set_frame_on not working as documented +* :ghissue:`5087`: Confusing (broken?) colormap name handling +* :ghissue:`22331`: [Bug]: First and or last minor ticks sometimes not plotted +* :ghissue:`19393`: \bf\it in mathtext +* :ghissue:`23171`: [Bug]: axes vlines() / hlines() incorrectly use data coordinate as min when blended transform is applied +* :ghissue:`5234`: Unicode with usetex=True and pgf backend +* :ghissue:`25677`: [Doc]: Axes.hlines and Axes.vlines (and probably others) can accept a single color as well as a list of colors. +* :ghissue:`25649`: [Doc]: backport strategy: inconsistency in guide +* :ghissue:`25582`: [Doc]: Commented Out Code in Downloadable Examples for Toolkits Tutorials +* :ghissue:`25695`: [Bug]: codecov.yml is invalid +* :ghissue:`23810`: [Bug]: Text objects don't take Mathtext into account while wrapping. +* :ghissue:`7560`: Edge cases in eventplot are likely broken +* :ghissue:`25613`: [Doc]: better document default margins +* :ghissue:`25638`: [MNT]: numdecs parameter in ``LogLocator`` +* :ghissue:`11375`: PGF output: Contour labels extend beyond figure boundary +* :ghissue:`25608`: [Bug]: ``bbox_inches="tight"`` does not work for writer.grab_frame() +* :ghissue:`25599`: [MNT]: The new default x and ymargin setting is too wasteful +* :ghissue:`25410`: [Bug]: Small Scatter Plot Marker Size Results in Circles +* :ghissue:`25053`: [Doc]: How to show an ASCII hyphen in math text without using TeX? +* :ghissue:`18520`: Matplotlib cannot parse TeX with \text command +* :ghissue:`25560`: [Bug]: legend for Poly3dCollection fails +* :ghissue:`20504`: Support type checking with mypy +* :ghissue:`7160`: pgf_pdflatex test fails on Windows +* :ghissue:`14527`: Log scale messed up in histograms when sharing axes +* :ghissue:`25521`: [Doc]: ``TABLEAU_COLORS`` ``XKCD_COLORS`` etc undocumented +* :ghissue:`5424`: Update colorbar after changing mappable.norm +* :ghissue:`22211`: [Bug]: scroll_event is broken after motion_notify_event in WXAgg +* :ghissue:`24092`: [Bug]: LogLocator with subs argument fragile. +* :ghissue:`23626`: [Bug]: unintended space between comma and digit when using useMathText = True together with comma as decimal separator +* :ghissue:`23154`: [MNT]: requirements/testing/minver.txt could also test oldest-supported pytest version +* :ghissue:`5675`: plt.pause() with threading is extremely slow for MacOSX backend +* :ghissue:`6630`: handling of zeros in log-scale changes irreversibly after user zoom +* :ghissue:`6324`: artist.contains should check that the event occurred in the same figure +* :ghissue:`16561`: Feature request: proper ECDF +* :ghissue:`25426`: [ENH]: Update grid_helper on FloatingSubplot +* :ghissue:`22663`: [Doc]: Consoldiate scatter symbol examples +* :ghissue:`24681`: [ENH]: set facecolor and edgecolor alpha separately +* :ghissue:`5336`: RendererAgg.tostring_rgb merely truncates alpha +* :ghissue:`22494`: [ENH]: Add ``get_shape`` as alias for ``get_size`` in AxesImage, or make that include depth too +* :ghissue:`5327`: Make ``mpl_toolkits`` a non-namespace package +* :ghissue:`9823`: Missing __init__.py file in mpl_toolkits +* :ghissue:`24605`: [Bug]: Validation not performed for ``loc`` argument to ``legend`` +* :ghissue:`25445`: [Doc]: Not possible to see upcoming what's new etc? +* :ghissue:`24450`: [MNT]: Fix or drop support for Tk 8.4 +* :ghissue:`25453`: [ENH]: Let norm argument accept string values in tripcolour +* :ghissue:`25401`: [Bug]: savefig + jpg + metadata fails with inscrutable error message +* :ghissue:`1735`: ``_path.get_path_collection_extents`` potentially wrong return value +* :ghissue:`25431`: [TST] Upcoming dependency test failures +* :ghissue:`25199`: [Bug]: AttributeError: 'LassoSelector' object has no attribute '_props' +* :ghissue:`25080`: Add note in contrib guide admonishing against use of f strings in logs +* :ghissue:`25165`: [Bug]: offsetText is colored based on tick.color instead of tick.labelcolor +* :ghissue:`25329`: [Bug]: Unable to pickle figure with aligned labels +* :ghissue:`14124`: plt.contour with all NaNs fails assertion in _contour.cpp +* :ghissue:`22674`: [Bug]: savefig(..., transparent=True) does not make inset_axes transparent +* :ghissue:`25303`: CI: isort should check plot_types? +* :ghissue:`25137`: [Bug]: stop responding in demo program "matplotlib/examples/event_handling/lasso_demo.py" +* :ghissue:`24910`: [Bug]: Suptitle not visible with subfigures +* :ghissue:`25222`: [ENH]: add organizational charts to supported plots +* :ghissue:`24796`: [Bug]: gapcolor not supported for LineCollections +* :ghissue:`25172`: [Doc]: cross link locator example with locator API +* :ghissue:`24419`: [Doc]: add from file to font family example +* :ghissue:`23809`: [Bug]: blitting after closing second tkinter embed causes silent crash +* :ghissue:`16580`: Segmentation fault when blitting onto closed figure (TkAgg) +* :ghissue:`24743`: [Bug]: contour raises IndexError if Z is specified as keyword argument +* :ghissue:`24283`: [Bug]: colorbar interacts poorly with TwoSlopeNorm when one slope is infinite +* :ghissue:`24906`: [DOC/BUILD] add ability to selectively build docs +* :ghissue:`24901`: [TST] Upcoming dependency test failures +* :ghissue:`17991`: type stubs for matplotlib +* :ghissue:`17583`: Linter complains about unexpected data-type, however, docs say this is possible +* :ghissue:`15926`: Support for Python Type Hints (PEP 484) +* :ghissue:`13798`: Add PEP484 type hints to the code (For IDE autocompletion / hints) + diff --git a/doc/users/release_notes.rst b/doc/users/release_notes.rst index 7862305af65e..12cb60d2fb0d 100644 --- a/doc/users/release_notes.rst +++ b/doc/users/release_notes.rst @@ -18,8 +18,10 @@ Version 3.8 :maxdepth: 1 prev_whats_new/whats_new_3.8.0.rst + ../api/prev_api_changes/api_changes_3.8.1.rst ../api/prev_api_changes/api_changes_3.8.0.rst github_stats.rst + prev_whats_new/github_stats_3.8.0.rst Version 3.7 ^^^^^^^^^^^ diff --git a/galleries/tutorials/images.py b/galleries/tutorials/images.py index 24ab2bf8f495..0867f7b6d672 100644 --- a/galleries/tutorials/images.py +++ b/galleries/tutorials/images.py @@ -156,9 +156,8 @@ # commands together in one cell. plt commands will not change plots from earlier # cells. # -# There are many other colormap schemes available. See the `list and -# images of the colormaps -# <../colors/colormaps.html>`_. +# There are many other colormap schemes available. See the :ref:`list and images +# of the colormaps`. # # .. _`Color Bars`: # diff --git a/galleries/users_explain/quick_start.py b/galleries/users_explain/quick_start.py index 16d0165ec7a6..c8b6a072d6f5 100644 --- a/galleries/users_explain/quick_start.py +++ b/galleries/users_explain/quick_start.py @@ -131,7 +131,7 @@ # to provide the ``data`` keyword argument and generate plots passing the # strings corresponding to the *x* and *y* variables. # -# .. _structured numpy array: `_ # noqa: E501 +# .. _structured numpy array: https://numpy.org/doc/stable/user/basics.rec.html#structured-arrays # noqa: E501 np.random.seed(19680801) # seed the random number generator. data = {'a': np.arange(50), From fac632fe3c66344418b654d0ac86e9598c1fa89f Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Tue, 31 Oct 2023 16:39:39 -0500 Subject: [PATCH 71/83] REL: v3.8.1 This is the first bugfix release of th3 3.8.x series. This release contains several bug fixes and adjustments: - Bump setuptools required version because of setuptools_scm v8 - Update ``find_nearest_contour`` and revert contour deprecations - ``allsegs`` and ``allkinds`` return individual segments - Restore default behavior of hexbin mincnt with C provided - Try/except import of Axes3D - Ensure valid path mangling for ContourLabeler - BLD: Remove development dependencies from sdists - FIX 2-tuple of colors in to_rgba_array - Fix issue with non-string labels and legend - Fix issue with locale comma when not using math text - Various type hinting improvements - Various documentation improvements - Improvementes to the MacOS backend From 02aa131a5aeaaa018991d3f3a0b63dbf9463bd8c Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Tue, 31 Oct 2023 16:59:33 -0500 Subject: [PATCH 72/83] Post v3.8.1 bump From 47edf19669f3c0631f3432d5f8ce3a985b9b51d2 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Tue, 31 Oct 2023 18:10:17 -0500 Subject: [PATCH 73/83] Zenodo release v3.8.1 --- doc/users/project/citing.rst | 3 +++ tools/cache_zenodo_svg.py | 1 + 2 files changed, 4 insertions(+) diff --git a/doc/users/project/citing.rst b/doc/users/project/citing.rst index 77a7449b356e..d6b924afec2f 100644 --- a/doc/users/project/citing.rst +++ b/doc/users/project/citing.rst @@ -29,6 +29,9 @@ By version .. START OF AUTOGENERATED +v3.8.1 + .. image:: ../../_static/zenodo_cache/10059757.svg + :target: https://doi.org/10.5281/zenodo.10059757 v3.8.0 .. image:: ../../_static/zenodo_cache/8347255.svg :target: https://doi.org/10.5281/zenodo.8347255 diff --git a/tools/cache_zenodo_svg.py b/tools/cache_zenodo_svg.py index 2058701e5999..cbd1304bd14c 100644 --- a/tools/cache_zenodo_svg.py +++ b/tools/cache_zenodo_svg.py @@ -63,6 +63,7 @@ def _get_xdg_cache_dir(): if __name__ == "__main__": data = { + "v3.8.1": "10059757", "v3.8.0": "8347255", "v3.7.3": "8336761", "v3.7.2": "8118151", From 63bb1bf871998885eb7d26f2bc5a3e12ccb08596 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Tue, 31 Oct 2023 18:10:17 -0500 Subject: [PATCH 74/83] Zenodo release v3.8.1 (with svg this time) --- doc/_static/zenodo_cache/10059757.svg | 35 +++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 doc/_static/zenodo_cache/10059757.svg diff --git a/doc/_static/zenodo_cache/10059757.svg b/doc/_static/zenodo_cache/10059757.svg new file mode 100644 index 000000000000..d5909613dd75 --- /dev/null +++ b/doc/_static/zenodo_cache/10059757.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + DOI + + + DOI + + + 10.5281/zenodo.10059757 + + + 10.5281/zenodo.10059757 + + + \ No newline at end of file From e9df1f1e2d4b8f735cd7374d505d8f86ac657761 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Wed, 1 Nov 2023 10:07:38 -0500 Subject: [PATCH 75/83] Fix typo in release notes --- doc/api/prev_api_changes/api_changes_3.8.1.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/prev_api_changes/api_changes_3.8.1.rst b/doc/api/prev_api_changes/api_changes_3.8.1.rst index 05715ec39ac9..9c40167ebdcc 100644 --- a/doc/api/prev_api_changes/api_changes_3.8.1.rst +++ b/doc/api/prev_api_changes/api_changes_3.8.1.rst @@ -1,4 +1,4 @@ -API Changes for 3.6.1 +API Changes for 3.8.1 ===================== Behaviour From 50fd61abf06bb121ead691a750cfe554679d3203 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Wed, 1 Nov 2023 17:03:59 -0400 Subject: [PATCH 76/83] Backport PR #27244: Clarify semantics of plt.matshow(..., fignum=...). --- lib/matplotlib/pyplot.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 3f41376e0a63..42ea405c17cc 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -2413,18 +2413,15 @@ def matshow(A: ArrayLike, fignum: None | int = None, **kwargs) -> AxesImage: The matrix to be displayed. fignum : None or int - If *None*, create a new figure window with automatic numbering. + If *None*, create a new, appropriately sized figure window. - If a nonzero integer, draw into the figure with the given number - (create it if it does not exist). + If 0, use the current Axes (creating one if there is none, without ever + adjusting the figure size). - If 0, use the current axes (or create one if it does not exist). - - .. note:: - - Because of how `.Axes.matshow` tries to set the figure aspect - ratio to be the one of the array, strange things may happen if you - reuse an existing figure. + Otherwise, create a new Axes on the figure with the given number + (creating it at the appropriate size if it does not exist, but not + adjusting the figure size otherwise). Note that this will be drawn on + top of any preexisting Axes on the figure. Returns ------- From 13bb274203832e0a8bc18daf39ffa138f57d2aaf Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Wed, 1 Nov 2023 23:18:57 +0100 Subject: [PATCH 77/83] Backport PR #26703: moved communications guidelines from governance, updated and clarified process --- doc/_static/mpl.css | 19 +++ doc/devel/coding_guide.rst | 9 -- doc/devel/communication_guide.rst | 223 ++++++++++++++++++++++++++ doc/devel/index.rst | 1 + doc/devel/release_guide.rst | 25 ++- doc/users/project/code_of_conduct.rst | 2 +- doc/users/release_notes.rst | 1 + 7 files changed, 257 insertions(+), 23 deletions(-) create mode 100644 doc/devel/communication_guide.rst diff --git a/doc/_static/mpl.css b/doc/_static/mpl.css index 45ecb21d5511..a37fb76a0436 100644 --- a/doc/_static/mpl.css +++ b/doc/_static/mpl.css @@ -161,3 +161,22 @@ div.wide-table table th.stub { font-style: italic; font-size: large; } + + +.checklist { + list-style: none; + padding: 0; + margin: 0; +} +.checklist li { + margin-left: 24px; + padding-left: 23px; + margin-right: 6px; +} +.checklist li:before { + content: "\2610\2001"; + margin-left: -24px; +} +.checklist li p { + display: inline; +} diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index 49f35e3ad13e..0385d6d388f0 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -1,12 +1,3 @@ -.. raw:: html - - - .. _pr-guidelines: *********************** diff --git a/doc/devel/communication_guide.rst b/doc/devel/communication_guide.rst new file mode 100644 index 000000000000..b9fa301c0e46 --- /dev/null +++ b/doc/devel/communication_guide.rst @@ -0,0 +1,223 @@ +.. _communications-guidelines: + +======================== +Communication guidelines +======================== + +These guidelines are applicable when acting as a representative of Matplotlib, +for example at sprints or when giving official talks or tutorials, and in any +community venue managed by Matplotlib. + + +.. _communication-channels: + +Official communication channels +=============================== +The following venues are managed by Matplotlib maintainers and contributors: + +* library and docs: https://github.com/matplotlib/matplotlib +* forum: https://discourse.matplotlib.org/ +* chat: `https://matrix.to/#/#matplotlib:matrix.org `_ +* blog: https://blog.scientific-python.org/ + +.. _social-media: + +Social media +------------ + +Active social media +^^^^^^^^^^^^^^^^^^^ + +* https://twitter.com/matplotlib +* https://instagram.com/matplotart/ + +Official accounts +^^^^^^^^^^^^^^^^^ +* https://bsky.app/profile/matplotlib.bsky.social +* https://fosstodon.org/@matplotlib +* https://www.tiktok.com/@matplotart +* https://www.youtube.com/matplotlib + + +.. _mailing-lists: + +Mailing lists +------------- + +* `matplotlib-announce@python.org `_ +* `matplotlib-users@python.org `_ +* `matplotlib-devel@python.org `_ + +.. _social-media-coordination: + +Social media coordination +------------------------- +* Team mailing list: matplotlib-social@numfocus.org +* Public chat room: `https://matrix.to/#/#matplotlib_community:gitter.im `_ + + +Maintenance +----------- + +If you are interested in moderating the chat or forum or accessing the social +media accounts: + +* Matplotlib maintainers should reach out to the `community-manager`_. + +* Everyone else should send an email to matplotlib-social-admin@numfocus.org: + + * Introduce yourself - github handle and participation in the community. + * Describe the reason for wanting to moderate or contribute to social. + + +Content guidelines +================== + +Communication on official channels, such as the Matplotlib homepage or on +Matplotlib social accounts, should conform to the following standards. If you +are unsure if content that you would like to post or share meets these +guidelines, ask on the :ref:`social-media-coordination` channels before posting. + +General guidelines +------------------ + +* Focus on Matplotlib, 3rd party packages, and visualizations made with Matplotlib. +* These are also acceptable topics: + + * Visualization best practices and libraries. + * Projects and initiatives by NumFOCUS and Scientific Python. + * How to contribute to open source projects. + * Projects, such as scientific papers, that use Matplotlib. + +* No gratuitous disparaging of other visualization libraries and tools, but + criticism is acceptable so long as it serves a constructive purpose. + +* Follow communication best practices: + + * Do not share non-expert visualizations when it could cause harm: + + * e.g. https://twitter.com/matplotlib/status/1244178154618605568 + + * Clearly state when the visualization data/conclusions cannot be verified. + * Do not rely on machine translations for sensitive visualization. + +* Verify sourcing of content (especially on instagram & blog): + + * Instagram/blog: ensure mpl has right to repost/share content + * Make sure content is clearly cited: + + * e.g. a tutorial reworking an example must credit the original example + +* Limited self/corporate promotion is acceptable. + + * Should be no more than about a quarter of the content. + +Visual media guidelines +----------------------- + +Visual media, such as images and videos, must not violate the +:ref:`code of conduct `, nor any platform's rules. +Specifically: + +* Visual media must conform to the guidelines of all sites it may be posted on: + + * https://help.twitter.com/en/rules-and-policies/twitter-rules + * https://help.instagram.com/477434105621119 + +* Emphasize the visualization techniques demonstrated by the visual media. +* Clearly state that sharing is not an endorsement of the content. + + * e.g. bitcoin related visualizations + +Accessibility +^^^^^^^^^^^^^ + +Visual media in communications should be made as accessible as possible: + +* Add alt text to images and videos when the platform allows: + + * `alt text for data viz `_ + * `general alt text guide `_ + +* Warn on bright, strobing, images & turn off autoplay if possible. +* For images and videos made by the social media team: + + * Make graphic perceivable to people who cannot perceive color well due to + color-blindness, low vision, or any other reason. + + * Do not make bright, strobing images. + * More guidelines at https://webaim.org/techniques/images/. + + +Social media +============ + +Please follow these guidelines to maintain a consistent brand identity across +platforms. + +Persona +------- +On social media, Matplotlib: + +* Acts as a sentient visualization library, so talks about itself as a we, us, + our, and it. Avoids talking about itself in the 3rd person. Never uses 1st person. +* Is very earnest, eager to please, and aims to be patient & painfully oblivious + to snark and sarcasm. +* Gets over-excited over shiny visualizations - lots of emojis and the like - + and encourages folks to share their work. +* Highlights various parts of the library, especially the more obscure bits and + bobbles. +* Acknowledges that it is a sometimes frustrating tangle of bits & bobbles that + can confuse even the folks who work on it & signal boosts their confuzzlment. + + +Behavior +-------- +When acting as a representative of the library, keep responses polite and assume +user statements are in good faith unless they violate the :ref:`code of conduct `. + +Social graph +------------ + +Only follow **organizations and projects**, do not follow individual accounts for +any reason, even maintainers/project leads/famous Python people! + +Following these types of accounts is encouraged: + +* NumFocus and Scientific Python projects +* 3rd party packages +* Visualization related projects and organizations +* Open Source community projects +* Sponsors + +Recurring campaigns +------------------- + +Typically the social media accounts will promote the following: + +* Matplotlib releases: + + * Highlight new features & major deprecations + * Link to download/install instructions + * Ask folks to try it out. + +* `third party packages `_ +* NumFocus/Scientific Python/open source visualization project releases +* GSOC/GSOD recruiting and progress + +Retired campaigns +^^^^^^^^^^^^^^^^^ +* John Hunter Excellence in Plotting, submission and winners + + +Changing the guidelines +======================= + +As the person tasked with implementing communications, the `community-manager`_ +should be alerted to proposed changes to the communications guidelines. Similarly, +specific platform guidelines (e.g. twitter, instagram) should be reviewed by the +person responsible for that platform, when different from the community manager. +If there is no consensus, decisions about communications guidelines revert to +the community manager. + +.. _community-manager: https://matplotlib.org/governance/people.html#deputy-project-leads diff --git a/doc/devel/index.rst b/doc/devel/index.rst index 2b358595255b..9537859c107a 100644 --- a/doc/devel/index.rst +++ b/doc/devel/index.rst @@ -167,6 +167,7 @@ Policies and guidelines :maxdepth: 1 release_guide + communication_guide min_dep_policy MEP/index diff --git a/doc/devel/release_guide.rst b/doc/devel/release_guide.rst index 2bbe589282a3..4adc4546e879 100644 --- a/doc/devel/release_guide.rst +++ b/doc/devel/release_guide.rst @@ -455,22 +455,21 @@ Due to branch protections for the ``main`` branch, this is merged via a standard request, though the PR cleanliness status check is expected to fail. The PR should not be squashed because the intent is to merge the branch histories. -Announcing -========== +Publicize this release +====================== -The final step is to announce the release to the world. A short -version of the release notes along with acknowledgments should be sent to +After the release is published to PyPI and conda, it should be announced +through our communication channels: -- matplotlib-users@python.org -- matplotlib-devel@python.org -- matplotlib-announce@python.org - -In addition, announcements should be made on social networks (e.g., Twitter via the -``@matplotlib`` account, any other via personal accounts). - -Add a release announcement to the ``mpl-brochure-site`` "News" section of -``docs/body.html``, linking to the discourse page for the announcement. +.. rst-class:: checklist +* Send a short version of the release notes and acknowledgments to all the :ref:`mailing-lists` +* Post highlights and link to :ref:`What's new ` on the + active :ref:`social media accounts ` +* Add a release announcement to the "News" section of + `matplotlib.org `_ by editing + ``docs/body.html``. Link to the auto-generated announcement discourse post, + which is in `Announcements > matplotlib-announcements `_. Conda packages ============== diff --git a/doc/users/project/code_of_conduct.rst b/doc/users/project/code_of_conduct.rst index 8deda909bd4c..ac8b268a4e30 100644 --- a/doc/users/project/code_of_conduct.rst +++ b/doc/users/project/code_of_conduct.rst @@ -1,4 +1,4 @@ -.. code_of_conduct +.. _code_of_conduct: ==================================== Contributor Covenant Code of Conduct diff --git a/doc/users/release_notes.rst b/doc/users/release_notes.rst index 12cb60d2fb0d..ca09d218cae4 100644 --- a/doc/users/release_notes.rst +++ b/doc/users/release_notes.rst @@ -1,6 +1,7 @@ .. redirect-from:: /api/api_changes_old .. redirect-from:: /users/whats_new_old +.. _release-notes: ============= Release notes From b09ebaa817fd42b955c856f4a2315b1bb8c2b936 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 1 Nov 2023 23:14:18 -0400 Subject: [PATCH 78/83] Backport PR #27219: Updated axes_box_aspect.py and angle_annotation.py to regularize formatting --- .../axes_box_aspect.py | 21 ++++++++++--------- .../angle_annotation.py | 6 +++--- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/galleries/examples/subplots_axes_and_figures/axes_box_aspect.py b/galleries/examples/subplots_axes_and_figures/axes_box_aspect.py index 9ad5a14b7649..26974dd49121 100644 --- a/galleries/examples/subplots_axes_and_figures/axes_box_aspect.py +++ b/galleries/examples/subplots_axes_and_figures/axes_box_aspect.py @@ -15,7 +15,7 @@ # %% # A square axes, independent of data -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# ---------------------------------- # # Produce a square axes, no matter what the data limits are. @@ -31,7 +31,7 @@ # %% # Shared square axes -# ~~~~~~~~~~~~~~~~~~ +# ------------------ # # Produce shared subplots that are squared in size. # @@ -47,7 +47,7 @@ # %% # Square twin axes -# ~~~~~~~~~~~~~~~~ +# ---------------- # # Produce a square axes, with a twin axes. The twinned axes takes over the # box aspect of the parent. @@ -67,7 +67,7 @@ # %% # Normal plot next to image -# ~~~~~~~~~~~~~~~~~~~~~~~~~ +# ------------------------- # # When creating an image plot with fixed data aspect and the default # ``adjustable="box"`` next to a normal plot, the axes would be unequal in @@ -90,7 +90,7 @@ # %% # Square joint/marginal plot -# ~~~~~~~~~~~~~~~~~~~~~~~~~~ +# -------------------------- # # It may be desirable to show marginal distributions next to a plot of joint # data. The following creates a square plot with the box aspect of the @@ -115,12 +115,13 @@ plt.show() # %% -# Square joint/marginal plot -# ~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Set data aspect with box aspect +# ------------------------------- # # When setting the box aspect, one may still set the data aspect as well. -# Here we create an Axes with a box twice as long as tall and use an "equal" -# data aspect for its contents, i.e. the circle actually stays circular. +# Here we create an Axes with a box twice as long as it is tall and use +# an "equal" data aspect for its contents, i.e. the circle actually +# stays circular. fig6, ax = plt.subplots() @@ -133,7 +134,7 @@ # %% # Box aspect for many subplots -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# ---------------------------- # # It is possible to pass the box aspect to an Axes at initialization. The # following creates a 2 by 3 subplot grid with all square Axes. diff --git a/galleries/examples/text_labels_and_annotations/angle_annotation.py b/galleries/examples/text_labels_and_annotations/angle_annotation.py index 419d094bb6a9..178f54863477 100644 --- a/galleries/examples/text_labels_and_annotations/angle_annotation.py +++ b/galleries/examples/text_labels_and_annotations/angle_annotation.py @@ -30,7 +30,7 @@ # %% # AngleAnnotation class -# ~~~~~~~~~~~~~~~~~~~~~ +# --------------------- # The essential idea here is to subclass `~.patches.Arc` and set its transform # to the `~.transforms.IdentityTransform`, making the parameters of the arc # defined in pixel space. @@ -215,7 +215,7 @@ def R(a, r, w, h): # .. _angle-annotation-usage: # # Usage -# ~~~~~ +# ----- # # Required arguments to ``AngleAnnotation`` are the center of the arc, *xy*, # and two points, such that the arc spans between the two vectors connecting @@ -254,7 +254,7 @@ def R(a, r, w, h): # %% # ``AngleLabel`` options -# ~~~~~~~~~~~~~~~~~~~~~~ +# ---------------------- # # The *textposition* and *unit* keyword arguments may be used to modify the # location of the text label, as shown below: From 9429b0f2ea634c3c3d3202d1264082672b40b23a Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Thu, 2 Nov 2023 05:24:49 -0400 Subject: [PATCH 79/83] Backport PR #26669: [DOC] debug backends --- doc/users/faq.rst | 8 ++ galleries/users_explain/figure/backends.rst | 106 ++++++++++++++++-- .../users_explain/figure/figure_intro.rst | 6 +- .../users_explain/figure/interactive.rst | 2 +- galleries/users_explain/quick_start.py | 4 +- lib/matplotlib/figure.py | 2 +- 6 files changed, 112 insertions(+), 16 deletions(-) diff --git a/doc/users/faq.rst b/doc/users/faq.rst index c4e133d56d73..970016ed19e6 100644 --- a/doc/users/faq.rst +++ b/doc/users/faq.rst @@ -8,6 +8,13 @@ Frequently Asked Questions ========================== +.. _how-do-no-figure: + +I don't see a figure window +--------------------------- + +Please see :ref:`figures-not-showing`. + .. _how-to-too-many-ticks: Why do I have so many ticks, and/or why are they out of order? @@ -301,6 +308,7 @@ you must in that case use a *non-interactive backend* (typically Agg), because most GUI backends *require* being run from the main thread as well. .. _reporting-problems: +.. _get-help: Get help -------- diff --git a/galleries/users_explain/figure/backends.rst b/galleries/users_explain/figure/backends.rst index b769fcc12ba2..41345d46d6ff 100644 --- a/galleries/users_explain/figure/backends.rst +++ b/galleries/users_explain/figure/backends.rst @@ -11,17 +11,17 @@ Backends What is a backend? ------------------ -A lot of documentation on the website and in the mailing lists refers -to the "backend" and many new users are confused by this term. -Matplotlib targets many different use cases and output formats. Some -people use Matplotlib interactively from the Python shell and have -plotting windows pop up when they type commands. Some people run -`Jupyter `_ notebooks and draw inline plots for -quick data analysis. Others embed Matplotlib into graphical user -interfaces like PyQt or PyGObject to build rich applications. Some -people use Matplotlib in batch scripts to generate postscript images -from numerical simulations, and still others run web application -servers to dynamically serve up graphs. +Backends are used for displaying Matplotlib figures (see :ref:`figure-intro`), +on the screen, or for writing to files. A lot of documentation on the website +and in the mailing lists refers to the "backend" and many new users are +confused by this term. Matplotlib targets many different use cases and output +formats. Some people use Matplotlib interactively from the Python shell and +have plotting windows pop up when they type commands. Some people run `Jupyter +`_ notebooks and draw inline plots for quick data +analysis. Others embed Matplotlib into graphical user interfaces like PyQt or +PyGObject to build rich applications. Some people use Matplotlib in batch +scripts to generate postscript images from numerical simulations, and still +others run web application servers to dynamically serve up graphs. To support all of these use cases, Matplotlib can target different outputs, and each of these capabilities is called a backend; the @@ -248,3 +248,87 @@ backend, use ``module://name.of.the.backend`` as the backend name, e.g. ``matplotlib.use('module://name.of.the.backend')``. Information for backend implementers is available at :ref:`writing_backend_interface`. + +.. _figures-not-showing: + +Debugging the figure windows not showing +---------------------------------------- + +Sometimes things do not work as expected, usually during an install. + +If you are using a Notebook or integrated development environment (see :ref:`notebooks-and-ides`), +please consult their documentation for debugging figures not working in their +environments. + +If you are using one of Matplotlib's graphics backends (see :ref:`standalone-scripts-and-interactive-use`), make sure you know which +one is being used: + +.. code-block:: python3 + + import matplotlib + + print(matplotlib.get_backend()) + +Try a simple plot to see if the GUI opens: + +.. code-block:: python3 + + import matplotlib + import matplotlib.pyplot as plt + + print(matplotlib.get_backend()) + plt.plot((1, 4, 6)) + plt.show() + +If it does not, you perhaps have an installation problem. A good step at this +point is to ensure that your GUI toolkit is installed properly, taking +Matplotlib out of the testing. Almost all GUI toolkits have a small test +program that can be run to test basic functionality. If this test fails, try re-installing. + +QtAgg, QtCairo, Qt5Agg, and Qt5Cairo +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Test ``PyQt5``. + +If you have ``PySide`` or ``PyQt6`` installed rather than ``PyQt5``, just change the import +accordingly: + +.. code-block:: bash + + python -c "from PyQt5.QtWidgets import *; app = QApplication([]); win = QMainWindow(); win.show(); app.exec()" + + +TkAgg and TkCairo +^^^^^^^^^^^^^^^^^ + +Test ``tkinter``: + +.. code-block:: bash + + python3 -c "from tkinter import Tk; Tk().mainloop()" + +GTK3Agg, GTK4Agg, GTK3Cairo, GTK4Cairo +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Test ``Gtk``: + +.. code-block:: bash + + python3 -c "from gi.repository import Gtk; win = Gtk.Window(); win.connect('destroy', Gtk.main_quit); win.show(); Gtk.main()" + +wxAgg and wxCairo +^^^^^^^^^^^^^^^^^ + +Test ``wx``: + +.. code-block:: python3 + + import wx + + app = wx.App(False) # Create a new app, don't redirect stdout/stderr to a window. + frame = wx.Frame(None, wx.ID_ANY, "Hello World") # A Frame is a top-level window. + frame.Show(True) # Show the frame. + app.MainLoop() + +If the test works for your desired backend but you still cannot get Matplotlib to display a figure, then contact us (see +:ref:`get-help`). diff --git a/galleries/users_explain/figure/figure_intro.rst b/galleries/users_explain/figure/figure_intro.rst index ac7286c119e8..978e2b87fe98 100644 --- a/galleries/users_explain/figure/figure_intro.rst +++ b/galleries/users_explain/figure/figure_intro.rst @@ -1,7 +1,7 @@ .. redirect-from:: /users/explain/figure -.. _figure_explanation: +.. _figure-intro: +++++++++++++++++++++++ Introduction to Figures @@ -36,6 +36,8 @@ We will discuss how to create Figures in more detail below, but first it is helpful to understand how to view a Figure. This varies based on how you are using Matplotlib, and what :ref:`Backend ` you are using. +.. _notebooks-and-ides: + Notebooks and IDEs ------------------ @@ -82,6 +84,8 @@ other than the default "inline" backend, you will likely need to use an ipython %matplotlib notebook +.. _standalone-scripts-and-interactive-use: + Standalone scripts and interactive use -------------------------------------- diff --git a/galleries/users_explain/figure/interactive.rst b/galleries/users_explain/figure/interactive.rst index 9a4c4956ed6d..6fd908fcac7a 100644 --- a/galleries/users_explain/figure/interactive.rst +++ b/galleries/users_explain/figure/interactive.rst @@ -15,7 +15,7 @@ mouse-location tools built into the Matplotlib GUI windows are often sufficient, you can also use the event system to build customized data exploration tools. .. seealso:: - :ref:`figure_explanation`. + :ref:`figure-intro`. Matplotlib ships with :ref:`backends ` binding to diff --git a/galleries/users_explain/quick_start.py b/galleries/users_explain/quick_start.py index c8b6a072d6f5..7cdd2b0b3208 100644 --- a/galleries/users_explain/quick_start.py +++ b/galleries/users_explain/quick_start.py @@ -38,7 +38,7 @@ # # Note that to get this Figure to display, you may have to call ``plt.show()``, # depending on your backend. For more details of Figures and backends, see -# :ref:`figure_explanation`. +# :ref:`figure-intro`. # # .. _figure_parts: # @@ -71,7 +71,7 @@ # :ref:`Matplotlib backends ` support zooming and # panning on figure windows. # -# For more on Figures, see :ref:`figure_explanation`. +# For more on Figures, see :ref:`figure-intro`. # # :class:`~matplotlib.axes.Axes` # ------------------------------ diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 9a75811fe13f..b2d75bcdd736 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -27,7 +27,7 @@ Some situations call for directly instantiating a `~.figure.Figure` class, usually inside an application of some sort (see :ref:`user_interfaces` for a list of examples) . More information about Figures can be found at -:ref:`figure_explanation`. +:ref:`figure-intro`. """ from contextlib import ExitStack From 44ae587e92e232c08b02560b01012b91ae917555 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Thu, 2 Nov 2023 12:42:18 -0400 Subject: [PATCH 80/83] Backport PR #27253: Copy-edit the standalone colorbar tutorial --- .../users_explain/colors/colorbar_only.py | 131 +++++++++--------- 1 file changed, 63 insertions(+), 68 deletions(-) diff --git a/galleries/users_explain/colors/colorbar_only.py b/galleries/users_explain/colors/colorbar_only.py index f9f126533a16..a47ced0a4ea6 100644 --- a/galleries/users_explain/colors/colorbar_only.py +++ b/galleries/users_explain/colors/colorbar_only.py @@ -1,39 +1,34 @@ """ .. redirect-from:: /tutorials/colors/colorbar_only -============================= -Customized Colorbars Tutorial -============================= +==================== +Standalone colorbars +==================== This tutorial shows how to build and customize standalone colorbars, i.e. without an attached plot. -Customized Colorbars -==================== - A `~.Figure.colorbar` needs a "mappable" (`matplotlib.cm.ScalarMappable`) object (typically, an image) which indicates the colormap and the norm to be used. In order to create a colorbar without an attached image, one can instead use a `.ScalarMappable` with no associated data. - -Basic continuous colorbar -------------------------- - -Here we create a basic continuous colorbar with ticks and labels. - -The arguments to the `~.Figure.colorbar` call are the `.ScalarMappable` -(constructed using the *norm* and *cmap* arguments), the axes where the -colorbar should be drawn, and the colorbar's orientation. - -For more information see the :mod:`~matplotlib.colorbar` API. """ import matplotlib.pyplot as plt - import matplotlib as mpl -fig, ax = plt.subplots(figsize=(6, 1)) -fig.subplots_adjust(bottom=0.5) +# %% +# Basic continuous colorbar +# ------------------------- +# Here, we create a basic continuous colorbar with ticks and labels. +# +# The arguments to the `~.Figure.colorbar` call are the `.ScalarMappable` +# (constructed using the *norm* and *cmap* arguments), the axes where the +# colorbar should be drawn, and the colorbar's orientation. +# +# For more information see the `~matplotlib.colorbar` API. + +fig, ax = plt.subplots(figsize=(6, 1), layout='constrained') cmap = mpl.cm.cool norm = mpl.colors.Normalize(vmin=5, vmax=10) @@ -41,16 +36,30 @@ fig.colorbar(mpl.cm.ScalarMappable(norm=norm, cmap=cmap), cax=ax, orientation='horizontal', label='Some Units') +# %% +# Colorbar attached next to a pre-existing axes +# --------------------------------------------- +# All examples in this tutorial (except this one) show a standalone colorbar on +# its own figure, but it is possible to display the colorbar *next* to a +# pre-existing Axes *ax* by passing ``ax=ax`` to the colorbar() call (meaning +# "draw the colorbar next to *ax*") rather than ``cax=ax`` (meaning "draw the +# colorbar on *ax*"). + +fig, ax = plt.subplots(layout='constrained') + +fig.colorbar(mpl.cm.ScalarMappable(norm=mpl.colors.Normalize(0, 1), cmap='magma'), + ax=ax, orientation='vertical', label='a colorbar label') # %% -# Extended colorbar with continuous colorscale -# -------------------------------------------- -# -# The second example shows how to make a discrete colorbar based on a -# continuous cmap. With the "extend" keyword argument the appropriate colors -# are chosen to fill the colorspace, including the extensions: -fig, ax = plt.subplots(figsize=(6, 1)) -fig.subplots_adjust(bottom=0.5) +# Discrete and extended colorbar with continuous colorscale +# --------------------------------------------------------- +# The following example shows how to make a discrete colorbar based on a +# continuous cmap. We use `matplotlib.colors.BoundaryNorm` to describe the +# interval boundaries (which must be in increasing order), and further pass the +# *extend* argument to it to further display "over" and "under" colors (which +# are used for data outside of the norm range). + +fig, ax = plt.subplots(figsize=(6, 1), layout='constrained') cmap = mpl.cm.viridis bounds = [-1, 2, 5, 7, 12, 15] @@ -61,72 +70,58 @@ label="Discrete intervals with extend='both' keyword") # %% -# Discrete intervals colorbar -# --------------------------- -# -# The third example illustrates the use of a -# :class:`~matplotlib.colors.ListedColormap` which generates a colormap from a -# set of listed colors, `.colors.BoundaryNorm` which generates a colormap -# index based on discrete intervals and extended ends to show the "over" and -# "under" value colors. Over and under are used to display data outside of the -# normalized [0, 1] range. Here we pass colors as gray shades as a string -# encoding a float in the 0-1 range. +# Colorbar with arbitrary colors +# ------------------------------ +# The following example still uses a `.BoundaryNorm` to describe discrete +# interval boundaries, but now uses a `matplotlib.colors.ListedColormap` to +# associate each interval with an arbitrary color (there must be as many +# intervals than there are colors). The "over" and "under" colors are set on +# the colormap using `.Colormap.with_extremes`. # -# If a :class:`~matplotlib.colors.ListedColormap` is used, the length of the -# bounds array must be one greater than the length of the color list. The -# bounds must be monotonically increasing. +# We also pass additional arguments to `~.Figure.colorbar`: # -# This time we pass additional arguments to -# `~.Figure.colorbar`. For the out-of-range values to display on the colorbar -# without using the *extend* keyword with -# `.colors.BoundaryNorm`, we have to use the *extend* keyword argument directly -# in the colorbar call. Here we also -# use the spacing argument to make -# the length of each colorbar segment proportional to its corresponding -# interval. - -fig, ax = plt.subplots(figsize=(6, 1)) -fig.subplots_adjust(bottom=0.5) +# - To display the out-of-range values on the colorbar, we use the *extend* +# argument in the colorbar() call. (This is equivalent to passing the +# *extend* argument in the `.BoundaryNorm` constructor as done in the +# previous example.) +# - To make the length of each colorbar segment proportional to its +# corresponding interval, we use the *spacing* argument in the colorbar() +# call. -cmap = (mpl.colors.ListedColormap(['red', 'green', 'blue', 'cyan']) - .with_extremes(over='0.25', under='0.75')) +fig, ax = plt.subplots(figsize=(6, 1), layout='constrained') +cmap = (mpl.colors.ListedColormap(['red', 'green', 'blue', 'cyan']) + .with_extremes(under='yellow', over='magenta')) bounds = [1, 2, 4, 7, 8] norm = mpl.colors.BoundaryNorm(bounds, cmap.N) + fig.colorbar( mpl.cm.ScalarMappable(cmap=cmap, norm=norm), - cax=ax, + cax=ax, orientation='horizontal', extend='both', - ticks=bounds, spacing='proportional', - orientation='horizontal', label='Discrete intervals, some other units', ) # %% # Colorbar with custom extension lengths # -------------------------------------- -# -# Here we illustrate the use of custom length colorbar extensions, on a -# colorbar with discrete intervals. To make the length of each extension the +# We can customize the length colorbar extensions, on a colorbar with discrete +# intervals. To make the length of each extension the # same as the length of the interior colors, use ``extendfrac='auto'``. -fig, ax = plt.subplots(figsize=(6, 1)) -fig.subplots_adjust(bottom=0.5) +fig, ax = plt.subplots(figsize=(6, 1), layout='constrained') cmap = (mpl.colors.ListedColormap(['royalblue', 'cyan', 'yellow', 'orange']) .with_extremes(over='red', under='blue')) - bounds = [-1.0, -0.5, 0.0, 0.5, 1.0] norm = mpl.colors.BoundaryNorm(bounds, cmap.N) + fig.colorbar( mpl.cm.ScalarMappable(cmap=cmap, norm=norm), - cax=ax, - extend='both', - extendfrac='auto', - ticks=bounds, + cax=ax, orientation='horizontal', + extend='both', extendfrac='auto', spacing='uniform', - orientation='horizontal', label='Custom extension lengths, some other units', ) From da5a48fc1fb94349968dfd343c2bf0d6a81dbd73 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Thu, 2 Nov 2023 14:14:14 -0500 Subject: [PATCH 81/83] Fix merge of environment.yml --- environment.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/environment.yml b/environment.yml index 32c2e243fd9f..1487578a443b 100644 --- a/environment.yml +++ b/environment.yml @@ -16,6 +16,10 @@ dependencies: - importlib-resources>=3.2.0 - kiwisolver>=1.3.1 - pybind11>=2.6.0 + - meson-python>=0.13.1 + - numpy>=1.21 + - pillow>=8 + - pkg-config - pygobject - pyparsing>=2.3.1 - pyqt From c3a10cb617373a3c861d5b8a4054eea20576b99d Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Thu, 2 Nov 2023 14:16:01 -0500 Subject: [PATCH 82/83] Remove duplicated text from development setup (from manual backport) --- doc/devel/development_setup.rst | 5 ----- 1 file changed, 5 deletions(-) diff --git a/doc/devel/development_setup.rst b/doc/devel/development_setup.rst index f619b179ead5..9be22161a89a 100644 --- a/doc/devel/development_setup.rst +++ b/doc/devel/development_setup.rst @@ -194,11 +194,6 @@ config during installation :: For more information on installation and other configuration options, see the Meson Python :external+meson-python:ref:`editable installs guide `. - -If the installation is not working, please consult the :ref:`troubleshooting guide `. -If the guide does not offer a solution, please reach out via `chat `_ -or :ref:`open an issue `. - Verify the Installation ======================= From f4d807de4dda558c93631b4a2b18f5e1264e343c Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Thu, 2 Nov 2023 18:53:18 -0500 Subject: [PATCH 83/83] Remove unecessary environment variable from cibuildwheel config --- .github/workflows/cibuildwheel.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/cibuildwheel.yml b/.github/workflows/cibuildwheel.yml index 749014ac40c1..af733ff04502 100644 --- a/.github/workflows/cibuildwheel.yml +++ b/.github/workflows/cibuildwheel.yml @@ -64,9 +64,6 @@ jobs: run: | python -m build --sdist python ci/export_sdist_name.py - env: - # Prevent including development runtime dependencies in metadata. - CIBUILDWHEEL: 1 - name: Check README rendering for PyPI run: twine check dist/*