From 6e86ff882a3f736518079cef1732bb0300245536 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Thu, 19 Mar 2020 18:16:49 +0100 Subject: [PATCH 01/26] Backport PR #16835: Don't forget to export isdeleted on Qt4. --- lib/matplotlib/backends/qt_compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/backends/qt_compat.py b/lib/matplotlib/backends/qt_compat.py index b3367ea91010..2a4a3aa53629 100644 --- a/lib/matplotlib/backends/qt_compat.py +++ b/lib/matplotlib/backends/qt_compat.py @@ -92,7 +92,7 @@ def _setup_pyqt4(): def _setup_pyqt4_internal(api): global QtCore, QtGui, QtWidgets, \ - __version__, is_pyqt5, _getSaveFileName + __version__, is_pyqt5, _isdeleted, _getSaveFileName # List of incompatible APIs: # http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html _sip_apis = ["QDate", "QDateTime", "QString", "QTextStream", "QTime", From d9c3dabe004c97977bda9adbad8632ce811ee4f7 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Fri, 20 Mar 2020 09:43:08 +0100 Subject: [PATCH 02/26] Backport PR #16851: DOC: Fix docstring of Axes.secondary_yaxis. --- lib/matplotlib/axes/_axes.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 955302d67edd..f1c5e2c97c3e 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -654,6 +654,7 @@ def invert(x): raise ValueError('secondary_xaxis location must be either ' 'a float or "top"/"bottom"') + @docstring.dedent_interpd def secondary_yaxis(self, location, *, functions=None, **kwargs): """ Add a second y-axis to this axes. From 3e6cec96a904f736552861a866dee677cc04bab1 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sat, 21 Mar 2020 21:19:10 -0400 Subject: [PATCH 03/26] Backport PR #16867: BLD: Auto-trigger macOS/Linux wheels on tags. --- .github/workflows/wheels.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/wheels.yml diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml new file mode 100644 index 000000000000..c8c280e92029 --- /dev/null +++ b/.github/workflows/wheels.yml @@ -0,0 +1,34 @@ +on: + push: + tags: + - 'v[0-9]+.[0-9]+.[0-9]+*' +jobs: + trigger_wheel_builds: + runs-on: ubuntu-latest + name: Trigger macOS and manylinux wheel builds + if: github.repository == 'matplotlib/matplotlib' + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + repository: MacPython/matplotlib-wheels + ssh-key: ${{ secrets.WHEEL_DEPLOY_KEY }} + fetch-depth: 0 + - name: Prepare build commit + id: commit + shell: bash + run: | + TAG="${GITHUB_REF#refs/tags/}" + BRANCH="$(echo ${TAG} | sed 's/^v\([0-9]\+\.[0-9]\+\)\.[0-9]\+.*$/build-\1.x/')" + echo "${BRANCH}" + echo "##[set-output name=branch;]${BRANCH}" + git branch ${BRANCH} master || true + git checkout ${BRANCH} + sed -i -e "s/\(- BUILD_COMMIT=\).\+/\1${TAG}/g" .travis.yml + git add .travis.yml + git config --global user.name 'Matplotlib Actions Bot' + git config --global user.email 'matplotlib@users.noreply.github.com' + git commit -m "REL: $TAG" + - name: Push to matplotlib-wheels + run: | + git push origin ${{ steps.commit.outputs.branch }} From 89abdaa6c7695379373d2ae910d61d3771d5f9cd Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Mon, 23 Mar 2020 10:25:47 -0400 Subject: [PATCH 04/26] Backport PR #16870: Unbreak CI by xfailing wxAgg test on macOS Merge pull request #16870 from timhoffm/xfail CI: Unbreak CI by xfailing wxAgg test on macOS Conflicts: lib/matplotlib/tests/test_backends_interactive.py - Other improvements to messages when skipping tests from bc155f09cf99334ffebe74c9dd7ce5f8c105a930 near by. Did not implicitly backport other changes. --- lib/matplotlib/tests/test_backends_interactive.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/matplotlib/tests/test_backends_interactive.py b/lib/matplotlib/tests/test_backends_interactive.py index ad23abe3fc19..bc3796a41747 100644 --- a/lib/matplotlib/tests/test_backends_interactive.py +++ b/lib/matplotlib/tests/test_backends_interactive.py @@ -35,6 +35,11 @@ def _get_testable_interactive_backends(): if reason: backend = pytest.param( backend, marks=pytest.mark.skip(reason=reason)) + elif backend == 'wxagg' and sys.platform == 'darwin': + # ignore on OSX because that's currently broken (github #16849) + backend = pytest.param( + backend, + marks=pytest.mark.xfail(reason='github #16849')) backends.append(backend) return backends From 89bcf96ab83aa6bd3095abdb6b175bdbdbf3ae3a Mon Sep 17 00:00:00 2001 From: David Stansby Date: Fri, 27 Mar 2020 11:10:12 +0000 Subject: [PATCH 05/26] Backport PR #16929: tk: Resize the canvas, not the figure. --- lib/matplotlib/backends/_backend_tk.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/backends/_backend_tk.py b/lib/matplotlib/backends/_backend_tk.py index b334fb71a763..80bfa80bc537 100644 --- a/lib/matplotlib/backends/_backend_tk.py +++ b/lib/matplotlib/backends/_backend_tk.py @@ -460,7 +460,7 @@ def _get_toolmanager(self): return toolmanager def resize(self, width, height): - self.canvas._tkcanvas.master.geometry("%dx%d" % (width, height)) + self.canvas._tkcanvas.configure(width=width, height=height) if self.toolbar is not None: self.toolbar.configure(width=width) From ffa1669c5847cba6ab14383083af00a9d830c40d Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sun, 29 Mar 2020 04:19:02 +0200 Subject: [PATCH 06/26] Backport PR #16949: TST: Don't modify actual pyplot file for boilerplate test. --- lib/matplotlib/tests/test_pyplot.py | 43 +++++++++++++++-------------- tools/boilerplate.py | 11 +++++--- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/lib/matplotlib/tests/test_pyplot.py b/lib/matplotlib/tests/test_pyplot.py index e4860aa2117f..51470d2bf1b5 100644 --- a/lib/matplotlib/tests/test_pyplot.py +++ b/lib/matplotlib/tests/test_pyplot.py @@ -9,31 +9,32 @@ from matplotlib import pyplot as plt -def test_pyplot_up_to_date(): +def test_pyplot_up_to_date(tmpdir): gen_script = Path(mpl.__file__).parents[2] / "tools/boilerplate.py" if not gen_script.exists(): pytest.skip("boilerplate.py not found") orig_contents = Path(plt.__file__).read_text() - try: - subprocess.run([sys.executable, str(gen_script)], check=True) - new_contents = Path(plt.__file__).read_text() - - if orig_contents != new_contents: - diff_msg = '\n'.join( - difflib.unified_diff( - orig_contents.split('\n'), new_contents.split('\n'), - fromfile='found pyplot.py', - tofile='expected pyplot.py', - n=0, lineterm='')) - pytest.fail( - "pyplot.py is not up-to-date. Please run " - "'python tools/boilerplate.py' to update pyplot.py. " - "This needs to be done from an environment where your " - "current working copy is installed (e.g. 'pip install -e'd). " - "Here is a diff of unexpected differences:\n%s" % diff_msg - ) - finally: - Path(plt.__file__).write_text(orig_contents) + plt_file = tmpdir.join('pyplot.py') + plt_file.write_text(orig_contents, 'utf-8') + + subprocess.run([sys.executable, str(gen_script), str(plt_file)], + check=True) + new_contents = plt_file.read_text('utf-8') + + if orig_contents != new_contents: + diff_msg = '\n'.join( + difflib.unified_diff( + orig_contents.split('\n'), new_contents.split('\n'), + fromfile='found pyplot.py', + tofile='expected pyplot.py', + n=0, lineterm='')) + pytest.fail( + "pyplot.py is not up-to-date. Please run " + "'python tools/boilerplate.py' to update pyplot.py. " + "This needs to be done from an environment where your " + "current working copy is installed (e.g. 'pip install -e'd). " + "Here is a diff of unexpected differences:\n%s" % diff_msg + ) def test_pyplot_box(): diff --git a/tools/boilerplate.py b/tools/boilerplate.py index caec5247410e..faf6927da742 100644 --- a/tools/boilerplate.py +++ b/tools/boilerplate.py @@ -16,6 +16,7 @@ import inspect from inspect import Parameter from pathlib import Path +import sys import textwrap # This line imports the installed copy of matplotlib, and not the local copy. @@ -327,9 +328,7 @@ def boilerplate_gen(): yield '_setup_pyplot_info_docstrings()' -def build_pyplot(): - pyplot_path = Path(__file__).parent / "../lib/matplotlib/pyplot.py" - +def build_pyplot(pyplot_path): pyplot_orig = pyplot_path.read_text().splitlines(keepends=True) try: pyplot_orig = pyplot_orig[:pyplot_orig.index(PYPLOT_MAGIC_HEADER) + 1] @@ -345,4 +344,8 @@ def build_pyplot(): if __name__ == '__main__': # Write the matplotlib.pyplot file. - build_pyplot() + if len(sys.argv) > 1: + pyplot_path = Path(sys.argv[1]) + else: + pyplot_path = Path(__file__).parent / "../lib/matplotlib/pyplot.py" + build_pyplot(pyplot_path) From a14050a9892b8c7284911d7c35a7a745a437c8b9 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Mon, 30 Mar 2020 18:20:11 -0400 Subject: [PATCH 07/26] Backport PR #16966: Fix animation writer fallback. --- lib/matplotlib/animation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/animation.py b/lib/matplotlib/animation.py index 2cd5f438037e..418231c11a2f 100644 --- a/lib/matplotlib/animation.py +++ b/lib/matplotlib/animation.py @@ -1099,7 +1099,7 @@ def func(current_frame: int, total_frames: int) -> Any extra_args=extra_args, metadata=metadata) else: - alt_writer = next(writers, None) + alt_writer = next(iter(writers), None) if alt_writer is None: raise ValueError("Cannot save animation: no writers are " "available. Please install ffmpeg to " From 2ce7057e674217ce6511d1bc68ce9ab395433cb3 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 31 Mar 2020 02:52:37 -0400 Subject: [PATCH 08/26] Backport PR #16940: DOC/FIX: clarify the docs for check_figures_equal --- lib/matplotlib/testing/decorators.py | 12 +++++++++--- lib/matplotlib/tests/test_testing.py | 7 +++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 7d0941233f80..cd447976ba9b 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -358,9 +358,9 @@ def check_figures_equal(*, extensions=("png", "pdf", "svg"), tol=0): """ Decorator for test cases that generate and compare two figures. - The decorated function must take two arguments, *fig_test* and *fig_ref*, - and draw the test and reference images on them. After the function - returns, the figures are saved and compared. + The decorated function must take two keyword arguments, *fig_test* + and *fig_ref*, and draw the test and reference images on them. + After the function returns, the figures are saved and compared. This decorator should be preferred over `image_comparison` when possible in order to keep the size of the test suite from ballooning. @@ -381,6 +381,7 @@ def check_figures_equal(*, extensions=("png", "pdf", "svg"), tol=0): def test_plot(fig_test, fig_ref): fig_test.subplots().plot([1, 3, 5]) fig_ref.subplots().plot([0, 1, 2], [1, 3, 5]) + """ ALLOWED_CHARS = set(string.digits + string.ascii_letters + '_-[]()') KEYWORD_ONLY = inspect.Parameter.KEYWORD_ONLY @@ -390,6 +391,11 @@ def decorator(func): _, result_dir = _image_directories(func) old_sig = inspect.signature(func) + if not {"fig_test", "fig_ref"}.issubset(old_sig.parameters): + raise ValueError("The decorated function must have at least the " + "parameters 'fig_ref' and 'fig_test', but your " + f"function has the signature {old_sig}") + @pytest.mark.parametrize("ext", extensions) def wrapper(*args, **kwargs): ext = kwargs['ext'] diff --git a/lib/matplotlib/tests/test_testing.py b/lib/matplotlib/tests/test_testing.py index d1273ec1ba46..f779d74c1007 100644 --- a/lib/matplotlib/tests/test_testing.py +++ b/lib/matplotlib/tests/test_testing.py @@ -15,3 +15,10 @@ def test_warn_to_fail(): @pytest.mark.parametrize("b", [1]) def test_parametrize_with_check_figure_equal(a, fig_ref, b, fig_test): assert a == b + + +def test_wrap_failure(): + with pytest.raises(ValueError, match="^The decorated function"): + @check_figures_equal() + def should_fail(test, ref): + pass From ec9ac44dc5728c68d01079ec701b04970a7c28e1 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Tue, 31 Mar 2020 15:24:43 +0200 Subject: [PATCH 09/26] Backport PR #16970: tk: Don't resize toolbar during resize event. --- lib/matplotlib/backends/_backend_tk.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/matplotlib/backends/_backend_tk.py b/lib/matplotlib/backends/_backend_tk.py index 80bfa80bc537..c14ee7262933 100644 --- a/lib/matplotlib/backends/_backend_tk.py +++ b/lib/matplotlib/backends/_backend_tk.py @@ -462,9 +462,6 @@ def _get_toolmanager(self): def resize(self, width, height): self.canvas._tkcanvas.configure(width=width, height=height) - if self.toolbar is not None: - self.toolbar.configure(width=width) - def show(self): with _restore_foreground_window_at_end(): if not self._shown: From c3416528041e41aa8f4bf60b20d9e486ffbdbe55 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 31 Mar 2020 16:17:57 -0400 Subject: [PATCH 10/26] Backport PR #16980: Correctly disable more drawing methods in tight_bboxing renderer. --- lib/matplotlib/backend_bases.py | 5 +++-- lib/matplotlib/tests/test_backend_svg.py | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 09dc3d6e8c42..85cf80005981 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -1521,7 +1521,7 @@ def _get_renderer(figure, print_method, *, draw_disabled=False): Get the renderer that would be used to save a `~.Figure`, and cache it on the figure. - If *draw_disabled* is True, additionally replace draw_foo methods on + If *draw_disabled* is True, additionally replace drawing methods on *renderer* by no-ops. This is used by the tight-bbox-saving renderer, which needs to walk through the artist tree to compute the tight-bbox, but for which the output file may be closed early. @@ -1542,7 +1542,8 @@ def _draw(renderer): raise Done(renderer) if draw_disabled: for meth_name in dir(RendererBase): - if meth_name.startswith("draw_"): + if (meth_name.startswith("draw_") + or meth_name in ["open_group", "close_group"]): setattr(renderer, meth_name, lambda *args, **kwargs: None) return renderer diff --git a/lib/matplotlib/tests/test_backend_svg.py b/lib/matplotlib/tests/test_backend_svg.py index 5c27149b725d..8158a739ad80 100644 --- a/lib/matplotlib/tests/test_backend_svg.py +++ b/lib/matplotlib/tests/test_backend_svg.py @@ -205,3 +205,9 @@ def include(gid, obj): for gid, obj in gdic.items(): if include(gid, obj): assert gid in buf + + +def test_savefig_tight(): + # Check that the draw-disabled renderer correctly disables open/close_group + # as well. + plt.savefig(BytesIO(), format="svgz", bbox_inches="tight") From cfff1bc2479be8c795ecbae50bb99247447d0658 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Fri, 3 Apr 2020 14:17:01 -0700 Subject: [PATCH 11/26] Merge pull request #17017 from jklymak/fix-blended-transform FIX: force blended transforms with data to be in data space --- lib/matplotlib/collections.py | 2 +- lib/matplotlib/tests/test_collections.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 708cdeb22abb..ba1f7c0ffbae 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -221,7 +221,7 @@ def get_datalim(self, transData): # get_path_collection_extents handles nan but not masked arrays if len(paths) and len(offsets): - if transform.contains_branch(transData): + if any(transform.contains_branch_seperately(transData)): # collections that are just in data units (like quiver) # can properly have the axes limits set by their shape + # offset. LineCollections that have no offsets can diff --git a/lib/matplotlib/tests/test_collections.py b/lib/matplotlib/tests/test_collections.py index 0983283ec078..fdd581166a02 100644 --- a/lib/matplotlib/tests/test_collections.py +++ b/lib/matplotlib/tests/test_collections.py @@ -718,3 +718,17 @@ def test_EventCollection_nosort(): arr = np.array([3, 2, 1, 10]) coll = EventCollection(arr) np.testing.assert_array_equal(arr, np.array([3, 2, 1, 10])) + + +def test_blended_collection_autolim(): + a = [1, 2, 4] + height = .2 + + xy_pairs = np.column_stack([np.repeat(a, 2), np.tile([0, height], len(a))]) + line_segs = xy_pairs.reshape([len(a), 2, 2]) + + f, ax = plt.subplots() + trans = mtransforms.blended_transform_factory(ax.transData, ax.transAxes) + ax.add_collection(LineCollection(line_segs, transform=trans)) + ax.autoscale_view(scalex=True, scaley=False) + np.testing.assert_allclose(ax.get_xlim(), [1., 4.]) From 6a2be5f10a6bfaf822c208b5442648ae8aaf788e Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Mon, 6 Apr 2020 16:56:28 +0200 Subject: [PATCH 12/26] Backport PR #17045: Fix missing-references.json. Merge pull request #17045 from anntzer/docrefs Fix missing-references.json. Conflicts: doc/missing-references.json - fixed by fully regenerating --- doc/conf.py | 4 +- doc/missing-references.json | 490 ++++++++++++++---------------------- 2 files changed, 191 insertions(+), 303 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 6cebe749aa16..6cd891adc551 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -103,7 +103,9 @@ def _check_dependencies(): else: autodoc_default_options = {'members': None, 'undoc-members': None} -nitpicky = True +# missing-references names matches sphinx>=3 behavior, so we can't be nitpicky +# for older sphinxes. +nitpicky = sphinx.version_info >= (3,) # change this to True to update the allowed failures missing_references_write_json = False missing_references_warn_unused_ignores = False diff --git a/doc/missing-references.json b/doc/missing-references.json index 64a887324438..bc19b09eb34a 100644 --- a/doc/missing-references.json +++ b/doc/missing-references.json @@ -414,12 +414,12 @@ "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.hexbin:124" ], "np.histogram": [ - "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes.Axes.hist:80", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.hist:80" + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes.Axes.hist:78", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.hist:78" ], "Normalize": [ - "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes.Axes.imshow:27", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.imshow:27" + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes.Axes.imshow:32", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.imshow:32" ], "ax.transAxes": [ "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes.Axes.indicate_inset:19", @@ -499,7 +499,8 @@ "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes.Axes.plot_date:21", "lib/matplotlib/axes/_base.py:docstring of matplotlib.axes.Axes.xaxis_date:21", "lib/matplotlib/axes/_base.py:docstring of matplotlib.axes.Axes.yaxis_date:21", - "lib/matplotlib/dates.py:docstring of matplotlib.dates.DateFormatter:44", + "lib/matplotlib/dates.py:docstring of matplotlib.dates.AutoDateLocator:55", + "lib/matplotlib/dates.py:docstring of matplotlib.dates.DateFormatter:45", "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.plot_date:21" ], "P_{xx}": [ @@ -508,7 +509,8 @@ "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.psd:87" ], "functions=(lambda x: 2 / x, lambda x: 2 / x)": [ - "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes.Axes.secondary_xaxis:17" + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes.Axes.secondary_xaxis:17", + "lib/matplotlib/axes/_axes.py:docstring of matplotlib.axes.Axes.secondary_yaxis:17" ], "tricontour(...)": [ "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.tricontour:57", @@ -552,7 +554,7 @@ "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.violinplot:46" ], "Text": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:1089", + "doc/api/prev_api_changes/api_changes_3.1.0.rst:1081", "doc/devel/MEP/MEP14.rst:252", "doc/devel/MEP/MEP26.rst:141", "lib/matplotlib/axis.py:docstring of matplotlib.axis.Axis.set_ticklabels:33", @@ -596,7 +598,7 @@ "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.colorbar:16" ], "ScalarMappable": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:298", + "doc/api/prev_api_changes/api_changes_3.1.0.rst:290", "lib/matplotlib/figure.py:docstring of matplotlib.figure.Figure.colorbar:26", "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.colorbar:22" ], @@ -650,12 +652,10 @@ "every=5": [ "lib/matplotlib/lines.py:docstring of matplotlib.lines.Line2D.set_markevery:4" ], - "BoxTransmuterBase": [ - "lib/matplotlib/patches.py:docstring of matplotlib.patches.FancyBboxPatch:5" - ], "Axes": [ "doc/api/_as_gen/matplotlib.pyplot.rst:173::1", "doc/api/prev_api_changes/api_changes_3.0.0.rst:449", + "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:135", "doc/users/prev_whats_new/whats_new_1.5.rst:514", "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.delaxes:2", "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.plotting:33" @@ -854,7 +854,7 @@ "MovieWriterRegistry": [ "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:49", "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:51", - "doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst:118" + "doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst:122" ], "Axes.add_line": [ "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:65" @@ -875,40 +875,40 @@ "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:96" ], "Axes.streamplot": [ - "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:139" + "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:174" ], "matplotlib.color.is_colorlike()": [ - "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:169" + "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:204" ], "imshow(A, interpolation='antialiased')": [ - "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:180" + "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:215" ], "RendererSVG": [ - "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:198" + "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:233" ], "figure": [ - "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:211" + "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:246" ], "backend_bases.GraphicsContextBase.set_clip_path": [ - "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:254" + "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:293" ], "blocking_input.BlockingInput.__call__": [ - "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:254" + "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:293" ], "cm.register_cmap": [ - "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:254" + "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:293" ], "dviread.DviFont": [ - "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:254" + "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:293" ], "rcsetup.validate_hatch": [ - "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:254" + "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:293" ], "rcsetup.validate_animation_writer_path": [ - "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:254" + "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:293" ], "spines.Spine": [ - "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:254" + "doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst:293" ], "Locator": [ "doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst:20", @@ -925,13 +925,13 @@ "doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst:20" ], "GridFinder": [ - "doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst:88" + "doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst:92" ], "Locator.autoscale()": [ - "doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst:113" + "doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst:117" ], "Locator.view_limits()": [ - "doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst:113" + "doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst:117" ], "GraphicsContextBase": [ "lib/matplotlib/backends/backend_agg.py:docstring of matplotlib.backends.backend_agg.RendererAgg.draw_text:8", @@ -959,6 +959,11 @@ "lib/matplotlib/backends/backend_template.py:docstring of matplotlib.backends.backend_template.RendererTemplate.new_gc:2", "lib/matplotlib/patheffects.py:docstring of matplotlib.patheffects.PathEffectRenderer.draw_markers:16" ], + "Timer": [ + "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", + "lib/matplotlib/backends/backend_nbagg.py:docstring of matplotlib.backends.backend_nbagg.FigureCanvasNbAgg.new_timer:2" + ], "ginput": [ "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.FigureCanvasBase.start_event_loop:4", "lib/matplotlib/blocking_input.py:docstring of matplotlib.blocking_input:13" @@ -978,25 +983,6 @@ "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.RendererBase.start_rasterizing:4", "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.RendererBase.stop_rasterizing:5" ], - "_timer_start": [ - "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.TimerBase:9" - ], - "_timer_stop": [ - "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.TimerBase:12" - ], - "_timer_set_single_shot": [ - "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.TimerBase:17" - ], - "Timer": [ - "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.TimerBase:17" - ], - "_on_timer": [ - "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.TimerBase:17", - "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.TimerBase:27" - ], - "_timer_set_interval": [ - "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.TimerBase:23" - ], "*args, **kwargs": [ "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.TimerBase.remove_callback:4" ], @@ -1043,50 +1029,50 @@ ], "{'Creator': 'My software', 'Author': 'Me',\n'Title': 'Awesome fig'}": [ "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfFile:31", - "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:52", + "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:51", "lib/matplotlib/backends/backend_pgf.py:docstring of matplotlib.backends.backend_pgf.PdfPages:46" ], "'Title'": [ "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfFile:36", - "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:57", + "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:56", "lib/matplotlib/backends/backend_pgf.py:docstring of matplotlib.backends.backend_pgf.PdfPages:51" ], "'Author'": [ "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfFile:36", - "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:57", + "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:56", "lib/matplotlib/backends/backend_pgf.py:docstring of matplotlib.backends.backend_pgf.PdfPages:51" ], "'Subject'": [ "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfFile:36", - "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:57", + "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:56", "lib/matplotlib/backends/backend_pgf.py:docstring of matplotlib.backends.backend_pgf.PdfPages:51" ], "'Keywords'": [ "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfFile:36", - "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:57", + "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:56", "lib/matplotlib/backends/backend_pgf.py:docstring of matplotlib.backends.backend_pgf.PdfPages:51" ], "'Creator'": [ "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfFile:36", - "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:57", + "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:56", "lib/matplotlib/backends/backend_pgf.py:docstring of matplotlib.backends.backend_pgf.PdfPages:51" ], "'Producer'": [ "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfFile:36", - "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:57", + "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:56", "lib/matplotlib/backends/backend_pgf.py:docstring of matplotlib.backends.backend_pgf.PdfPages:51" ], "'CreationDate'": [ "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfFile:36", - "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:57" + "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:56" ], "'ModDate'": [ "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfFile:36", - "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:57" + "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:56" ], "'Trapped'": [ "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfFile:36", - "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:57", + "lib/matplotlib/backends/backend_pdf.py:docstring of matplotlib.backends.backend_pdf.PdfPages:56", "lib/matplotlib/backends/backend_pgf.py:docstring of matplotlib.backends.backend_pgf.PdfPages:51" ], "draw_path": [ @@ -1191,12 +1177,6 @@ "rrulewrapper": [ "lib/matplotlib/dates.py:docstring of matplotlib.dates:105" ], - "strftime": [ - "lib/matplotlib/dates.py:docstring of matplotlib.dates.ConciseDateFormatter:18", - "lib/matplotlib/dates.py:docstring of matplotlib.dates.DateFormatter:2", - "lib/matplotlib/dates.py:docstring of matplotlib.dates.DateFormatter:28", - "lib/matplotlib/dates.py:docstring of matplotlib.dates:129" - ], "numpy.datetime64": [ "doc/api/prev_api_changes/api_changes_2.1.0.rst:95", "doc/faq/howto_faq.rst:18", @@ -1207,6 +1187,9 @@ "doc/users/prev_whats_new/whats_new_2.2.rst:155", "lib/matplotlib/dates.py:docstring of matplotlib.dates.date2num:8" ], + "strftime": [ + "lib/matplotlib/dates.py:docstring of matplotlib.dates.ConciseDateFormatter:18" + ], "_read": [ "lib/matplotlib/dviread.py:docstring of matplotlib.dviread.Vf:25" ], @@ -1352,7 +1335,7 @@ ], "LogLocator": [ "doc/api/prev_api_changes/api_changes_3.0.0.rst:207", - "doc/api/prev_api_changes/api_changes_3.1.0.rst:59", + "doc/api/prev_api_changes/api_changes_3.1.0.rst:51", "doc/api/prev_api_changes/api_changes_3.1.1.rst:14" ], "Axes.axes.streamplot": [ @@ -1432,235 +1415,235 @@ "doc/api/prev_api_changes/api_changes_3.0.1.rst:21" ], "PathCollection.get_offsets": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:30" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:22" ], "PathCollection": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:30" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:22" ], "PathCollection.get_array": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:30" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:22" ], "AutoLocator": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:59" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:51" ], "Axis.remove_overlaping_locs": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:79" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:71" ], "TextPath": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:127" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:119" ], "backend_bases.Timer.remove_callback": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:247" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:239" ], "backend_bases.Timer.remove_callback(func, *args,\n**kwargs)": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:250" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:242" ], "backend_bases.Timer.add_callback(func, *args, **kwargs)": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:250" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:242" ], "backend_bases.Timer.add_callback": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:267" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:259" ], "collections.StemContainer": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:273", - "doc/api/prev_api_changes/api_changes_3.1.0.rst:276" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:265", + "doc/api/prev_api_changes/api_changes_3.1.0.rst:268" ], "Axes.stem": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:276" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:268" ], "collections.LineCollection.get_segements()": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:288" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:280" ], "matplotlib.colorbar.ColorbarBase.set_norm": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:298" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:290" ], "matplotlib.colorbar.ColorbarBase.set_cmap": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:298" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:290" ], "matplotlib.colorbar.ColorbarBase.set_clim": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:298" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:290" ], "Installing": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:319" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:311" ], "Axes.spy(..., origin='lower')": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:367" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:359" ], "str()": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:386" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:378" ], "Axes.fmt_xdata": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:405", - "doc/api/prev_api_changes/api_changes_3.1.0.rst:408" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:397", + "doc/api/prev_api_changes/api_changes_3.1.0.rst:400" ], "Axes.fmt_ydata": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:405", - "doc/api/prev_api_changes/api_changes_3.1.0.rst:408" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:397", + "doc/api/prev_api_changes/api_changes_3.1.0.rst:400" ], "Tick": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:414", + "doc/api/prev_api_changes/api_changes_3.1.0.rst:406", "doc/users/prev_whats_new/whats_new_2.1.0.rst:409", "doc/users/prev_whats_new/whats_new_2.2.rst:244" ], "streamplot.Grid": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:487" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:479" ], "legend.Legend.set_draggable()": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:507" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:499" ], "scipy.stats.norm.pdf": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:573", - "doc/api/prev_api_changes/api_changes_3.1.0.rst:659" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:565", + "doc/api/prev_api_changes/api_changes_3.1.0.rst:651" ], "matplotlib.pylab": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:626" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:618" ], "ImageComparisonTest": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:710" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:702" ], "mathcircled": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:737" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:729" ], "cbook.deprecated": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:1081", - "doc/api/prev_api_changes/api_changes_3.1.0.rst:774" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:1073", + "doc/api/prev_api_changes/api_changes_3.1.0.rst:766" ], "cbook.warn_deprecated": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:774" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:766" ], "matplotlib.testing.compare.calculate_rms": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:779" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:771" ], "Axes.hist2d": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:798" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:790" ], "Annotation": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:799" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:791" ], "Axes.annotation": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:799" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:791" ], "bezier.find_bezier_t_intersecting_with_closedpath": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:801" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:793" ], "bezier.split_bezier_intersecting_with_closedpath": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:801" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:793" ], "bezier.find_r_to_boundary_of_closedpath": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:1026", - "doc/api/prev_api_changes/api_changes_3.1.0.rst:801" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:1018", + "doc/api/prev_api_changes/api_changes_3.1.0.rst:793" ], "bezier.split_path_inout": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:801" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:793" ], "bezier.check_if_parallel": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:801" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:793" ], "spine.Spine.is_frame_like": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:823" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:815" ], "axis.Axis.get_ticks_position": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:829" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:821" ], "mpl_toolkits.Axes.AxisDict": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:835" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:827" ], "checkdep_dvipng": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:840" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:832" ], "checkdep_ghostscript": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:841" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:833" ], "checkdep_pdftops": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:842" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:834" ], "checkdep_inkscape": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:843" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:835" ], "ticker.decade_up": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:846" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:838" ], "ticker.decade_down": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:847" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:839" ], "docstring.Appender": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:851" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:843" ], "docstring.dedent": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:852" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:844" ], "docstring.copy_dedent": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:853" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:845" ], "matplotlib.pyplot.get_scale_docs()": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:861" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:853" ], "dates.strpdate2num": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:926" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:918" ], "dates.bytespdate2num": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:927" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:919" ], "axes3d.Axes3D.xaxis": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:941" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:933" ], "axes3d.Axes3D.yaxis": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:941" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:933" ], "axes3d.Axes3D.zaxis": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:941" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:933" ], "pytest.mark.backend(...)": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:949" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:941" ], "matplotlib.testing.conftest.mpl_test_settings": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:949" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:941" ], "Quiver": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:955" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:947" ], "Collection": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:957", + "doc/api/prev_api_changes/api_changes_3.1.0.rst:949", "doc/users/prev_whats_new/whats_new_1.5.rst:321", "doc/users/prev_whats_new/whats_new_2.2.rst:198", "doc/users/prev_whats_new/whats_new_2.2.rst:201" ], "backend_gtk3.FileChooserDialog": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:966" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:958" ], "backend_gtk3.NavigationToolbar2GTK3.get_filechooser": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:967" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:959" ], "backend_gtk3.SaveFigureGTK3.get_filechooser": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:968" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:960" ], "NavigationToolbar2QT.adj_window": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:969" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:961" ], "backend_wx.IDLE_DELAY": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:970" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:962" ], "LogTransform": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:1001" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:993" ], "InvertedLogTransform": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:1001" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:993" ], "NavigationToolbar2QT.buttons": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:1041" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:1033" ], "Axis.iter_ticks": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:1072" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:1064" ], "Axis._update_ticks": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:1074" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:1066" ], "Formatter.__call__": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:1123", - "doc/api/prev_api_changes/api_changes_3.1.0.rst:1129" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:1115", + "doc/api/prev_api_changes/api_changes_3.1.0.rst:1121" ], "ticker..MaxNLocator": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:1156" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:1148" ], "Locator.nonsingular": [ "doc/api/prev_api_changes/api_changes_3.1.1.rst:14" @@ -1685,6 +1668,7 @@ "lib/matplotlib/projections/polar.py:docstring of matplotlib.projections.polar.ThetaTick:4" ], "plot": [ + "doc/tutorials/introductory/customizing.rst:184", "doc/users/prev_whats_new/changelog.rst:232", "lib/matplotlib/sphinxext/plot_directive.py:docstring of matplotlib.sphinxext.plot_directive:4" ], @@ -1743,10 +1727,6 @@ "pytest.mark.usefixtures": [ "lib/matplotlib/testing/decorators.py:docstring of matplotlib.testing.decorators.image_comparison:13" ], - "Transform": [ - "doc/users/prev_whats_new/whats_new_2.2.rst:357", - "doc/users/prev_whats_new/whats_new_2.2.rst:360" - ], "texmanager.TexManager": [ "lib/matplotlib/textpath.py:docstring of matplotlib.textpath.TextToPath.get_texmanager:2" ], @@ -1770,16 +1750,16 @@ "lib/matplotlib/units.py:docstring of matplotlib.units.DecimalConverter.axisinfo:2" ], "active": [ - "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.AxesWidget:36" + "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.AxesWidget:34" ], "figure.canvas.mpl_connect": [ "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.AxesWidget.connect_event:4" ], "xy": [ - "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.Lasso:8" + "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.Lasso:7" ], "callback": [ - "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.Lasso:20" + "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.Lasso:19" ], "onselect": [ "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.PolygonSelector:20" @@ -1802,15 +1782,6 @@ "valstep": [ "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.Slider:70" ], - "facecolor": [ - "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.Slider:85" - ], - "edgecolor": [ - "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.Slider:85" - ], - "alpha": [ - "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.Slider:85" - ], "span_selector.active=False": [ "lib/matplotlib/widgets.py:docstring of matplotlib.widgets.SpanSelector:7" ], @@ -1866,7 +1837,7 @@ "setup.py": [ "doc/devel/MEP/MEP11.rst:64", "doc/devel/MEP/MEP11.rst:67", - "doc/devel/contributing.rst:387" + "doc/devel/contributing.rst:403" ], "import numpy": [ "doc/devel/MEP/MEP11.rst:64" @@ -2183,86 +2154,80 @@ "text": [ "doc/devel/MEP/MEP29.rst:28" ], - "Example": [ - "doc/devel/coding_guide.rst:26" - ], - "examples": [ - "doc/devel/coding_guide.rst:26" - ], "tox": [ - "doc/devel/coding_guide.rst:81" + "doc/devel/coding_guide.rst:101" ], "git status": [ - "doc/devel/coding_guide.rst:185" + "doc/devel/coding_guide.rst:207" ], "v2.2.x": [ - "doc/devel/coding_guide.rst:194" + "doc/devel/coding_guide.rst:216" ], "master": [ - "doc/devel/coding_guide.rst:194" + "doc/devel/coding_guide.rst:216" ], "doc/api/api_changes": [ - "doc/devel/contributing.rst:269" + "doc/devel/contributing.rst:271" ], "doc/api/next_api_changes": [ - "doc/devel/contributing.rst:346" + "doc/devel/contributing.rst:362" ], "MatplotlibDeprecationWarning": [ - "doc/devel/contributing.rst:352" + "doc/devel/contributing.rst:368" ], "cbook.warn_deprecated()": [ - "doc/devel/contributing.rst:355" + "doc/devel/contributing.rst:371" ], "package_data": [ - "doc/devel/contributing.rst:387" + "doc/devel/contributing.rst:403" ], "FOO_wrap.cpp": [ - "doc/devel/contributing.rst:399" + "doc/devel/contributing.rst:415" ], "FOO_wrapper.cpp": [ - "doc/devel/contributing.rst:399" + "doc/devel/contributing.rst:415" ], "logger.WARNING": [ - "doc/devel/contributing.rst:493" + "doc/devel/contributing.rst:509" ], "cbook._warn_external": [ - "doc/devel/contributing.rst:518", - "doc/devel/contributing.rst:533", - "doc/devel/contributing.rst:542", - "doc/devel/contributing.rst:567" + "doc/devel/contributing.rst:534", + "doc/devel/contributing.rst:549", + "doc/devel/contributing.rst:558", + "doc/devel/contributing.rst:583" ], "logging.WARNING": [ - "doc/devel/contributing.rst:530" + "doc/devel/contributing.rst:546" ], "warn": [ - "doc/devel/contributing.rst:542" + "doc/devel/contributing.rst:558" ], "./gallery/index.html": [ - "doc/devel/contributing.rst:587" + "doc/devel/contributing.rst:603" ], "lib/matplotlib/mpl-data/sample_data/": [ - "doc/devel/contributing.rst:592" + "doc/devel/contributing.rst:608" ], ":doc:": [ - "doc/devel/documenting_mpl.rst:161" + "doc/devel/documenting_mpl.rst:184" ], "pyplot.getp": [ - "doc/devel/documenting_mpl.rst:520" + "doc/devel/documenting_mpl.rst:582" ], "matplotlib.docstring.dedent_interpd": [ - "doc/devel/documenting_mpl.rst:588" + "doc/devel/documenting_mpl.rst:650" ], "matplotlib.patches.Patch.__init__": [ - "doc/devel/documenting_mpl.rst:621" + "doc/devel/documenting_mpl.rst:683" ], "# docstring inherited": [ - "doc/devel/documenting_mpl.rst:637" + "doc/devel/documenting_mpl.rst:699" ], ":plot:": [ - "doc/devel/documenting_mpl.rst:657" + "doc/devel/documenting_mpl.rst:719" ], "###": [ - "doc/devel/documenting_mpl.rst:744" + "doc/devel/documenting_mpl.rst:806" ], "pytest": [ "doc/devel/testing.rst:50", @@ -2278,19 +2243,16 @@ "doc/gallery/misc/ftface_props.rst:14" ], "ConciseDateConverter": [ - "doc/gallery/ticks_and_spines/date_concise_formatter.rst:215" - ], - "pyplot": [ - "doc/index.rst:44" + "doc/gallery/ticks_and_spines/date_concise_formatter.rst:214" ], "mplot3d": [ - "doc/index.rst:145" + "doc/index.rst:157" ], "axes_grid1": [ - "doc/index.rst:145" + "doc/index.rst:157" ], "axisartist": [ - "doc/index.rst:145" + "doc/index.rst:157" ], "'viridis'": [ "doc/users/dflt_style_changes.rst:121" @@ -2807,6 +2769,10 @@ "examples/user_interfaces/toolmanager_sgskip.py": [ "doc/users/prev_whats_new/whats_new_2.2.rst:317" ], + "Transform": [ + "doc/users/prev_whats_new/whats_new_2.2.rst:357", + "doc/users/prev_whats_new/whats_new_2.2.rst:360" + ], "Figure_1-1.png": [ "doc/users/prev_whats_new/whats_new_3.0.rst:85" ], @@ -2905,10 +2871,6 @@ "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.axvspan:4", "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.errorbar:60" ], - "matplotlib.backend_bases.Event.mpl_disconnect": [ - "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.FigureCanvasBase.mpl_connect:33", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.connect:33" - ], "autoscale_view": [ "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.margins:32" ], @@ -2993,14 +2955,14 @@ "lib/matplotlib/transforms.py:docstring of matplotlib.transforms.Affine2DBase:13" ], "matplotlib.text.Text.__init__": [ - "doc/devel/contributing.rst:425", - "doc/devel/contributing.rst:433" + "doc/devel/contributing.rst:441", + "doc/devel/contributing.rst:449" ], "matplotlib.patches.Rectangle.contains": [ - "doc/users/event_handling.rst:163" + "doc/users/event_handling.rst:164" ], "matplotlib.lines.Line2D.pick": [ - "doc/users/event_handling.rst:482" + "doc/users/event_handling.rst:483" ], "matplotlib.axes.boxplot": [ "doc/users/prev_whats_new/whats_new_1.2.rst:126" @@ -3038,8 +3000,8 @@ "lib/matplotlib/figure.py:docstring of matplotlib.figure.AxesStack:1" ], "matplotlib.contours.ContourSet": [ - "lib/matplotlib/figure.py:docstring of matplotlib.figure.Figure.colorbar:141", - "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.colorbar:137", + "lib/matplotlib/figure.py:docstring of matplotlib.figure.Figure.colorbar:142", + "lib/matplotlib/pyplot.py:docstring of matplotlib.pyplot.colorbar:138", "lib/mpl_toolkits/axes_grid1/colorbar.py:docstring of mpl_toolkits.axes_grid1.colorbar.colorbar:92" ], "matplotlib.patches._Style": [ @@ -3053,13 +3015,13 @@ "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle:38", "lib/matplotlib/patches.py:docstring of matplotlib.patches.ConnectionStyle:38" ], - "matplotlib.patches._Bracket": [ + "matplotlib.patches.ArrowStyle._Bracket": [ "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" ], - "matplotlib.patches._Curve": [ + "matplotlib.patches.ArrowStyle._Curve": [ "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", @@ -3068,40 +3030,27 @@ "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.CurveFilledAB:1", "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.CurveFilledB:1" ], - "matplotlib.patches._Base": [ + "matplotlib.patches.ArrowStyle._Base": [ "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", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.ArrowStyle.Wedge:1" + ], + "matplotlib.patches.BoxStyle._Base": [ "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.Circle:1", "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.DArrow:1", "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.LArrow:1", "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.Round4:1", "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.Round:1", "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.Sawtooth:1", - "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.Square:1", + "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.Square:1" + ], + "matplotlib.patches.ConnectionStyle._Base": [ "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" ], - "BboxTransmuter": [ - "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.Circle.transmute:2", - "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.DArrow.transmute:2", - "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.LArrow.transmute:2", - "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.RArrow.transmute:2", - "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.Round.transmute:2", - "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.Round4.transmute:2", - "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.Roundtooth.transmute:2", - "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.Sawtooth.transmute:2", - "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.Square.transmute:2" - ], - "matplotlib.patches.LArrow": [ - "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.RArrow:1" - ], - "matplotlib.patches.Sawtooth": [ - "lib/matplotlib/patches.py:docstring of matplotlib.patches.BoxStyle.Roundtooth:1" - ], "matplotlib.patch.Patch": [ "lib/matplotlib/patches.py:docstring of matplotlib.patches.FancyArrowPatch.set_patchA:8", "lib/matplotlib/patches.py:docstring of matplotlib.patches.FancyArrowPatch.set_patchB:8", @@ -3155,41 +3104,24 @@ ":1", "doc/api/_as_gen/mpl_toolkits.axes_grid1.parasite_axes.rst:31::1" ], - "mpl_toolkits.axisartist.axisline_style.SimpleArrow": [ - "lib/mpl_toolkits/axisartist/axisline_style.py:docstring of mpl_toolkits.axisartist.axisline_style.AxislineStyle.FilledArrow:1" - ], "_FancyAxislineStyle.FilledArrow": [ ":1" ], - "mpl_toolkits.axisartist.axisline_style._Base": [ + "mpl_toolkits.axisartist.axisline_style.AxislineStyle._Base": [ "lib/mpl_toolkits/axisartist/axisline_style.py:docstring of mpl_toolkits.axisartist.axisline_style.AxislineStyle.SimpleArrow:1" ], "_FancyAxislineStyle.SimpleArrow": [ ":1" ], - "mpl_toolkits.axisartist.axislines._Base": [ + "mpl_toolkits.axisartist.axislines.AxisArtistHelper._Base": [ "lib/mpl_toolkits/axisartist/axislines.py:docstring of mpl_toolkits.axisartist.axislines.AxisArtistHelper.Fixed:1", "lib/mpl_toolkits/axisartist/axislines.py:docstring of mpl_toolkits.axisartist.axislines.AxisArtistHelper.Floating:1" ], - "mpl_toolkits.axisartist.axislines.Fixed": [ - "lib/mpl_toolkits/axisartist/axislines.py:docstring of mpl_toolkits.axisartist.axislines.AxisArtistHelperRectlinear.Fixed:1", - "lib/mpl_toolkits/axisartist/grid_helper_curvelinear.py:docstring of mpl_toolkits.axisartist.grid_helper_curvelinear.FixedAxisArtistHelper:1" - ], - "mpl_toolkits.axisartist.axislines.Floating": [ - "lib/mpl_toolkits/axisartist/axislines.py:docstring of mpl_toolkits.axisartist.axislines.AxisArtistHelperRectlinear.Floating:1", - "lib/mpl_toolkits/axisartist/grid_helper_curvelinear.py:docstring of mpl_toolkits.axisartist.grid_helper_curvelinear.FloatingAxisArtistHelper:1" - ], "mpl_toolkits.axisartist.floating_axes.Floating AxesHostAxes": [ ":1", "doc/api/_as_gen/mpl_toolkits.axisartist.floating_axes.rst:31::1" ], - "Patch": [ - "lib/matplotlib/spines.py:docstring of matplotlib.spines.Spine.draw:2", - "lib/matplotlib/table.py:docstring of matplotlib.table.Cell.draw:2", - "lib/mpl_toolkits/mplot3d/art3d.py:docstring of mpl_toolkits.mplot3d.art3d.Patch3D.get_facecolor:2" - ], "tzinfo": [ - "lib/matplotlib/dates.py:docstring of matplotlib.dates.AutoDateLocator:36", "lib/matplotlib/dates.py:docstring of matplotlib.dates.DateLocator:24", "lib/matplotlib/dates.py:docstring of matplotlib.dates.RRuleLocator:2", "lib/mpl_toolkits/mplot3d/axes3d.py:docstring of mpl_toolkits.mplot3d.axes3d.Axes3D.zaxis_date:4" @@ -3233,10 +3165,6 @@ "matplotlib.projections.geo.MollweideAxes": [ "doc/api/artist_api.rst:189" ], - "backend_bases.Timer": [ - "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.FigureCanvasBase.new_timer:2", - "lib/matplotlib/backends/backend_nbagg.py:docstring of matplotlib.backends.backend_nbagg.FigureCanvasNbAgg.new_timer:2" - ], "Cursors": [ "lib/matplotlib/backend_bases.py:docstring of matplotlib.backend_bases.NavigationToolbar2.set_cursor:2" ], @@ -3422,7 +3350,7 @@ "doc/tutorials/intermediate/artists.rst:57" ], "matplotlib.patches.AxesImage": [ - "doc/users/event_handling.rst:414" + "doc/users/event_handling.rst:415" ], "mpl_toolkits.axes_grid1.axes_divider.HBox": [ "doc/users/prev_whats_new/whats_new_1.1.rst:210" @@ -3509,45 +3437,6 @@ "matplotlib.cm.ScalarMappable.callbacksSM": [ "doc/api/prev_api_changes/api_changes_0.98.0.rst:10" ], - "transforms.Bbox.bounds": [ - "doc/api/prev_api_changes/api_changes_0.98.0.rst:91" - ], - "transforms.BboxBase.width": [ - "doc/api/prev_api_changes/api_changes_0.98.0.rst:93" - ], - "transforms.BboxBase.height": [ - "doc/api/prev_api_changes/api_changes_0.98.0.rst:96" - ], - "transforms.Bbox.intervalx": [ - "doc/api/prev_api_changes/api_changes_0.98.0.rst:99" - ], - "transforms.Bbox.intervaly": [ - "doc/api/prev_api_changes/api_changes_0.98.0.rst:102" - ], - "transforms.Bbox.x0": [ - "doc/api/prev_api_changes/api_changes_0.98.0.rst:105" - ], - "transforms.BboxBase.xmin": [ - "doc/api/prev_api_changes/api_changes_0.98.0.rst:105" - ], - "transforms.Bbox.y0": [ - "doc/api/prev_api_changes/api_changes_0.98.0.rst:109" - ], - "transforms.BboxBase.ymin": [ - "doc/api/prev_api_changes/api_changes_0.98.0.rst:109" - ], - "transforms.Bbox.x1": [ - "doc/api/prev_api_changes/api_changes_0.98.0.rst:113" - ], - "transforms.BboxBase.xmax": [ - "doc/api/prev_api_changes/api_changes_0.98.0.rst:113" - ], - "transforms.Bbox.y1": [ - "doc/api/prev_api_changes/api_changes_0.98.0.rst:117" - ], - "transforms.BboxBase.ymax": [ - "doc/api/prev_api_changes/api_changes_0.98.0.rst:117" - ], "matplotlib.figure.Figure.patch": [ "doc/api/prev_api_changes/api_changes_0.98.x.rst:89", "doc/tutorials/intermediate/artists.rst:172", @@ -3674,9 +3563,6 @@ "lib/matplotlib/dates.py:docstring of matplotlib.dates.datestr2num:2", "lib/matplotlib/dates.py:docstring of matplotlib.dates:28::1" ], - "strftime": [ - "lib/matplotlib/dates.py:docstring of matplotlib.dates.IndexDateFormatter:23" - ], "matplotlib.pylab.plot": [ "doc/devel/add_new_projection.rst:18" ], @@ -3684,7 +3570,7 @@ "doc/devel/add_new_projection.rst:18" ], "log.debug": [ - "doc/devel/contributing.rst:475" + "doc/devel/contributing.rst:491" ], "matplotlib.test": [ "doc/devel/testing.rst:85" @@ -3816,11 +3702,11 @@ "doc/api/prev_api_changes/api_changes_3.0.0.rst:355" ], "matplotlib.pylab": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:624", + "doc/api/prev_api_changes/api_changes_3.1.0.rst:616", "doc/users/history.rst:63" ], "matplotlib.scales": [ - "doc/api/prev_api_changes/api_changes_3.1.0.rst:1001" + "doc/api/prev_api_changes/api_changes_3.1.0.rst:993" ], "mpl_toolkits.mplot3d.axes3d": [ "doc/api/toolkits/mplot3d.rst:19" @@ -3852,4 +3738,4 @@ "doc/users/prev_whats_new/whats_new_1.5.rst:737" ] } -} +} \ No newline at end of file From 4b4916455c88440b1c0ff0c37fc622b33dfd2605 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Wed, 8 Apr 2020 06:51:58 -1000 Subject: [PATCH 13/26] Backport PR #17065: Fix macOS CI test failure --- .../bbox_inches_tight_raster.pdf | Bin 7455 -> 7245 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/matplotlib/tests/baseline_images/test_bbox_tight/bbox_inches_tight_raster.pdf b/lib/matplotlib/tests/baseline_images/test_bbox_tight/bbox_inches_tight_raster.pdf index 2a7484d0b7a12b366f2d924613c04cf37be657c4..5e3b389b1deab0d47b9379f8924166c159b9947f 100644 GIT binary patch literal 7245 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 Date: Mon, 13 Apr 2020 23:55:58 -0400 Subject: [PATCH 14/26] Backport PR #17126: Remove Python2/3 info box --- doc/conf.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 6cd891adc551..384beba3772d 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -260,8 +260,10 @@ def _check_dependencies(): # Custom sidebar templates, maps page names to templates. html_sidebars = { - 'index': ['sidebar_announcement.html', 'sidebar_versions.html', - 'donate_sidebar.html'], + 'index': [ + # 'sidebar_announcement.html', + 'sidebar_versions.html', + 'donate_sidebar.html'], '**': ['localtoc.html', 'relations.html', 'pagesource.html'] } From caa33ae16d858ba26692ef49e3d74046ba2e751a Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Tue, 14 Apr 2020 07:57:03 -0700 Subject: [PATCH 15/26] Backport PR #17131: BUG: Fix formatting error in GridSpec.__repr__ --- lib/matplotlib/gridspec.py | 4 ++-- lib/matplotlib/tests/test_gridspec.py | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/gridspec.py b/lib/matplotlib/gridspec.py index 18cd55920ba8..a7fe61a2e6a9 100644 --- a/lib/matplotlib/gridspec.py +++ b/lib/matplotlib/gridspec.py @@ -48,9 +48,9 @@ def __init__(self, nrows, ncols, height_ratios=None, width_ratios=None): self.set_width_ratios(width_ratios) def __repr__(self): - height_arg = (', height_ratios=%r' % self._row_height_ratios + height_arg = (', height_ratios=%r' % (self._row_height_ratios,) if self._row_height_ratios is not None else '') - width_arg = (', width_ratios=%r' % self._col_width_ratios + width_arg = (', width_ratios=%r' % (self._col_width_ratios,) if self._col_width_ratios is not None else '') return '{clsname}({nrows}, {ncols}{optionals})'.format( clsname=self.__class__.__name__, diff --git a/lib/matplotlib/tests/test_gridspec.py b/lib/matplotlib/tests/test_gridspec.py index 70d1ee132851..2ecbf24fca6b 100644 --- a/lib/matplotlib/tests/test_gridspec.py +++ b/lib/matplotlib/tests/test_gridspec.py @@ -24,3 +24,11 @@ def test_height_ratios(): """ with pytest.raises(ValueError): gridspec.GridSpec(1, 1, height_ratios=[2, 1, 3]) + + +def test_repr(): + ss = gridspec.GridSpec(2, 2, + height_ratios=(3, 1), + width_ratios=(1, 3)) + assert repr(ss) == \ + "GridSpec(2, 2, height_ratios=(3, 1), width_ratios=(1, 3))" From 5f3204f1a93f6f9c9bbb716d0b26741da263aeb6 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Thu, 9 Apr 2020 09:39:57 +0200 Subject: [PATCH 16/26] Backport PR #17076: Fix SyntaxErrors when running setup in old Python --- setup.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 87b93a970b3a..bf03159fbe6c 100644 --- a/setup.py +++ b/setup.py @@ -13,11 +13,13 @@ if sys.version_info < min_version: error = """ Beginning with Matplotlib 3.1, Python {0} or above is required. +You are using Python {1}. This may be due to an out of date pip. Make sure you have pip >= 9.0.1. -""".format('.'.join(str(n) for n in min_version)), +""".format('.'.join(str(n) for n in min_version), + '.'.join(str(n) for n in sys.version_info[:3])) sys.exit(error) from pathlib import Path @@ -136,8 +138,9 @@ def _download_jquery_to(dest): try: buff = download_or_cache(url, sha) except Exception: - raise IOError(f"Failed to download jquery-ui. Please download " - f"{url} and extract it to {dest}.") + raise IOError( + "Failed to download jquery-ui. Please download " + "{url} and extract it to {dest}.".format(url=url, dest=dest)) with ZipFile(buff) as zf: zf.extractall(dest) @@ -178,7 +181,7 @@ def run(self): # If the user just queries for information, don't bother figuring out which # packages to build or install. if not (any('--' + opt in sys.argv - for opt in [*Distribution.display_option_names, 'help']) + for opt in Distribution.display_option_names + ['help']) or 'clean' in sys.argv): # Go through all of the packages and figure out which ones we are # going to build/install. From d834d1c9e62cb20c937b8e42a301d2a63a5d9622 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sat, 18 Apr 2020 14:36:50 +0200 Subject: [PATCH 17/26] Backport PR16958: MAINT: Replace uses of tostring with tobytes --- lib/matplotlib/backends/backend_pdf.py | 4 ++-- lib/matplotlib/backends/backend_ps.py | 2 +- lib/matplotlib/backends/backend_wx.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index d3e08d1bcf6d..d1f38990cd10 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -1394,7 +1394,7 @@ def writeGouraudTriangles(self): streamarr['points'] = (flat_points - points_min) * factor streamarr['colors'] = flat_colors[:, :colordim] * 255.0 - self.write(streamarr.tostring()) + self.write(streamarr.tobytes()) self.endStream() self.writeObject(self.gouraudObject, gouraudDict) @@ -1487,7 +1487,7 @@ def _writeImg(self, data, height, width, grayscale, id, smask=None): if png: self._writePng(data) else: - self.currentstream.write(data.tostring()) + self.currentstream.write(data.tobytes()) self.endStream() def writeImages(self): diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index bcc015be516d..d3850cc7cb95 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -694,7 +694,7 @@ def draw_gouraud_triangles(self, gc, points, colors, trans): streamarr['points'] = (flat_points - points_min) * factor streamarr['colors'] = flat_colors[:, :3] * 255.0 - stream = quote_ps_string(streamarr.tostring()) + stream = quote_ps_string(streamarr.tobytes()) self._pswriter.write(f"""\ gsave diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index ac61e1ca31c5..1c7e0c7df7e6 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -288,7 +288,7 @@ def draw_image(self, gc, x, y, im): w = self.width h = self.height rows, cols = im.shape[:2] - bitmap = wx.Bitmap.FromBufferRGBA(cols, rows, im.tostring()) + bitmap = wx.Bitmap.FromBufferRGBA(cols, rows, im.tobytes()) gc = self.get_gc() gc.select() gc.gfx_ctx.DrawBitmap(bitmap, int(l), int(self.height - b), From 73b3b6444a795c59c1c89703c6e3470280a0895c Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Fri, 24 Apr 2020 23:33:21 -0400 Subject: [PATCH 18/26] Backport PR #17240: CI: Download wx wheels for the correct Ubuntu version. --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b51f9027d9bc..c22ea0453deb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,6 +35,7 @@ addons: - libffi-dev - libgeos-dev - libgirepository1.0-dev + - libsdl2-2.0-0 - lmodern - fonts-freefont-otf - texlive-pictures @@ -147,7 +148,7 @@ install: echo 'PyQt5 is available' || echo 'PyQt5 is not available' python -mpip install --upgrade \ - -f https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-14.04 \ + -f https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-16.04 \ wxPython && python -c 'import wx' && echo 'wxPython is available' || From ebab39c4d873fdfbab6cae75903382dd2c45bfb5 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Mon, 27 Apr 2020 18:48:20 +0200 Subject: [PATCH 19/26] Merge pull request #17206 from jklymak/fix-bypass-inverse-collection --- lib/matplotlib/collections.py | 13 ++++++------- lib/matplotlib/tests/test_collections.py | 7 +++++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index ba1f7c0ffbae..d928dc59ba48 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -213,8 +213,6 @@ def get_datalim(self, transData): # we may have transform.contains_branch(transData) but not # transforms.get_affine().contains_branch(transData). But later, # be careful to only apply the affine part that remains. - if not transOffset.is_affine: - offsets = transOffset.transform_non_affine(offsets) if isinstance(offsets, np.ma.MaskedArray): offsets = offsets.filled(np.nan) @@ -228,17 +226,18 @@ def get_datalim(self, transData): # also use this algorithm (like streamplot). result = mpath.get_path_collection_extents( transform.get_affine(), paths, self.get_transforms(), - offsets, transOffset.get_affine().frozen()) - return result.inverse_transformed(transData) + transOffset.transform_non_affine(offsets), + transOffset.get_affine().frozen()) + return result.transformed(transData.inverted()) if not self._offsetsNone: # this is for collections that have their paths (shapes) # in physical, axes-relative, or figure-relative units # (i.e. like scatter). We can't uniquely set limits based on # those shapes, so we just set the limits based on their # location. - # Finish the transform: - offsets = (transOffset.get_affine() + - transData.inverted()).transform(offsets) + + offsets = (transOffset - transData).transform(offsets) + # note A-B means A B^{-1} offsets = np.ma.masked_invalid(offsets) if not offsets.mask.all(): points = np.row_stack((offsets.min(axis=0), diff --git a/lib/matplotlib/tests/test_collections.py b/lib/matplotlib/tests/test_collections.py index fdd581166a02..3f5b3bf1ae40 100644 --- a/lib/matplotlib/tests/test_collections.py +++ b/lib/matplotlib/tests/test_collections.py @@ -732,3 +732,10 @@ def test_blended_collection_autolim(): ax.add_collection(LineCollection(line_segs, transform=trans)) ax.autoscale_view(scalex=True, scaley=False) np.testing.assert_allclose(ax.get_xlim(), [1., 4.]) + + +def test_singleton_autolim(): + fig, ax = plt.subplots() + ax.scatter(0, 0) + np.testing.assert_allclose(ax.get_ylim(), [-0.06, 0.06]) + np.testing.assert_allclose(ax.get_xlim(), [-0.06, 0.06]) From de281fe317e9ab886695a08b5d04e976325c7283 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Mon, 27 Apr 2020 23:39:18 -0400 Subject: [PATCH 20/26] Backport PR #17252: Fix bug where matplotlib.style('default') resets the backend --- lib/matplotlib/style/core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/style/core.py b/lib/matplotlib/style/core.py index 577c9f51e7a5..27763d370fd2 100644 --- a/lib/matplotlib/style/core.py +++ b/lib/matplotlib/style/core.py @@ -43,14 +43,14 @@ def _remove_blacklisted_style_params(d, warn=True): o = {} - for key, val in d.items(): + for key in d: # prevent triggering RcParams.__getitem__('backend') if key in STYLE_BLACKLIST: if warn: cbook._warn_external( "Style includes a parameter, '{0}', that is not related " "to style. Ignoring".format(key)) else: - o[key] = val + o[key] = d[key] return o From 74becc46a6af30425fb3678f079ebb36b895a24b Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Fri, 13 Dec 2019 12:44:27 -0800 Subject: [PATCH 21/26] Merge pull request #15695 from anntzer/mathdefault Define \mathdefault as a noop in the usetex preamble. Conflicts: lib/matplotlib/ticker.py change of a near-by conditional from np.abs -> abs caused conflict --- lib/matplotlib/tests/test_usetex.py | 19 +++++++--- lib/matplotlib/texmanager.py | 40 +++++++++----------- lib/matplotlib/ticker.py | 57 +++++++---------------------- 3 files changed, 45 insertions(+), 71 deletions(-) diff --git a/lib/matplotlib/tests/test_usetex.py b/lib/matplotlib/tests/test_usetex.py index 8d8cf29d0b82..cf6f37049045 100644 --- a/lib/matplotlib/tests/test_usetex.py +++ b/lib/matplotlib/tests/test_usetex.py @@ -7,17 +7,15 @@ from matplotlib.ticker import EngFormatter -@pytest.fixture(autouse=True) # All tests in this module use usetex. -def usetex(): - if not mpl.checkdep_usetex(True): - pytest.skip('Missing TeX of Ghostscript or dvipng') - mpl.rcParams['text.usetex'] = True +if not mpl.checkdep_usetex(True): + pytestmark = pytest.mark.skip('Missing TeX of Ghostscript or dvipng') @image_comparison(baseline_images=['test_usetex'], extensions=['pdf', 'png'], tol={'aarch64': 2.868}.get(platform.machine(), 0.3)) def test_usetex(): + mpl.rcParams['text.usetex'] = True fig = plt.figure() ax = fig.add_subplot(111) ax.text(0.1, 0.2, @@ -33,5 +31,16 @@ def test_usetex(): @check_figures_equal() def test_unicode_minus(fig_test, fig_ref): + mpl.rcParams['text.usetex'] = True fig_test.text(.5, .5, "$-$") fig_ref.text(.5, .5, "\N{MINUS SIGN}") + + +def test_mathdefault(): + plt.rcParams["axes.formatter.use_mathtext"] = True + fig = plt.figure() + fig.add_subplot().set_xlim(-1, 1) + # Check that \mathdefault commands generated by tickers don't cause + # problems when later switching usetex on. + mpl.rcParams['text.usetex'] = True + fig.canvas.draw() diff --git a/lib/matplotlib/texmanager.py b/lib/matplotlib/texmanager.py index 1e788a64c4cd..d2574a430d41 100644 --- a/lib/matplotlib/texmanager.py +++ b/lib/matplotlib/texmanager.py @@ -192,6 +192,22 @@ def get_custom_preamble(self): """Return a string containing user additions to the tex preamble.""" return rcParams['text.latex.preamble'] + def _get_preamble(self): + unicode_preamble = "\n".join([ + r"\usepackage[utf8]{inputenc}", + r"\DeclareUnicodeCharacter{2212}{\ensuremath{-}}", + ]) if rcParams["text.latex.unicode"] else "" + return "\n".join([ + r"\documentclass{article}", + # Pass-through \mathdefault, which is used in non-usetex mode to + # use the default text font but was historically suppressed in + # usetex mode. + r"\newcommand{\mathdefault}[1]{#1}", + self._font_preamble, + unicode_preamble, + self.get_custom_preamble(), + ]) + def make_tex(self, tex, fontsize): """ Generate a tex file to render the tex string at a specific font size. @@ -200,29 +216,19 @@ def make_tex(self, tex, fontsize): """ basefile = self.get_basefile(tex, fontsize) texfile = '%s.tex' % basefile - custom_preamble = self.get_custom_preamble() fontcmd = {'sans-serif': r'{\sffamily %s}', 'monospace': r'{\ttfamily %s}'}.get(self.font_family, r'{\rmfamily %s}') tex = fontcmd % tex - unicode_preamble = "\n".join([ - r"\usepackage[utf8]{inputenc}", - r"\DeclareUnicodeCharacter{2212}{\ensuremath{-}}", - ]) if rcParams["text.latex.unicode"] else "" - s = r""" -\documentclass{article} -%s -%s %s \usepackage[papersize={72in,72in},body={70in,70in},margin={1in,1in}]{geometry} \pagestyle{empty} \begin{document} \fontsize{%f}{%f}%s \end{document} -""" % (self._font_preamble, unicode_preamble, custom_preamble, - fontsize, fontsize * 1.25, tex) +""" % (self._get_preamble(), fontsize, fontsize * 1.25, tex) with open(texfile, 'wb') as fh: if rcParams['text.latex.unicode']: fh.write(s.encode('utf8')) @@ -250,24 +256,15 @@ def make_tex_preview(self, tex, fontsize): """ basefile = self.get_basefile(tex, fontsize) texfile = '%s.tex' % basefile - custom_preamble = self.get_custom_preamble() fontcmd = {'sans-serif': r'{\sffamily %s}', 'monospace': r'{\ttfamily %s}'}.get(self.font_family, r'{\rmfamily %s}') tex = fontcmd % tex - unicode_preamble = "\n".join([ - r"\usepackage[utf8]{inputenc}", - r"\DeclareUnicodeCharacter{2212}{\ensuremath{-}}", - ]) if rcParams["text.latex.unicode"] else "" - # newbox, setbox, immediate, etc. are used to find the box # extent of the rendered text. s = r""" -\documentclass{article} -%s -%s %s \usepackage[active,showbox,tightpage]{preview} \usepackage[papersize={72in,72in},body={70in,70in},margin={1in,1in}]{geometry} @@ -282,8 +279,7 @@ def make_tex_preview(self, tex, fontsize): {\fontsize{%f}{%f}%s} \end{preview} \end{document} -""" % (self._font_preamble, unicode_preamble, custom_preamble, - fontsize, fontsize * 1.25, tex) +""" % (self._get_preamble(), fontsize, fontsize * 1.25, tex) with open(texfile, 'wb') as fh: if rcParams['text.latex.unicode']: fh.write(s.encode('utf8')) diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index f29184ba55f8..c6b05288c17d 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -188,10 +188,6 @@ 'SymmetricalLogLocator', 'LogitLocator', 'OldAutoLocator') -def _mathdefault(s): - return '\\mathdefault{%s}' % s - - class _DummyAxis: def __init__(self, minpos=0): self.dataLim = mtransforms.Bbox.unit() @@ -664,14 +660,10 @@ def get_offset(self): sciNotStr = self.format_data(10 ** self.orderOfMagnitude) else: sciNotStr = '1e%d' % self.orderOfMagnitude - if self._useMathText: - if sciNotStr != '': - sciNotStr = r'\times%s' % _mathdefault(sciNotStr) - s = ''.join(('$', sciNotStr, _mathdefault(offsetStr), '$')) - elif self._usetex: + if self._useMathText or self._usetex: if sciNotStr != '': - sciNotStr = r'\times%s' % sciNotStr - s = ''.join(('$', sciNotStr, offsetStr, '$')) + sciNotStr = r'\times\mathdefault{%s}' % sciNotStr + s = r'$%s\mathdefault{%s}$' % (sciNotStr, offsetStr) else: s = ''.join((sciNotStr, offsetStr)) @@ -794,10 +786,8 @@ def _set_format(self): break sigfigs += 1 self.format = '%1.' + str(sigfigs) + 'f' - if self._usetex: - self.format = '$%s$' % self.format - elif self._useMathText: - self.format = '$%s$' % _mathdefault(self.format) + if self._usetex or self._useMathText: + self.format = r'$\mathdefault{%s}$' % self.format @cbook.deprecated("3.1") def pprint_val(self, x): @@ -1091,11 +1081,7 @@ class LogFormatterMathtext(LogFormatter): def _non_decade_format(self, sign_string, base, fx, usetex): 'Return string for non-decade locations' - if usetex: - return (r'$%s%s^{%.2f}$') % (sign_string, base, fx) - else: - return ('$%s$' % _mathdefault('%s%s^{%.2f}' % - (sign_string, base, fx))) + return r'$\mathdefault{%s%s^{%.2f}}$' % (sign_string, base, fx) def __call__(self, x, pos=None): """ @@ -1107,10 +1093,7 @@ def __call__(self, x, pos=None): min_exp = rcParams['axes.formatter.min_exponent'] if x == 0: # Symlog - if usetex: - return '$0$' - else: - return '$%s$' % _mathdefault('0') + return r'$\mathdefault{0}$' sign_string = '-' if x < 0 else '' x = abs(x) @@ -1135,18 +1118,12 @@ def __call__(self, x, pos=None): else: base = '%s' % b - if np.abs(fx) < min_exp: - if usetex: - return r'${0}{1:g}$'.format(sign_string, x) - else: - return '${0}$'.format(_mathdefault( - '{0}{1:g}'.format(sign_string, x))) + if abs(fx) < min_exp: + return r'$\mathdefault{%s%g}$' % (sign_string, x) elif not is_x_decade: return self._non_decade_format(sign_string, base, fx, usetex) - elif usetex: - return r'$%s%s^{%d}$' % (sign_string, base, fx) else: - return '$%s$' % _mathdefault('%s%s^{%d}' % (sign_string, base, fx)) + return r'$\mathdefault{%s%s^{%d}}$' % (sign_string, base, fx) class LogFormatterSciNotation(LogFormatterMathtext): @@ -1161,12 +1138,8 @@ def _non_decade_format(self, sign_string, base, fx, usetex): coeff = b ** fx / b ** exponent if is_close_to_int(coeff): coeff = round(coeff) - if usetex: - return (r'$%s%g\times%s^{%d}$') % \ - (sign_string, coeff, base, exponent) - else: - return ('$%s$' % _mathdefault(r'%s%g\times%s^{%d}' % - (sign_string, coeff, base, exponent))) + return r'$\mathdefault{%s%g\times%s^{%d}}$' \ + % (sign_string, coeff, base, exponent) class LogitFormatter(Formatter): @@ -1338,8 +1311,6 @@ def __call__(self, x, pos=None): return "" if x <= 0 or x >= 1: return "" - usetex = rcParams["text.usetex"] - if is_close_to_int(2 * x) and round(2 * x) == 1: s = self._one_half elif x < 0.5 and is_decade(x, rtol=1e-7): @@ -1354,9 +1325,7 @@ def __call__(self, x, pos=None): s = self._one_minus(self._format_value(1-x, 1-self.locs)) else: s = self._format_value(x, self.locs, sci_notation=False) - if usetex: - return "$%s$" % s - return "$%s$" % _mathdefault(s) + return r"$\mathdefault{%s}$" % s def format_data_short(self, value): """ From ed20fc11aeffca4a8ce362466e1e530a43b57066 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 15 Apr 2020 18:43:09 -0400 Subject: [PATCH 22/26] Merge pull request #16913 from anntzer/pstex Fix use of psfrags in ps backend + usetex. Conflicts: lib/matplotlib/backends/backend_ps.py - near by change of rcParams -> mpl.rcParams lib/matplotlib/texmanager.py - do not implicitly backport rcParam deprecations --- lib/matplotlib/backends/backend_ps.py | 22 ++++++++++++---------- lib/matplotlib/texmanager.py | 5 +++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index d3850cc7cb95..59a0f41066ee 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -1234,19 +1234,21 @@ def convert_psfrags(tmpfile, psfrags, font_preamble, custom_preamble, """ with mpl.rc_context({ "text.latex.preamble": - rcParams["text.latex.preamble"] + - r"\usepackage{psfrag,color}" - r"\usepackage[dvips]{graphicx}" - r"\PassOptionsToPackage{dvips}{geometry}"}): + mpl.rcParams["text.latex.preamble"] + + r"\usepackage{psfrag,color}""\n" + r"\usepackage[dvips]{graphicx}""\n" + r"\geometry{papersize={%(width)sin,%(height)sin}," + r"body={%(width)sin,%(height)sin},margin=0in}" + % {"width": paper_width, "height": paper_height} + }): dvifile = TexManager().make_dvi( - r"\newgeometry{papersize={%(width)sin,%(height)sin}," - r"body={%(width)sin,%(height)sin}, margin={0in,0in}}""\n" - r"\begin{figure}" - r"\centering\leavevmode%(psfrags)s" - r"\includegraphics*[angle=%(angle)s]{%(epsfile)s}" + "\n" + r"\begin{figure}""\n" + r" \centering\leavevmode""\n" + r" %(psfrags)s""\n" + r" \includegraphics*[angle=%(angle)s]{%(epsfile)s}""\n" r"\end{figure}" % { - "width": paper_width, "height": paper_height, "psfrags": "\n".join(psfrags), "angle": 90 if orientation == 'landscape' else 0, "epsfile": pathlib.Path(tmpfile).resolve().as_posix(), diff --git a/lib/matplotlib/texmanager.py b/lib/matplotlib/texmanager.py index d2574a430d41..381e05360dd9 100644 --- a/lib/matplotlib/texmanager.py +++ b/lib/matplotlib/texmanager.py @@ -205,6 +205,9 @@ def _get_preamble(self): r"\newcommand{\mathdefault}[1]{#1}", self._font_preamble, unicode_preamble, + # Needs to come early so that the custom preamble can change the + # geometry, e.g. in convert_psfrags. + r"\usepackage[papersize=72in,body=70in,margin=1in]{geometry}", self.get_custom_preamble(), ]) @@ -223,7 +226,6 @@ def make_tex(self, tex, fontsize): s = r""" %s -\usepackage[papersize={72in,72in},body={70in,70in},margin={1in,1in}]{geometry} \pagestyle{empty} \begin{document} \fontsize{%f}{%f}%s @@ -267,7 +269,6 @@ def make_tex_preview(self, tex, fontsize): s = r""" %s \usepackage[active,showbox,tightpage]{preview} -\usepackage[papersize={72in,72in},body={70in,70in},margin={1in,1in}]{geometry} %% we override the default showbox as it is treated as an error and makes %% the exit status not zero From 76d114f7416d21126d158792a345a714bf809889 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 14 Apr 2020 17:33:41 -0400 Subject: [PATCH 23/26] Merge pull request #16476 from anntzer/fix-usetex-baseline Fix baseline alignment when using usetex. Conflicts: lib/matplotlib/tests/test_usetex.py - import np and formatting issues on decorator --- lib/matplotlib/backends/backend_ps.py | 3 +- lib/matplotlib/dviread.py | 21 ++++++++++++ .../test_usetex/test_usetex.pdf | Bin 174976 -> 125933 bytes .../test_usetex/test_usetex.png | Bin 9329 -> 13512 bytes lib/matplotlib/tests/test_usetex.py | 31 ++++++++++++++---- lib/matplotlib/texmanager.py | 18 +++++++--- 6 files changed, 59 insertions(+), 14 deletions(-) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index 59a0f41066ee..7ce621b8a28e 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -543,8 +543,7 @@ def draw_tex(self, gc, x, y, s, prop, angle, ismath='TeX!', mtext=None): r'\psfrag{%s}[Bl][Bl][1][%f]{\fontsize{%f}{%f}%s}' % ( thetext, angle, fontsize, fontsize*1.25, tex)) else: - # Stick to the bottom alignment, but this may give incorrect - # baseline some times. + # Stick to the bottom alignment. pos = _nums_to_str(x-corr, y-bl) self.psfrag.append( r'\psfrag{%s}[bl][bl][1][%f]{\fontsize{%f}{%f}%s}' % ( diff --git a/lib/matplotlib/dviread.py b/lib/matplotlib/dviread.py index fc5498d910e8..2a48a13c4109 100644 --- a/lib/matplotlib/dviread.py +++ b/lib/matplotlib/dviread.py @@ -269,6 +269,12 @@ def _output(self): maxx = max(maxx, x + w) maxy = max(maxy, y + e) maxy_pure = max(maxy_pure, y) + if self._baseline_v is not None: + maxy_pure = self._baseline_v # This should normally be the case. + self._baseline_v = None + + if not self.text and not self.boxes: # Avoid infs/nans from inf+/-inf. + return Page(text=[], boxes=[], width=0, height=0, descent=0) if self.dpi is None: # special case for ease of debugging: output raw dvi coordinates @@ -296,9 +302,24 @@ def _read(self): Read one page from the file. Return True if successful, False if there were no more pages. """ + # Pages appear to start with the sequence + # bop (begin of page) + # xxx comment + # down + # push + # down, down + # push + # down (possibly multiple) + # push <= here, v is the baseline position. + # etc. + # (dviasm is useful to explore this structure.) + self._baseline_v = None while True: byte = self.file.read(1)[0] self._dtable[byte](self, byte) + if (self._baseline_v is None + and len(getattr(self, "stack", [])) == 3): + self._baseline_v = self.v if byte == 140: # end of page return True if self.state is _dvistate.post_post: # end of file diff --git a/lib/matplotlib/tests/baseline_images/test_usetex/test_usetex.pdf b/lib/matplotlib/tests/baseline_images/test_usetex/test_usetex.pdf index 8041641f98275a7c0e70f0bf3ecb28097b03651e..4ef375771d3891adb872e380e046e0153440d3ab 100644 GIT binary patch delta 3347 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 diff --git a/lib/matplotlib/tests/baseline_images/test_usetex/test_usetex.png b/lib/matplotlib/tests/baseline_images/test_usetex/test_usetex.png index 9a92f45e1e182dc670261f78445f7ea620d2362b..e4a9183612f5255bb048c6ffa1667584b6977405 100644 GIT binary patch literal 13512 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 literal 9329 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 diff --git a/lib/matplotlib/tests/test_usetex.py b/lib/matplotlib/tests/test_usetex.py index cf6f37049045..ec693288e932 100644 --- a/lib/matplotlib/tests/test_usetex.py +++ b/lib/matplotlib/tests/test_usetex.py @@ -1,3 +1,4 @@ +import numpy as np import pytest import platform @@ -11,22 +12,38 @@ pytestmark = pytest.mark.skip('Missing TeX of Ghostscript or dvipng') -@image_comparison(baseline_images=['test_usetex'], - extensions=['pdf', 'png'], - tol={'aarch64': 2.868}.get(platform.machine(), 0.3)) +@image_comparison( + baseline_images=['test_usetex'], + extensions=['pdf', 'png'], + style="mpl20") def test_usetex(): mpl.rcParams['text.usetex'] = True fig = plt.figure() ax = fig.add_subplot(111) - ax.text(0.1, 0.2, + kwargs = {"verticalalignment": "baseline", "size": 24, + "bbox": dict(pad=0, edgecolor="k", facecolor="none")} + ax.text(0.2, 0.7, # the \LaTeX macro exercises character sizing and placement, # \left[ ... \right\} draw some variable-height characters, # \sqrt and \frac draw horizontal rules, \mathrm changes the font r'\LaTeX\ $\left[\int\limits_e^{2e}' r'\sqrt\frac{\log^3 x}{x}\,\mathrm{d}x \right\}$', - fontsize=24) - ax.set_xticks([]) - ax.set_yticks([]) + **kwargs) + ax.text(0.2, 0.3, "lg", **kwargs) + ax.text(0.4, 0.3, r"$\frac{1}{2}\pi$", **kwargs) + ax.text(0.6, 0.3, "$p^{3^A}$", **kwargs) + ax.text(0.8, 0.3, "$p_{3_2}$", **kwargs) + for x in {t.get_position()[0] for t in ax.texts}: + ax.axvline(x) + for y in {t.get_position()[1] for t in ax.texts}: + ax.axhline(y) + ax.set_axis_off() + + +@check_figures_equal() +def test_empty(fig_test, fig_ref): + mpl.rcParams['text.usetex'] = True + fig_test.text(.5, .5, "% a comment") @check_figures_equal() diff --git a/lib/matplotlib/texmanager.py b/lib/matplotlib/texmanager.py index 381e05360dd9..4997a5300b47 100644 --- a/lib/matplotlib/texmanager.py +++ b/lib/matplotlib/texmanager.py @@ -228,7 +228,8 @@ def make_tex(self, tex, fontsize): %s \pagestyle{empty} \begin{document} -\fontsize{%f}{%f}%s +%% The empty hbox ensures that a page is printed even for empty inputs. +\fontsize{%f}{%f}\hbox{}%s \end{document} """ % (self._get_preamble(), fontsize, fontsize * 1.25, tex) with open(texfile, 'wb') as fh: @@ -388,9 +389,16 @@ def make_png(self, tex, fontsize, dpi): # see get_rgba for a discussion of the background if not os.path.exists(pngfile): dvifile = self.make_dvi(tex, fontsize) - self._run_checked_subprocess( - ["dvipng", "-bg", "Transparent", "-D", str(dpi), - "-T", "tight", "-o", pngfile, dvifile], tex) + cmd = ["dvipng", "-bg", "Transparent", "-D", str(dpi), + "-T", "tight", "-o", pngfile, dvifile] + # When testing, disable FreeType rendering for reproducibility; but + # dvipng 1.16 has a bug (fixed in f3ff241) that breaks --freetype0 + # mode, so for it we keep FreeType enabled; the image will be + # slightly off. + if (getattr(mpl, "_called_from_pytest", False) + and mpl._get_executable_info("dvipng").version != "1.16"): + cmd.insert(1, "--freetype0") + self._run_checked_subprocess(cmd, tex) return pngfile def get_grey(self, tex, fontsize=None, dpi=None): @@ -443,7 +451,7 @@ def get_text_width_height_descent(self, tex, fontsize, renderer=None): return width, height + depth, depth else: - # use dviread. It sometimes returns a wrong descent. + # use dviread. dvifile = self.make_dvi(tex, fontsize) with dviread.Dvi(dvifile, 72 * dpi_fraction) as dvi: page, = dvi From 746c691eb7db542bcb07a4ed8a38f6500a311956 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 28 Apr 2020 12:00:49 -0400 Subject: [PATCH 24/26] Merge pull request #17255 from anntzer/epsusetex FIX: eps + usetex combo. --- lib/matplotlib/texmanager.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/texmanager.py b/lib/matplotlib/texmanager.py index 4997a5300b47..5406980bf108 100644 --- a/lib/matplotlib/texmanager.py +++ b/lib/matplotlib/texmanager.py @@ -228,8 +228,11 @@ def make_tex(self, tex, fontsize): %s \pagestyle{empty} \begin{document} -%% The empty hbox ensures that a page is printed even for empty inputs. -\fontsize{%f}{%f}\hbox{}%s +%% The empty hbox ensures that a page is printed even for empty inputs, except +%% when using psfrag which gets confused by it. +\fontsize{%f}{%f}%% +\ifdefined\psfrag\else\hbox{}\fi%% +%s \end{document} """ % (self._get_preamble(), fontsize, fontsize * 1.25, tex) with open(texfile, 'wb') as fh: From 2046cde36058c433039496206f65aceb32488de7 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 29 Apr 2020 21:14:10 -0400 Subject: [PATCH 25/26] Backport PR #17261: avoid calling wx.Bitmap() if width or height is zero --- lib/matplotlib/backends/backend_wx.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index 1c7e0c7df7e6..d74646defd19 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -776,14 +776,14 @@ def _onSize(self, evt): # no change in size return self._width, self._height = size - # Create a new, correctly sized bitmap - self.bitmap = wx.Bitmap(self._width, self._height) - self._isDrawn = False if self._width <= 1 or self._height <= 1: return # Empty figure + # Create a new, correctly sized bitmap + self.bitmap = wx.Bitmap(self._width, self._height) + dpival = self.figure.dpi winch = self._width / dpival hinch = self._height / dpival From 5cdf7821828e795cfdd5656fa18a4d4a382c020c Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Thu, 30 Apr 2020 10:07:06 +0200 Subject: [PATCH 26/26] Backport PR #17271: MNT: do not try to import xml.etree.cElementTree --- examples/misc/svg_filter_line.py | 2 +- examples/misc/svg_filter_pie.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/misc/svg_filter_line.py b/examples/misc/svg_filter_line.py index dc098f5276f9..7796e2573f68 100644 --- a/examples/misc/svg_filter_line.py +++ b/examples/misc/svg_filter_line.py @@ -57,7 +57,7 @@ plt.savefig(f, format="svg") -import xml.etree.cElementTree as ET +import xml.etree.ElementTree as ET # filter definition for a gaussian blur filter_def = """ diff --git a/examples/misc/svg_filter_pie.py b/examples/misc/svg_filter_pie.py index bcc901028bd0..f217b023cfd8 100644 --- a/examples/misc/svg_filter_pie.py +++ b/examples/misc/svg_filter_pie.py @@ -46,7 +46,7 @@ f = BytesIO() plt.savefig(f, format="svg") -import xml.etree.cElementTree as ET +import xml.etree.ElementTree as ET # filter definition for shadow using a gaussian blur