From 52ac741787019e3f6511a5b0af494508e2a73bcc Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Sat, 17 Sep 2022 02:15:05 +0200 Subject: [PATCH 001/194] Backport PR #23912: FIX: only expect FigureCanvas on backend module if using new style --- lib/matplotlib/pyplot.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index f5c86de1260b..1e94d90d1534 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -263,7 +263,6 @@ def switch_backend(newbackend): backend_mod = importlib.import_module( cbook._backend_module_name(newbackend)) - canvas_class = backend_mod.FigureCanvas required_framework = _get_required_interactive_framework(backend_mod) if required_framework is not None: @@ -293,6 +292,8 @@ class backend_mod(matplotlib.backend_bases._Backend): # also update backend_mod accordingly; also, per-backend customization of # draw_if_interactive is disabled. if new_figure_manager is None: + # only try to get the canvas class if have opted into the new scheme + canvas_class = backend_mod.FigureCanvas def new_figure_manager_given_figure(num, figure): return canvas_class.new_manager(figure, num) From ab9e12cd1098694aedd6cb36a9dfb84c74720ea9 Mon Sep 17 00:00:00 2001 From: hannah Date: Sun, 18 Sep 2022 13:20:59 -0400 Subject: [PATCH 002/194] Backport PR #23929: DOC: add animation example to show animated subplots --- examples/animation/multiple_axes.py | 79 +++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 examples/animation/multiple_axes.py diff --git a/examples/animation/multiple_axes.py b/examples/animation/multiple_axes.py new file mode 100644 index 000000000000..1fdc545d480d --- /dev/null +++ b/examples/animation/multiple_axes.py @@ -0,0 +1,79 @@ +""" +======================= +Multiple axes animation +======================= + +This example showcases: + +- how animation across multiple subplots works, +- using a figure artist in the animation. +""" + +import numpy as np +import matplotlib.pyplot as plt +import matplotlib.animation as animation +from matplotlib.patches import ConnectionPatch + +fig, (axl, axr) = plt.subplots( + ncols=2, + sharey=True, + figsize=(6, 2), + gridspec_kw=dict(width_ratios=[1, 3], wspace=0), +) +axl.set_aspect(1) +axr.set_box_aspect(1 / 3) +axr.yaxis.set_visible(False) +axr.xaxis.set_ticks([0, np.pi, 2 * np.pi], ["0", r"$\pi$", r"$2\pi$"]) + +# draw circle with initial point in left Axes +x = np.linspace(0, 2 * np.pi, 50) +axl.plot(np.cos(x), np.sin(x), "k", lw=0.3) +point, = axl.plot(0, 0, "o") + +# draw full curve to set view limits in right Axes +sine, = axr.plot(x, np.sin(x)) + +# draw connecting line between both graphs +con = ConnectionPatch( + (1, 0), + (0, 0), + "data", + "data", + axesA=axl, + axesB=axr, + color="C0", + ls="dotted", +) +fig.add_artist(con) + + +def animate(i): + pos = np.cos(i), np.sin(i) + point.set_data(*pos) + x = np.linspace(0, i, int(i * 25 / np.pi)) + sine.set_data(x, np.sin(x)) + con.xy1 = pos + con.xy2 = i, pos[1] + return point, sine, con + + +ani = animation.FuncAnimation( + fig, + animate, + interval=50, + blit=False, # blitting can't be used with Figure artists + frames=x, + repeat_delay=100, +) + +plt.show() + +############################################################################# +# +# .. admonition:: References +# +# The use of the following functions, methods, classes and modules is shown +# in this example: +# +# - `matplotlib.patches.ConnectionPatch` +# - `matplotlib.animation.FuncAnimation` From e49b10c7eb6c1ead8ed91f9f16b789a5af1f5af1 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sun, 18 Sep 2022 22:39:38 +0200 Subject: [PATCH 003/194] Backport PR #23919: DOC: remove dead "Show Source" links --- doc/conf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 67514c2d4057..112d9fdaf22c 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -381,7 +381,8 @@ def js_tag_with_cache_busting(js): "logo": {"link": "index", "image_light": "images/logo2.svg", "image_dark": "images/logo_dark.svg"}, - "navbar_end": ["theme-switcher", "version-switcher", "mpl_icon_links"] + "navbar_end": ["theme-switcher", "version-switcher", "mpl_icon_links"], + "page_sidebar_items": "page-toc.html", } include_analytics = is_release_build if include_analytics: From 01f7b712c281b07d71905ae314474ed1fae9b3e3 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Mon, 19 Sep 2022 09:25:27 +0200 Subject: [PATCH 004/194] Backport PR #23941: consistent notation for minor/patch branches --- doc/devel/coding_guide.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index d3931b50fb53..cddb13539444 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -134,13 +134,13 @@ Milestones * Set the milestone according to these rules: * *New features and API changes* are milestoned for the next minor release - ``v3.X.0``. + ``v3.N.0``. * *Bugfixes and docstring changes* are milestoned for the next patch - release ``v3.X.Y`` + release ``v3.N.M`` * *Documentation changes* (all .rst files and examples) are milestoned - ``v3.X-doc`` + ``v3.N-doc`` If multiple rules apply, choose the first matching from the above list. From b92b6b9ebce3ecf8f283427542bf3414b7464072 Mon Sep 17 00:00:00 2001 From: hannah Date: Mon, 19 Sep 2022 09:32:24 -0400 Subject: [PATCH 005/194] Backport PR #23951: DOC: Make animation continuous --- examples/animation/dynamic_image.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/animation/dynamic_image.py b/examples/animation/dynamic_image.py index 5543da039639..cbec62607b2c 100644 --- a/examples/animation/dynamic_image.py +++ b/examples/animation/dynamic_image.py @@ -23,8 +23,8 @@ def f(x, y): # each frame ims = [] for i in range(60): - x += np.pi / 15. - y += np.pi / 20. + x += np.pi / 15 + y += np.pi / 30 im = ax.imshow(f(x, y), animated=True) if i == 0: ax.imshow(f(x, y)) # show an initial one first From eac65ff9cbdc29034246c4d5200f329b0191a1e3 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Mon, 19 Sep 2022 16:43:36 -0400 Subject: [PATCH 006/194] Backport PR #23947: Fix building on MINGW --- src/_tkagg.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/_tkagg.cpp b/src/_tkagg.cpp index bbca8e8d066c..663c06fd0474 100644 --- a/src/_tkagg.cpp +++ b/src/_tkagg.cpp @@ -231,13 +231,13 @@ bool load_tcl_tk(T lib) { // Try to fill Tcl/Tk global vars with function pointers. Return whether // all of them have been filled. - if (void* ptr = dlsym(lib, "Tcl_SetVar")) { + if (auto ptr = dlsym(lib, "Tcl_SetVar")) { TCL_SETVAR = (Tcl_SetVar_t)ptr; } - if (void* ptr = dlsym(lib, "Tk_FindPhoto")) { + if (auto ptr = dlsym(lib, "Tk_FindPhoto")) { TK_FIND_PHOTO = (Tk_FindPhoto_t)ptr; } - if (void* ptr = dlsym(lib, "Tk_PhotoPutBlock")) { + if (auto ptr = dlsym(lib, "Tk_PhotoPutBlock")) { TK_PHOTO_PUT_BLOCK = (Tk_PhotoPutBlock_t)ptr; } return TCL_SETVAR && TK_FIND_PHOTO && TK_PHOTO_PUT_BLOCK; From a186734892c53282ef684941fa3af7950d0addcd Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Tue, 20 Sep 2022 15:37:04 +0200 Subject: [PATCH 007/194] Backport PR #23957: Bump pypa/cibuildwheel from 2.9.0 to 2.10.1 --- .github/workflows/cibuildwheel.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/cibuildwheel.yml b/.github/workflows/cibuildwheel.yml index 27a5e3a6014d..64f345c3a3f4 100644 --- a/.github/workflows/cibuildwheel.yml +++ b/.github/workflows/cibuildwheel.yml @@ -53,7 +53,7 @@ jobs: fetch-depth: 0 - name: Build wheels for CPython 3.11 - uses: pypa/cibuildwheel@v2.9.0 + uses: pypa/cibuildwheel@v2.10.1 env: CIBW_BUILD: "cp311-*" CIBW_SKIP: "*-musllinux*" @@ -66,7 +66,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.10 - uses: pypa/cibuildwheel@v2.9.0 + uses: pypa/cibuildwheel@v2.10.1 env: CIBW_BUILD: "cp310-*" CIBW_SKIP: "*-musllinux*" @@ -79,7 +79,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.9 - uses: pypa/cibuildwheel@v2.9.0 + uses: pypa/cibuildwheel@v2.10.1 env: CIBW_BUILD: "cp39-*" CIBW_SKIP: "*-musllinux*" @@ -92,7 +92,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.8 - uses: pypa/cibuildwheel@v2.9.0 + uses: pypa/cibuildwheel@v2.10.1 env: CIBW_BUILD: "cp38-*" CIBW_SKIP: "*-musllinux*" @@ -105,7 +105,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for PyPy - uses: pypa/cibuildwheel@v2.9.0 + uses: pypa/cibuildwheel@v2.10.1 env: CIBW_BUILD: "pp38-* pp39-*" CIBW_SKIP: "*-musllinux*" From 899983cf2a118946624536426b8807a2517b6660 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 20 Sep 2022 10:37:41 -0400 Subject: [PATCH 008/194] Backport PR #23930: Fix edge color, links, wording; closes matplotlib/matplotlib#23895 --- examples/mplot3d/contour3d_3.py | 20 +++++++++----------- examples/mplot3d/contourf3d_2.py | 20 +++++++++----------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/examples/mplot3d/contour3d_3.py b/examples/mplot3d/contour3d_3.py index 4b8c5ed77d71..c6a599328697 100644 --- a/examples/mplot3d/contour3d_3.py +++ b/examples/mplot3d/contour3d_3.py @@ -1,30 +1,28 @@ """ -======================================== -Projecting contour profiles onto a graph -======================================== - +===================================== +Project contour profiles onto a graph +===================================== Demonstrates displaying a 3D surface while also projecting contour 'profiles' onto the 'walls' of the graph. - -See contourf3d_demo2 for the filled version. +See :doc:`contourf3d_2` for the filled version. """ from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt -from matplotlib import cm ax = plt.figure().add_subplot(projection='3d') X, Y, Z = axes3d.get_test_data(0.05) # Plot the 3D surface -ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3) +ax.plot_surface(X, Y, Z, edgecolor='royalblue', lw=0.5, rstride=8, cstride=8, + alpha=0.3) # Plot projections of the contours for each dimension. By choosing offsets # that match the appropriate axes limits, the projected contours will sit on # the 'walls' of the graph. -ax.contour(X, Y, Z, zdir='z', offset=-100, cmap=cm.coolwarm) -ax.contour(X, Y, Z, zdir='x', offset=-40, cmap=cm.coolwarm) -ax.contour(X, Y, Z, zdir='y', offset=40, cmap=cm.coolwarm) +ax.contour(X, Y, Z, zdir='z', offset=-100, cmap='coolwarm') +ax.contour(X, Y, Z, zdir='x', offset=-40, cmap='coolwarm') +ax.contour(X, Y, Z, zdir='y', offset=40, cmap='coolwarm') ax.set(xlim=(-40, 40), ylim=(-40, 40), zlim=(-100, 100), xlabel='X', ylabel='Y', zlabel='Z') diff --git a/examples/mplot3d/contourf3d_2.py b/examples/mplot3d/contourf3d_2.py index e550d0ee5933..d0cb6d4ab79c 100644 --- a/examples/mplot3d/contourf3d_2.py +++ b/examples/mplot3d/contourf3d_2.py @@ -1,30 +1,28 @@ """ -====================================== -Projecting filled contour onto a graph -====================================== - +=================================== +Project filled contour onto a graph +=================================== Demonstrates displaying a 3D surface while also projecting filled contour 'profiles' onto the 'walls' of the graph. - -See contour3d_demo2 for the unfilled version. +See :doc:`contour3d_3` for the unfilled version. """ from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt -from matplotlib import cm ax = plt.figure().add_subplot(projection='3d') X, Y, Z = axes3d.get_test_data(0.05) # Plot the 3D surface -ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3) +ax.plot_surface(X, Y, Z, edgecolor='royalblue', lw=0.5, rstride=8, cstride=8, + alpha=0.3) # Plot projections of the contours for each dimension. By choosing offsets # that match the appropriate axes limits, the projected contours will sit on # the 'walls' of the graph -ax.contourf(X, Y, Z, zdir='z', offset=-100, cmap=cm.coolwarm) -ax.contourf(X, Y, Z, zdir='x', offset=-40, cmap=cm.coolwarm) -ax.contourf(X, Y, Z, zdir='y', offset=40, cmap=cm.coolwarm) +ax.contourf(X, Y, Z, zdir='z', offset=-100, cmap='coolwarm') +ax.contourf(X, Y, Z, zdir='x', offset=-40, cmap='coolwarm') +ax.contourf(X, Y, Z, zdir='y', offset=40, cmap='coolwarm') ax.set(xlim=(-40, 40), ylim=(-40, 40), zlim=(-100, 100), xlabel='X', ylabel='Y', zlabel='Z') From 90b9497c5f966b198ae50f459a6bb180ea11f4b8 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Wed, 21 Sep 2022 00:18:00 +0200 Subject: [PATCH 009/194] Backport PR #23906: Edit mplot3d examples for correctness and consistency --- examples/mplot3d/2dcollections3d.py | 2 +- examples/mplot3d/contour3d.py | 6 +++--- examples/mplot3d/contour3d_2.py | 8 ++++---- examples/mplot3d/contourf3d.py | 8 ++++---- examples/mplot3d/hist3d.py | 2 +- examples/mplot3d/lines3d.py | 2 +- examples/mplot3d/lorenz_attractor.py | 2 +- examples/mplot3d/mixed_subplots.py | 6 +++--- examples/mplot3d/offset.py | 2 +- examples/mplot3d/rotate_axes3d_sgskip.py | 2 +- examples/mplot3d/surface3d.py | 4 ++-- examples/mplot3d/text3d.py | 8 ++++---- examples/mplot3d/trisurf3d_2.py | 2 +- examples/mplot3d/voxels_numpy_logo.py | 2 +- examples/mplot3d/voxels_rgb.py | 2 +- examples/mplot3d/wire3d_animation_sgskip.py | 6 +++--- examples/mplot3d/wire3d_zero_stride.py | 2 +- 17 files changed, 33 insertions(+), 33 deletions(-) diff --git a/examples/mplot3d/2dcollections3d.py b/examples/mplot3d/2dcollections3d.py index 5760d429775e..96183ddb9912 100644 --- a/examples/mplot3d/2dcollections3d.py +++ b/examples/mplot3d/2dcollections3d.py @@ -3,7 +3,7 @@ Plot 2D data on 3D plot ======================= -Demonstrates using ax.plot's zdir keyword to plot 2D data on +Demonstrates using ax.plot's *zdir* keyword to plot 2D data on selective axes of a 3D plot. """ diff --git a/examples/mplot3d/contour3d.py b/examples/mplot3d/contour3d.py index 2b0a2872d0cc..7b96980e3a73 100644 --- a/examples/mplot3d/contour3d.py +++ b/examples/mplot3d/contour3d.py @@ -1,7 +1,7 @@ """ -================================================== -Demonstrates plotting contour (level) curves in 3D -================================================== +================================= +Plot contour (level) curves in 3D +================================= This is like a contour plot in 2D except that the ``f(x, y)=c`` curve is plotted on the plane ``z=c``. diff --git a/examples/mplot3d/contour3d_2.py b/examples/mplot3d/contour3d_2.py index b6478bc79142..6dbc62eb9427 100644 --- a/examples/mplot3d/contour3d_2.py +++ b/examples/mplot3d/contour3d_2.py @@ -1,9 +1,9 @@ """ -============================================================================ -Demonstrates plotting contour (level) curves in 3D using the extend3d option -============================================================================ +=========================================================== +Plot contour (level) curves in 3D using the extend3d option +=========================================================== -This modification of the contour3d_demo example uses extend3d=True to +This modification of the :doc:`contour3d` example uses ``extend3d=True`` to extend the curves vertically into 'ribbons'. """ diff --git a/examples/mplot3d/contourf3d.py b/examples/mplot3d/contourf3d.py index c15ecdcfd6c0..6f0261ad0908 100644 --- a/examples/mplot3d/contourf3d.py +++ b/examples/mplot3d/contourf3d.py @@ -3,11 +3,11 @@ Filled contours =============== -contourf differs from contour in that it creates filled contours, ie. -a discrete number of colours are used to shade the domain. +`.Axes3D.contourf` differs from `.Axes3D.contour` in that it creates filled +contours, i.e. a discrete number of colours are used to shade the domain. -This is like a contourf plot in 2D except that the shaded region corresponding -to the level c is graphed on the plane z=c. +This is like a `.Axes.contourf` plot in 2D except that the shaded region +corresponding to the level c is graphed on the plane ``z=c``. """ from mpl_toolkits.mplot3d import axes3d diff --git a/examples/mplot3d/hist3d.py b/examples/mplot3d/hist3d.py index 6577a010c14a..e602f7f1e6c5 100644 --- a/examples/mplot3d/hist3d.py +++ b/examples/mplot3d/hist3d.py @@ -3,7 +3,7 @@ Create 3D histogram of 2D data ============================== -Demo of a histogram for 2 dimensional data as a bar graph in 3D. +Demo of a histogram for 2D data as a bar graph in 3D. """ import matplotlib.pyplot as plt diff --git a/examples/mplot3d/lines3d.py b/examples/mplot3d/lines3d.py index f7578d8657b4..c974bcbdff8d 100644 --- a/examples/mplot3d/lines3d.py +++ b/examples/mplot3d/lines3d.py @@ -1,6 +1,6 @@ """ ================ -Parametric Curve +Parametric curve ================ This example demonstrates plotting a parametric curve in 3D. diff --git a/examples/mplot3d/lorenz_attractor.py b/examples/mplot3d/lorenz_attractor.py index 7162c12d2dce..aad08a16439e 100644 --- a/examples/mplot3d/lorenz_attractor.py +++ b/examples/mplot3d/lorenz_attractor.py @@ -1,6 +1,6 @@ """ ================ -Lorenz Attractor +Lorenz attractor ================ This is an example of plotting Edward Lorenz's 1963 `"Deterministic Nonperiodic diff --git a/examples/mplot3d/mixed_subplots.py b/examples/mplot3d/mixed_subplots.py index df981ceee4ea..1ab91278a1d9 100644 --- a/examples/mplot3d/mixed_subplots.py +++ b/examples/mplot3d/mixed_subplots.py @@ -1,7 +1,7 @@ """ -================================= -2D and 3D *Axes* in same *Figure* -================================= +============================= +2D and 3D axes in same figure +============================= This example shows a how to plot a 2D and 3D plot on the same figure. """ diff --git a/examples/mplot3d/offset.py b/examples/mplot3d/offset.py index 56a14d69fa98..00adcc2f236d 100644 --- a/examples/mplot3d/offset.py +++ b/examples/mplot3d/offset.py @@ -1,6 +1,6 @@ """ ========================= -Automatic Text Offsetting +Automatic text offsetting ========================= This example demonstrates mplot3d's offset text display. diff --git a/examples/mplot3d/rotate_axes3d_sgskip.py b/examples/mplot3d/rotate_axes3d_sgskip.py index 8d27873c3b74..8967277ea5d7 100644 --- a/examples/mplot3d/rotate_axes3d_sgskip.py +++ b/examples/mplot3d/rotate_axes3d_sgskip.py @@ -3,7 +3,7 @@ Rotating a 3D plot ================== -A very simple animation of a rotating 3D plot about all 3 axes. +A very simple animation of a rotating 3D plot about all three axes. See :doc:`wire3d_animation_sgskip` for another example of animating a 3D plot. diff --git a/examples/mplot3d/surface3d.py b/examples/mplot3d/surface3d.py index 6a82631fc1ed..07019cb15e31 100644 --- a/examples/mplot3d/surface3d.py +++ b/examples/mplot3d/surface3d.py @@ -4,9 +4,9 @@ ===================== Demonstrates plotting a 3D surface colored with the coolwarm colormap. -The surface is made opaque by using antialiased=False. +The surface is made opaque by using ``antialiased=False``. -Also demonstrates using the LinearLocator and custom formatting for the +Also demonstrates using the `.LinearLocator` and custom formatting for the z axis tick labels. """ diff --git a/examples/mplot3d/text3d.py b/examples/mplot3d/text3d.py index 7f6a2858eb1f..922d161a9f89 100644 --- a/examples/mplot3d/text3d.py +++ b/examples/mplot3d/text3d.py @@ -7,10 +7,10 @@ Functionality shown: -- Using the text function with three types of 'zdir' values: None, an axis - name (ex. 'x'), or a direction tuple (ex. (1, 1, 0)). -- Using the text function with the color keyword. -- Using the text2D function to place text on a fixed position on the ax +- Using the `~.Axes3D.text` function with three types of *zdir* values: None, + an axis name (ex. 'x'), or a direction tuple (ex. (1, 1, 0)). +- Using the `~.Axes3D.text` function with the color keyword. +- Using the `.text2D` function to place text on a fixed position on the ax object. """ diff --git a/examples/mplot3d/trisurf3d_2.py b/examples/mplot3d/trisurf3d_2.py index 728698b7af69..8ed354d5e5e6 100644 --- a/examples/mplot3d/trisurf3d_2.py +++ b/examples/mplot3d/trisurf3d_2.py @@ -6,7 +6,7 @@ Two additional examples of plotting surfaces with triangular mesh. The first demonstrates use of plot_trisurf's triangles argument, and the -second sets a Triangulation object's mask and passes the object directly +second sets a `.Triangulation` object's mask and passes the object directly to plot_trisurf. """ diff --git a/examples/mplot3d/voxels_numpy_logo.py b/examples/mplot3d/voxels_numpy_logo.py index 8b790d073988..34eb48dcbe8a 100644 --- a/examples/mplot3d/voxels_numpy_logo.py +++ b/examples/mplot3d/voxels_numpy_logo.py @@ -1,6 +1,6 @@ """ =============================== -3D voxel plot of the numpy logo +3D voxel plot of the NumPy logo =============================== Demonstrates using `.Axes3D.voxels` with uneven coordinates. diff --git a/examples/mplot3d/voxels_rgb.py b/examples/mplot3d/voxels_rgb.py index 31bfcbca15a9..da27ad11f752 100644 --- a/examples/mplot3d/voxels_rgb.py +++ b/examples/mplot3d/voxels_rgb.py @@ -1,6 +1,6 @@ """ ========================================== -3D voxel / volumetric plot with rgb colors +3D voxel / volumetric plot with RGB colors ========================================== Demonstrates using `.Axes3D.voxels` to visualize parts of a color space. diff --git a/examples/mplot3d/wire3d_animation_sgskip.py b/examples/mplot3d/wire3d_animation_sgskip.py index b4f681e778f5..bfc76661ffd0 100644 --- a/examples/mplot3d/wire3d_animation_sgskip.py +++ b/examples/mplot3d/wire3d_animation_sgskip.py @@ -1,7 +1,7 @@ """ -============================= -Animating a 3D wireframe plot -============================= +=========================== +Animate a 3D wireframe plot +=========================== A very simple "animation" of a 3D plot. See also :doc:`rotate_axes3d_sgskip`. diff --git a/examples/mplot3d/wire3d_zero_stride.py b/examples/mplot3d/wire3d_zero_stride.py index 1ba406b753f4..f4c679300820 100644 --- a/examples/mplot3d/wire3d_zero_stride.py +++ b/examples/mplot3d/wire3d_zero_stride.py @@ -3,7 +3,7 @@ 3D wireframe plots in one direction =================================== -Demonstrates that setting rstride or cstride to 0 causes wires to not be +Demonstrates that setting *rstride* or *cstride* to 0 causes wires to not be generated in the corresponding direction. """ From 97ff8a9761af6ca4fbfc777c3a649062f354fdda Mon Sep 17 00:00:00 2001 From: hannah Date: Wed, 21 Sep 2022 13:22:36 -0400 Subject: [PATCH 010/194] Backport PR #23975: Reword docstring of reset_position. --- lib/matplotlib/axes/_base.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index ebe1ef7911d4..4f805e017741 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -1108,8 +1108,9 @@ def reset_position(self): """ Reset the active position to the original position. - This resets the possible position change due to aspect constraints. - For an explanation of the positions see `.set_position`. + This undoes changes to the active position (as defined in + `.set_position`) which may have been performed to satisfy fixed-aspect + constraints. """ for ax in self._twinned_axes.get_siblings(self): pos = ax.get_position(original=True) From 1455f9f0ee70f886a00fe335d7f7da4bbf001184 Mon Sep 17 00:00:00 2001 From: hannah Date: Wed, 21 Sep 2022 17:53:56 -0400 Subject: [PATCH 011/194] Backport PR #23980: DOC: Move Quick Start Tutorial to first position --- doc/sphinxext/gallery_order.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/sphinxext/gallery_order.py b/doc/sphinxext/gallery_order.py index 589fed453f06..62b7803d0f8b 100644 --- a/doc/sphinxext/gallery_order.py +++ b/doc/sphinxext/gallery_order.py @@ -50,9 +50,9 @@ def __call__(self, item): list_all = [ # **Tutorials** # introductory - "usage", "pyplot", "sample_plots", "images", "lifecycle", "customizing", + "quick_start", "pyplot", "images", "lifecycle", "customizing", # intermediate - "artists", "legend_guide", "color_cycle", "gridspec", + "artists", "legend_guide", "color_cycle", "constrainedlayout_guide", "tight_layout_guide", # advanced # text From ef349f3db751c2b7de05e35e36f4f1caf291b55a Mon Sep 17 00:00:00 2001 From: hannah Date: Wed, 21 Sep 2022 17:53:56 -0400 Subject: [PATCH 012/194] Backport PR #23980: DOC: Move Quick Start Tutorial to first position --- doc/sphinxext/gallery_order.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/sphinxext/gallery_order.py b/doc/sphinxext/gallery_order.py index 589fed453f06..62b7803d0f8b 100644 --- a/doc/sphinxext/gallery_order.py +++ b/doc/sphinxext/gallery_order.py @@ -50,9 +50,9 @@ def __call__(self, item): list_all = [ # **Tutorials** # introductory - "usage", "pyplot", "sample_plots", "images", "lifecycle", "customizing", + "quick_start", "pyplot", "images", "lifecycle", "customizing", # intermediate - "artists", "legend_guide", "color_cycle", "gridspec", + "artists", "legend_guide", "color_cycle", "constrainedlayout_guide", "tight_layout_guide", # advanced # text From 27523ad39c121ddc3b234b66aec8c6241b37d991 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Thu, 22 Sep 2022 19:50:15 -0700 Subject: [PATCH 013/194] Backport PR #23987: FIX: do not set constrained layout on false-y values --- lib/matplotlib/figure.py | 5 ++++- lib/matplotlib/tests/test_constrainedlayout.py | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 5bbb786984d2..447f508194a1 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -2426,9 +2426,12 @@ def __init__(self, if isinstance(tight_layout, dict): self.get_layout_engine().set(**tight_layout) elif constrained_layout is not None: - self.set_layout_engine(layout='constrained') if isinstance(constrained_layout, dict): + self.set_layout_engine(layout='constrained') self.get_layout_engine().set(**constrained_layout) + elif constrained_layout: + self.set_layout_engine(layout='constrained') + else: # everything is None, so use default: self.set_layout_engine(layout=layout) diff --git a/lib/matplotlib/tests/test_constrainedlayout.py b/lib/matplotlib/tests/test_constrainedlayout.py index 35eb850fcd70..64906b74c3ff 100644 --- a/lib/matplotlib/tests/test_constrainedlayout.py +++ b/lib/matplotlib/tests/test_constrainedlayout.py @@ -656,3 +656,14 @@ def test_compressed1(): pos = axs[1, 2].get_position() np.testing.assert_allclose(pos.x1, 0.8618, atol=1e-3) np.testing.assert_allclose(pos.y0, 0.1934, atol=1e-3) + + +@pytest.mark.parametrize('arg, state', [ + (True, True), + (False, False), + ({}, True), + ({'rect': None}, True) +]) +def test_set_constrained_layout(arg, state): + fig, ax = plt.subplots(constrained_layout=arg) + assert fig.get_constrained_layout() is state From c6339567de1cbe1a75e97020ef93388364b0261b Mon Sep 17 00:00:00 2001 From: erykoff Date: Thu, 22 Sep 2022 21:39:13 -0700 Subject: [PATCH 014/194] Backport PR #23944: FIX: ValueError when hexbin is run with empty arrays and log scaling. --- lib/matplotlib/axes/_axes.py | 4 +++- lib/matplotlib/tests/test_axes.py | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 6327dde85276..c578765bfa1c 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -4927,7 +4927,9 @@ def reduce_C_function(C: array) -> float # autoscale the norm with current accum values if it hasn't been set if norm is not None: if norm.vmin is None and norm.vmax is None: - norm.autoscale(accum) + norm.autoscale_None(accum) + norm.vmin = np.ma.masked if norm.vmin is None else norm.vmin + norm.vmax = np.ma.masked if norm.vmax is None else norm.vmax if bins is not None: if not np.iterable(bins): diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 628f9542aa42..b35b3feacf18 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -901,6 +901,14 @@ def test_hexbin_empty(): ax.hexbin([], []) +@image_comparison(['hexbin_empty.png'], remove_text=True) +def test_hexbin_log_empty(): + # From #23922: creating hexbin with log scaling from empty + # dataset raises ValueError + ax = plt.gca() + ax.hexbin([], [], bins='log') + + def test_hexbin_pickable(): # From #1973: Test that picking a hexbin collection works fig, ax = plt.subplots() From e9226ecca10638f39144b820d0d0e0c1bef6bb2d Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Fri, 23 Sep 2022 02:45:08 -0400 Subject: [PATCH 015/194] Backport PR #23978: DOC: Suppress IPython output in examples and tutorials where not needed --- doc/conf.py | 1 + tutorials/intermediate/artists.py | 1 + tutorials/intermediate/autoscale.py | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 112d9fdaf22c..5aa58a3aca5a 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -198,6 +198,7 @@ def matplotlib_reduced_latex_scraper(block, block_vars, gallery_conf, 'subsection_order': gallery_order.sectionorder, 'thumbnail_size': (320, 224), 'within_subsection_order': gallery_order.subsectionorder, + 'capture_repr': (), } mathmpl_fontsize = 11.0 diff --git a/tutorials/intermediate/artists.py b/tutorials/intermediate/artists.py index f76c62d8462c..22793ddd5fd0 100644 --- a/tutorials/intermediate/artists.py +++ b/tutorials/intermediate/artists.py @@ -115,6 +115,7 @@ class in the Matplotlib API, and the one you will be working with most Try creating the figure below. """ +# sphinx_gallery_capture_repr = ('__repr__',) import numpy as np import matplotlib.pyplot as plt diff --git a/tutorials/intermediate/autoscale.py b/tutorials/intermediate/autoscale.py index 0f4dda87d183..3b563510aa1f 100644 --- a/tutorials/intermediate/autoscale.py +++ b/tutorials/intermediate/autoscale.py @@ -26,7 +26,7 @@ # ------- # The default margin around the data limits is 5%: -ax.margins() +print(ax.margins()) ############################################################################### # The margins can be made larger using `~matplotlib.axes.Axes.margins`: From 0524e4caeed0dfc5c7889043b4e5d29c3624f844 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 24 Sep 2022 04:55:18 -0400 Subject: [PATCH 016/194] Backport PR #23964: Fix issue with empty line in ps backend --- lib/matplotlib/backends/backend_ps.py | 5 +++-- lib/matplotlib/tests/test_backend_ps.py | 9 +++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index f209e811f18b..67829c216f9a 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -665,8 +665,9 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath=False, mtext=None): curr_stream[1].append( (item.x, item.ft_object.get_glyph_name(item.glyph_idx)) ) - # append the last entry - stream.append(curr_stream) + # append the last entry if exists + if curr_stream: + stream.append(curr_stream) self.set_color(*gc.get_rgb()) diff --git a/lib/matplotlib/tests/test_backend_ps.py b/lib/matplotlib/tests/test_backend_ps.py index a3a5a52e7977..a151dc4c4c90 100644 --- a/lib/matplotlib/tests/test_backend_ps.py +++ b/lib/matplotlib/tests/test_backend_ps.py @@ -254,6 +254,15 @@ def test_linedash(): assert buf.tell() > 0 +def test_empty_line(): + # Smoke-test for gh#23954 + figure = Figure() + figure.text(0.5, 0.5, "\nfoo\n\n") + buf = io.BytesIO() + figure.savefig(buf, format='eps') + figure.savefig(buf, format='ps') + + def test_no_duplicate_definition(): fig = Figure() From f5e6927586e2b67ccbd45e24c71d56c67ddb5820 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sun, 25 Sep 2022 21:28:35 +0200 Subject: [PATCH 017/194] Backport PR #24004: Increase consistency in tutorials and examples --- examples/color/color_demo.py | 4 ++-- examples/color/custom_cmap.py | 2 +- examples/lines_bars_and_markers/cohere.py | 6 +++--- examples/lines_bars_and_markers/csd_demo.py | 2 +- examples/pyplots/fig_axes_labels_simple.py | 6 +++--- examples/pyplots/pyplot_mathtext.py | 4 ++-- tutorials/advanced/path_tutorial.py | 16 ++++++++-------- tutorials/intermediate/artists.py | 6 +++--- .../intermediate/constrainedlayout_guide.py | 2 +- tutorials/introductory/pyplot.py | 6 ++++-- tutorials/text/text_intro.py | 12 ++++++------ 11 files changed, 34 insertions(+), 32 deletions(-) diff --git a/examples/color/color_demo.py b/examples/color/color_demo.py index f46f52507352..8a161442184b 100644 --- a/examples/color/color_demo.py +++ b/examples/color/color_demo.py @@ -48,9 +48,9 @@ # 3) gray level string: ax.set_title('Voltage vs. time chart', color='0.7') # 4) single letter color string -ax.set_xlabel('time (s)', color='c') +ax.set_xlabel('Time [s]', color='c') # 5) a named color: -ax.set_ylabel('voltage (mV)', color='peachpuff') +ax.set_ylabel('Voltage [mV]', color='peachpuff') # 6) a named xkcd color: ax.plot(t, s, 'xkcd:crimson') # 7) Cn notation: diff --git a/examples/color/custom_cmap.py b/examples/color/custom_cmap.py index 21354fc3fd93..a99127d972e6 100644 --- a/examples/color/custom_cmap.py +++ b/examples/color/custom_cmap.py @@ -42,7 +42,7 @@ If, as in this example, there are no discontinuities in the r, g, and b components, then it is quite simple: the second and third element of -each tuple, above, is the same--call it "``y``". The first element ("``x``") +each tuple, above, is the same -- call it "``y``". The first element ("``x``") defines interpolation intervals over the full range of 0 to 1, and it must span that whole range. In other words, the values of ``x`` divide the 0-to-1 range into a set of segments, and ``y`` gives the end-point color diff --git a/examples/lines_bars_and_markers/cohere.py b/examples/lines_bars_and_markers/cohere.py index 370149695398..7881a0a31b1e 100644 --- a/examples/lines_bars_and_markers/cohere.py +++ b/examples/lines_bars_and_markers/cohere.py @@ -16,19 +16,19 @@ nse1 = np.random.randn(len(t)) # white noise 1 nse2 = np.random.randn(len(t)) # white noise 2 -# Two signals with a coherent part at 10Hz and a random part +# Two signals with a coherent part at 10 Hz and a random part s1 = np.sin(2 * np.pi * 10 * t) + nse1 s2 = np.sin(2 * np.pi * 10 * t) + nse2 fig, axs = plt.subplots(2, 1) axs[0].plot(t, s1, t, s2) axs[0].set_xlim(0, 2) -axs[0].set_xlabel('time') +axs[0].set_xlabel('Time') axs[0].set_ylabel('s1 and s2') axs[0].grid(True) cxy, f = axs[1].cohere(s1, s2, 256, 1. / dt) -axs[1].set_ylabel('coherence') +axs[1].set_ylabel('Coherence') fig.tight_layout() plt.show() diff --git a/examples/lines_bars_and_markers/csd_demo.py b/examples/lines_bars_and_markers/csd_demo.py index d4d1e1d7a967..8894333f94d0 100644 --- a/examples/lines_bars_and_markers/csd_demo.py +++ b/examples/lines_bars_and_markers/csd_demo.py @@ -33,7 +33,7 @@ ax1.plot(t, s1, t, s2) ax1.set_xlim(0, 5) -ax1.set_xlabel('time') +ax1.set_xlabel('Time') ax1.set_ylabel('s1 and s2') ax1.grid(True) diff --git a/examples/pyplots/fig_axes_labels_simple.py b/examples/pyplots/fig_axes_labels_simple.py index 41423b0b4845..353f09477dfd 100644 --- a/examples/pyplots/fig_axes_labels_simple.py +++ b/examples/pyplots/fig_axes_labels_simple.py @@ -11,8 +11,8 @@ fig = plt.figure() fig.subplots_adjust(top=0.8) ax1 = fig.add_subplot(211) -ax1.set_ylabel('volts') -ax1.set_title('a sine wave') +ax1.set_ylabel('Voltage [V]') +ax1.set_title('A sine wave') t = np.arange(0.0, 1.0, 0.01) s = np.sin(2 * np.pi * t) @@ -23,7 +23,7 @@ ax2 = fig.add_axes([0.15, 0.1, 0.7, 0.3]) n, bins, patches = ax2.hist(np.random.randn(1000), 50) -ax2.set_xlabel('time (s)') +ax2.set_xlabel('Time [s]') plt.show() diff --git a/examples/pyplots/pyplot_mathtext.py b/examples/pyplots/pyplot_mathtext.py index af4db39a4e95..a62dd6d95da0 100644 --- a/examples/pyplots/pyplot_mathtext.py +++ b/examples/pyplots/pyplot_mathtext.py @@ -16,8 +16,8 @@ plt.text(1, -0.6, r'$\sum_{i=0}^\infty x_i$', fontsize=20) plt.text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$', fontsize=20) -plt.xlabel('time (s)') -plt.ylabel('volts (mV)') +plt.xlabel('Time [s]') +plt.ylabel('Voltage [mV]') plt.show() ############################################################################# diff --git a/tutorials/advanced/path_tutorial.py b/tutorials/advanced/path_tutorial.py index 19632ce42964..70bb5998cecb 100644 --- a/tutorials/advanced/path_tutorial.py +++ b/tutorials/advanced/path_tutorial.py @@ -76,11 +76,11 @@ # ============== # # Some of the path components require multiple vertices to specify them: -# for example CURVE 3 is a `bézier +# for example CURVE 3 is a `Bézier # `_ curve with one # control point and one end point, and CURVE4 has three vertices for the # two control points and the end point. The example below shows a -# CURVE4 Bézier spline -- the bézier curve will be contained in the +# CURVE4 Bézier spline -- the Bézier curve will be contained in the # convex hull of the start point, the two control points, and the end # point @@ -139,8 +139,8 @@ # for each histogram bar: the rectangle width is the bin width and the # rectangle height is the number of datapoints in that bin. First we'll # create some random normally distributed data and compute the -# histogram. Because numpy returns the bin edges and not centers, the -# length of ``bins`` is 1 greater than the length of ``n`` in the +# histogram. Because NumPy returns the bin edges and not centers, the +# length of ``bins`` is one greater than the length of ``n`` in the # example below:: # # # histogram our data with numpy @@ -159,10 +159,10 @@ # # Now we have to construct our compound path, which will consist of a # series of ``MOVETO``, ``LINETO`` and ``CLOSEPOLY`` for each rectangle. -# For each rectangle, we need 5 vertices: 1 for the ``MOVETO``, 3 for -# the ``LINETO``, and 1 for the ``CLOSEPOLY``. As indicated in the -# table above, the vertex for the closepoly is ignored but we still need -# it to keep the codes aligned with the vertices:: +# For each rectangle, we need five vertices: one for the ``MOVETO``, +# three for the ``LINETO``, and one for the ``CLOSEPOLY``. As indicated +# in the table above, the vertex for the closepoly is ignored but we still +# need it to keep the codes aligned with the vertices:: # # nverts = nrects*(1+3+1) # verts = np.zeros((nverts, 2)) diff --git a/tutorials/intermediate/artists.py b/tutorials/intermediate/artists.py index 22793ddd5fd0..e2cf55fd5992 100644 --- a/tutorials/intermediate/artists.py +++ b/tutorials/intermediate/artists.py @@ -123,8 +123,8 @@ class in the Matplotlib API, and the one you will be working with most fig = plt.figure() fig.subplots_adjust(top=0.8) ax1 = fig.add_subplot(211) -ax1.set_ylabel('volts') -ax1.set_title('a sine wave') +ax1.set_ylabel('Voltage [V]') +ax1.set_title('A sine wave') t = np.arange(0.0, 1.0, 0.01) s = np.sin(2*np.pi*t) @@ -136,7 +136,7 @@ class in the Matplotlib API, and the one you will be working with most ax2 = fig.add_axes([0.15, 0.1, 0.7, 0.3]) n, bins, patches = ax2.hist(np.random.randn(1000), 50, facecolor='yellow', edgecolor='yellow') -ax2.set_xlabel('time (s)') +ax2.set_xlabel('Time [s]') plt.show() diff --git a/tutorials/intermediate/constrainedlayout_guide.py b/tutorials/intermediate/constrainedlayout_guide.py index 84cbf8c0447f..3734df1bd5d6 100644 --- a/tutorials/intermediate/constrainedlayout_guide.py +++ b/tutorials/intermediate/constrainedlayout_guide.py @@ -263,7 +263,7 @@ def example_plot(ax, fontsize=12, hide_labels=False): ########################################## # If there are more than two columns, the *wspace* is shared between them, -# so here the wspace is divided in 2, with a *wspace* of 0.1 between each +# so here the wspace is divided in two, with a *wspace* of 0.1 between each # column: fig, axs = plt.subplots(2, 3, layout="constrained") diff --git a/tutorials/introductory/pyplot.py b/tutorials/introductory/pyplot.py index ebe49df9d3b0..9b15a956efb8 100644 --- a/tutorials/introductory/pyplot.py +++ b/tutorials/introductory/pyplot.py @@ -295,8 +295,10 @@ def f(t): # plt.figure(2) # a second figure # plt.plot([4, 5, 6]) # creates a subplot() by default # -# plt.figure(1) # figure 1 current; subplot(212) still current -# plt.subplot(211) # make subplot(211) in figure1 current +# plt.figure(1) # first figure current; +# # subplot(212) still current +# plt.subplot(211) # make subplot(211) in the first figure +# # current # plt.title('Easy as 1, 2, 3') # subplot 211 title # # You can clear the current figure with `~.pyplot.clf` diff --git a/tutorials/text/text_intro.py b/tutorials/text/text_intro.py index a32ddc800d10..1b0e60a37ab1 100644 --- a/tutorials/text/text_intro.py +++ b/tutorials/text/text_intro.py @@ -118,7 +118,7 @@ fig, ax = plt.subplots(figsize=(5, 3)) fig.subplots_adjust(bottom=0.15, left=0.2) ax.plot(x1, y1) -ax.set_xlabel('time [s]') +ax.set_xlabel('Time [s]') ax.set_ylabel('Damped oscillation [V]') plt.show() @@ -131,7 +131,7 @@ fig, ax = plt.subplots(figsize=(5, 3)) fig.subplots_adjust(bottom=0.15, left=0.2) ax.plot(x1, y1*10000) -ax.set_xlabel('time [s]') +ax.set_xlabel('Time [s]') ax.set_ylabel('Damped oscillation [V]') plt.show() @@ -144,7 +144,7 @@ fig, ax = plt.subplots(figsize=(5, 3)) fig.subplots_adjust(bottom=0.15, left=0.2) ax.plot(x1, y1*10000) -ax.set_xlabel('time [s]') +ax.set_xlabel('Time [s]') ax.set_ylabel('Damped oscillation [V]', labelpad=18) plt.show() @@ -159,7 +159,7 @@ fig, ax = plt.subplots(figsize=(5, 3)) fig.subplots_adjust(bottom=0.15, left=0.2) ax.plot(x1, y1) -ax.set_xlabel('time [s]', position=(0., 1e6), horizontalalignment='left') +ax.set_xlabel('Time [s]', position=(0., 1e6), horizontalalignment='left') ax.set_ylabel('Damped oscillation [V]') plt.show() @@ -179,7 +179,7 @@ fig, ax = plt.subplots(figsize=(5, 3)) fig.subplots_adjust(bottom=0.15, left=0.2) ax.plot(x1, y1) -ax.set_xlabel('time [s]', fontsize='large', fontweight='bold') +ax.set_xlabel('Time [s]', fontsize='large', fontweight='bold') ax.set_ylabel('Damped oscillation [V]', fontproperties=font) plt.show() @@ -191,7 +191,7 @@ fig, ax = plt.subplots(figsize=(5, 3)) fig.subplots_adjust(bottom=0.2, left=0.2) ax.plot(x1, np.cumsum(y1**2)) -ax.set_xlabel('time [s] \n This was a long experiment') +ax.set_xlabel('Time [s] \n This was a long experiment') ax.set_ylabel(r'$\int\ Y^2\ dt\ \ [V^2 s]$') plt.show() From 4a6c18166fe206f372d5012fc1642d199a5c82c9 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sun, 25 Sep 2022 21:28:35 +0200 Subject: [PATCH 018/194] Backport PR #24004: Increase consistency in tutorials and examples --- examples/color/color_demo.py | 4 ++-- examples/color/custom_cmap.py | 2 +- examples/lines_bars_and_markers/cohere.py | 6 +++--- examples/lines_bars_and_markers/csd_demo.py | 2 +- examples/pyplots/fig_axes_labels_simple.py | 6 +++--- examples/pyplots/pyplot_mathtext.py | 4 ++-- tutorials/advanced/path_tutorial.py | 16 ++++++++-------- tutorials/intermediate/artists.py | 6 +++--- .../intermediate/constrainedlayout_guide.py | 2 +- tutorials/introductory/pyplot.py | 6 ++++-- tutorials/text/text_intro.py | 12 ++++++------ 11 files changed, 34 insertions(+), 32 deletions(-) diff --git a/examples/color/color_demo.py b/examples/color/color_demo.py index f46f52507352..8a161442184b 100644 --- a/examples/color/color_demo.py +++ b/examples/color/color_demo.py @@ -48,9 +48,9 @@ # 3) gray level string: ax.set_title('Voltage vs. time chart', color='0.7') # 4) single letter color string -ax.set_xlabel('time (s)', color='c') +ax.set_xlabel('Time [s]', color='c') # 5) a named color: -ax.set_ylabel('voltage (mV)', color='peachpuff') +ax.set_ylabel('Voltage [mV]', color='peachpuff') # 6) a named xkcd color: ax.plot(t, s, 'xkcd:crimson') # 7) Cn notation: diff --git a/examples/color/custom_cmap.py b/examples/color/custom_cmap.py index 21354fc3fd93..a99127d972e6 100644 --- a/examples/color/custom_cmap.py +++ b/examples/color/custom_cmap.py @@ -42,7 +42,7 @@ If, as in this example, there are no discontinuities in the r, g, and b components, then it is quite simple: the second and third element of -each tuple, above, is the same--call it "``y``". The first element ("``x``") +each tuple, above, is the same -- call it "``y``". The first element ("``x``") defines interpolation intervals over the full range of 0 to 1, and it must span that whole range. In other words, the values of ``x`` divide the 0-to-1 range into a set of segments, and ``y`` gives the end-point color diff --git a/examples/lines_bars_and_markers/cohere.py b/examples/lines_bars_and_markers/cohere.py index 370149695398..7881a0a31b1e 100644 --- a/examples/lines_bars_and_markers/cohere.py +++ b/examples/lines_bars_and_markers/cohere.py @@ -16,19 +16,19 @@ nse1 = np.random.randn(len(t)) # white noise 1 nse2 = np.random.randn(len(t)) # white noise 2 -# Two signals with a coherent part at 10Hz and a random part +# Two signals with a coherent part at 10 Hz and a random part s1 = np.sin(2 * np.pi * 10 * t) + nse1 s2 = np.sin(2 * np.pi * 10 * t) + nse2 fig, axs = plt.subplots(2, 1) axs[0].plot(t, s1, t, s2) axs[0].set_xlim(0, 2) -axs[0].set_xlabel('time') +axs[0].set_xlabel('Time') axs[0].set_ylabel('s1 and s2') axs[0].grid(True) cxy, f = axs[1].cohere(s1, s2, 256, 1. / dt) -axs[1].set_ylabel('coherence') +axs[1].set_ylabel('Coherence') fig.tight_layout() plt.show() diff --git a/examples/lines_bars_and_markers/csd_demo.py b/examples/lines_bars_and_markers/csd_demo.py index d4d1e1d7a967..8894333f94d0 100644 --- a/examples/lines_bars_and_markers/csd_demo.py +++ b/examples/lines_bars_and_markers/csd_demo.py @@ -33,7 +33,7 @@ ax1.plot(t, s1, t, s2) ax1.set_xlim(0, 5) -ax1.set_xlabel('time') +ax1.set_xlabel('Time') ax1.set_ylabel('s1 and s2') ax1.grid(True) diff --git a/examples/pyplots/fig_axes_labels_simple.py b/examples/pyplots/fig_axes_labels_simple.py index 41423b0b4845..353f09477dfd 100644 --- a/examples/pyplots/fig_axes_labels_simple.py +++ b/examples/pyplots/fig_axes_labels_simple.py @@ -11,8 +11,8 @@ fig = plt.figure() fig.subplots_adjust(top=0.8) ax1 = fig.add_subplot(211) -ax1.set_ylabel('volts') -ax1.set_title('a sine wave') +ax1.set_ylabel('Voltage [V]') +ax1.set_title('A sine wave') t = np.arange(0.0, 1.0, 0.01) s = np.sin(2 * np.pi * t) @@ -23,7 +23,7 @@ ax2 = fig.add_axes([0.15, 0.1, 0.7, 0.3]) n, bins, patches = ax2.hist(np.random.randn(1000), 50) -ax2.set_xlabel('time (s)') +ax2.set_xlabel('Time [s]') plt.show() diff --git a/examples/pyplots/pyplot_mathtext.py b/examples/pyplots/pyplot_mathtext.py index af4db39a4e95..a62dd6d95da0 100644 --- a/examples/pyplots/pyplot_mathtext.py +++ b/examples/pyplots/pyplot_mathtext.py @@ -16,8 +16,8 @@ plt.text(1, -0.6, r'$\sum_{i=0}^\infty x_i$', fontsize=20) plt.text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$', fontsize=20) -plt.xlabel('time (s)') -plt.ylabel('volts (mV)') +plt.xlabel('Time [s]') +plt.ylabel('Voltage [mV]') plt.show() ############################################################################# diff --git a/tutorials/advanced/path_tutorial.py b/tutorials/advanced/path_tutorial.py index 19632ce42964..70bb5998cecb 100644 --- a/tutorials/advanced/path_tutorial.py +++ b/tutorials/advanced/path_tutorial.py @@ -76,11 +76,11 @@ # ============== # # Some of the path components require multiple vertices to specify them: -# for example CURVE 3 is a `bézier +# for example CURVE 3 is a `Bézier # `_ curve with one # control point and one end point, and CURVE4 has three vertices for the # two control points and the end point. The example below shows a -# CURVE4 Bézier spline -- the bézier curve will be contained in the +# CURVE4 Bézier spline -- the Bézier curve will be contained in the # convex hull of the start point, the two control points, and the end # point @@ -139,8 +139,8 @@ # for each histogram bar: the rectangle width is the bin width and the # rectangle height is the number of datapoints in that bin. First we'll # create some random normally distributed data and compute the -# histogram. Because numpy returns the bin edges and not centers, the -# length of ``bins`` is 1 greater than the length of ``n`` in the +# histogram. Because NumPy returns the bin edges and not centers, the +# length of ``bins`` is one greater than the length of ``n`` in the # example below:: # # # histogram our data with numpy @@ -159,10 +159,10 @@ # # Now we have to construct our compound path, which will consist of a # series of ``MOVETO``, ``LINETO`` and ``CLOSEPOLY`` for each rectangle. -# For each rectangle, we need 5 vertices: 1 for the ``MOVETO``, 3 for -# the ``LINETO``, and 1 for the ``CLOSEPOLY``. As indicated in the -# table above, the vertex for the closepoly is ignored but we still need -# it to keep the codes aligned with the vertices:: +# For each rectangle, we need five vertices: one for the ``MOVETO``, +# three for the ``LINETO``, and one for the ``CLOSEPOLY``. As indicated +# in the table above, the vertex for the closepoly is ignored but we still +# need it to keep the codes aligned with the vertices:: # # nverts = nrects*(1+3+1) # verts = np.zeros((nverts, 2)) diff --git a/tutorials/intermediate/artists.py b/tutorials/intermediate/artists.py index f76c62d8462c..096a6757515c 100644 --- a/tutorials/intermediate/artists.py +++ b/tutorials/intermediate/artists.py @@ -122,8 +122,8 @@ class in the Matplotlib API, and the one you will be working with most fig = plt.figure() fig.subplots_adjust(top=0.8) ax1 = fig.add_subplot(211) -ax1.set_ylabel('volts') -ax1.set_title('a sine wave') +ax1.set_ylabel('Voltage [V]') +ax1.set_title('A sine wave') t = np.arange(0.0, 1.0, 0.01) s = np.sin(2*np.pi*t) @@ -135,7 +135,7 @@ class in the Matplotlib API, and the one you will be working with most ax2 = fig.add_axes([0.15, 0.1, 0.7, 0.3]) n, bins, patches = ax2.hist(np.random.randn(1000), 50, facecolor='yellow', edgecolor='yellow') -ax2.set_xlabel('time (s)') +ax2.set_xlabel('Time [s]') plt.show() diff --git a/tutorials/intermediate/constrainedlayout_guide.py b/tutorials/intermediate/constrainedlayout_guide.py index 84cbf8c0447f..3734df1bd5d6 100644 --- a/tutorials/intermediate/constrainedlayout_guide.py +++ b/tutorials/intermediate/constrainedlayout_guide.py @@ -263,7 +263,7 @@ def example_plot(ax, fontsize=12, hide_labels=False): ########################################## # If there are more than two columns, the *wspace* is shared between them, -# so here the wspace is divided in 2, with a *wspace* of 0.1 between each +# so here the wspace is divided in two, with a *wspace* of 0.1 between each # column: fig, axs = plt.subplots(2, 3, layout="constrained") diff --git a/tutorials/introductory/pyplot.py b/tutorials/introductory/pyplot.py index ebe49df9d3b0..9b15a956efb8 100644 --- a/tutorials/introductory/pyplot.py +++ b/tutorials/introductory/pyplot.py @@ -295,8 +295,10 @@ def f(t): # plt.figure(2) # a second figure # plt.plot([4, 5, 6]) # creates a subplot() by default # -# plt.figure(1) # figure 1 current; subplot(212) still current -# plt.subplot(211) # make subplot(211) in figure1 current +# plt.figure(1) # first figure current; +# # subplot(212) still current +# plt.subplot(211) # make subplot(211) in the first figure +# # current # plt.title('Easy as 1, 2, 3') # subplot 211 title # # You can clear the current figure with `~.pyplot.clf` diff --git a/tutorials/text/text_intro.py b/tutorials/text/text_intro.py index a32ddc800d10..1b0e60a37ab1 100644 --- a/tutorials/text/text_intro.py +++ b/tutorials/text/text_intro.py @@ -118,7 +118,7 @@ fig, ax = plt.subplots(figsize=(5, 3)) fig.subplots_adjust(bottom=0.15, left=0.2) ax.plot(x1, y1) -ax.set_xlabel('time [s]') +ax.set_xlabel('Time [s]') ax.set_ylabel('Damped oscillation [V]') plt.show() @@ -131,7 +131,7 @@ fig, ax = plt.subplots(figsize=(5, 3)) fig.subplots_adjust(bottom=0.15, left=0.2) ax.plot(x1, y1*10000) -ax.set_xlabel('time [s]') +ax.set_xlabel('Time [s]') ax.set_ylabel('Damped oscillation [V]') plt.show() @@ -144,7 +144,7 @@ fig, ax = plt.subplots(figsize=(5, 3)) fig.subplots_adjust(bottom=0.15, left=0.2) ax.plot(x1, y1*10000) -ax.set_xlabel('time [s]') +ax.set_xlabel('Time [s]') ax.set_ylabel('Damped oscillation [V]', labelpad=18) plt.show() @@ -159,7 +159,7 @@ fig, ax = plt.subplots(figsize=(5, 3)) fig.subplots_adjust(bottom=0.15, left=0.2) ax.plot(x1, y1) -ax.set_xlabel('time [s]', position=(0., 1e6), horizontalalignment='left') +ax.set_xlabel('Time [s]', position=(0., 1e6), horizontalalignment='left') ax.set_ylabel('Damped oscillation [V]') plt.show() @@ -179,7 +179,7 @@ fig, ax = plt.subplots(figsize=(5, 3)) fig.subplots_adjust(bottom=0.15, left=0.2) ax.plot(x1, y1) -ax.set_xlabel('time [s]', fontsize='large', fontweight='bold') +ax.set_xlabel('Time [s]', fontsize='large', fontweight='bold') ax.set_ylabel('Damped oscillation [V]', fontproperties=font) plt.show() @@ -191,7 +191,7 @@ fig, ax = plt.subplots(figsize=(5, 3)) fig.subplots_adjust(bottom=0.2, left=0.2) ax.plot(x1, np.cumsum(y1**2)) -ax.set_xlabel('time [s] \n This was a long experiment') +ax.set_xlabel('Time [s] \n This was a long experiment') ax.set_ylabel(r'$\int\ Y^2\ dt\ \ [V^2 s]$') plt.show() From 3d61e94e6fbe9faa08dd508a07cd89284148e82b Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 27 Sep 2022 03:44:09 -0400 Subject: [PATCH 019/194] Backport PR #24014: Bump pypa/cibuildwheel from 2.10.1 to 2.10.2 --- .github/workflows/cibuildwheel.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/cibuildwheel.yml b/.github/workflows/cibuildwheel.yml index 64f345c3a3f4..32d3e10fdd3b 100644 --- a/.github/workflows/cibuildwheel.yml +++ b/.github/workflows/cibuildwheel.yml @@ -53,7 +53,7 @@ jobs: fetch-depth: 0 - name: Build wheels for CPython 3.11 - uses: pypa/cibuildwheel@v2.10.1 + uses: pypa/cibuildwheel@v2.10.2 env: CIBW_BUILD: "cp311-*" CIBW_SKIP: "*-musllinux*" @@ -66,7 +66,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.10 - uses: pypa/cibuildwheel@v2.10.1 + uses: pypa/cibuildwheel@v2.10.2 env: CIBW_BUILD: "cp310-*" CIBW_SKIP: "*-musllinux*" @@ -79,7 +79,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.9 - uses: pypa/cibuildwheel@v2.10.1 + uses: pypa/cibuildwheel@v2.10.2 env: CIBW_BUILD: "cp39-*" CIBW_SKIP: "*-musllinux*" @@ -92,7 +92,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.8 - uses: pypa/cibuildwheel@v2.10.1 + uses: pypa/cibuildwheel@v2.10.2 env: CIBW_BUILD: "cp38-*" CIBW_SKIP: "*-musllinux*" @@ -105,7 +105,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for PyPy - uses: pypa/cibuildwheel@v2.10.1 + uses: pypa/cibuildwheel@v2.10.2 env: CIBW_BUILD: "pp38-* pp39-*" CIBW_SKIP: "*-musllinux*" From 1d5eff9568c678be07da731da0ffd229d7a67a63 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sat, 24 Sep 2022 06:13:52 +0200 Subject: [PATCH 020/194] Backport PR #23904: added a reversing section to colormap reference --- examples/color/colormap_reference.py | 26 ++++++++++---- lib/matplotlib/colors.py | 14 ++++---- tutorials/colors/colormap-manipulation.py | 42 +++++++++++++++++++++++ 3 files changed, 69 insertions(+), 13 deletions(-) diff --git a/examples/color/colormap_reference.py b/examples/color/colormap_reference.py index d5320f94f0e6..549345edffab 100644 --- a/examples/color/colormap_reference.py +++ b/examples/color/colormap_reference.py @@ -6,16 +6,17 @@ Reference for colormaps included with Matplotlib. A reversed version of each of these colormaps is available by appending -``_r`` to the name, e.g., ``viridis_r``. +``_r`` to the name, as shown in :ref:`reverse-cmap`. See :doc:`/tutorials/colors/colormaps` for an in-depth discussion about -colormaps, including colorblind-friendliness. +colormaps, including colorblind-friendliness, and +:doc:`/tutorials/colors/colormap-manipulation` for a guide to creating +colormaps. """ import numpy as np import matplotlib.pyplot as plt - cmaps = [('Perceptually Uniform Sequential', [ 'viridis', 'plasma', 'inferno', 'magma', 'cividis']), ('Sequential', [ @@ -40,7 +41,6 @@ 'gist_rainbow', 'rainbow', 'jet', 'turbo', 'nipy_spectral', 'gist_ncar'])] - gradient = np.linspace(0, 1, 256) gradient = np.vstack((gradient, gradient)) @@ -52,7 +52,7 @@ def plot_color_gradients(cmap_category, cmap_list): fig, axs = plt.subplots(nrows=nrows, figsize=(6.4, figh)) fig.subplots_adjust(top=1-.35/figh, bottom=.15/figh, left=0.2, right=0.99) - axs[0].set_title(cmap_category + ' colormaps', fontsize=14) + axs[0].set_title(f"{cmap_category} colormaps", fontsize=14) for ax, cmap_name in zip(axs, cmap_list): ax.imshow(gradient, aspect='auto', cmap=cmap_name) @@ -67,7 +67,21 @@ def plot_color_gradients(cmap_category, cmap_list): for cmap_category, cmap_list in cmaps: plot_color_gradients(cmap_category, cmap_list) -plt.show() + +############################################################################### +# .. _reverse-cmap: +# +# Reversed colormaps +# ------------------ +# +# Append ``_r`` to the name of any built-in colormap to get the reversed +# version: + +plot_color_gradients("Original and reversed ", ['viridis', 'viridis_r']) + +# %% +# The built-in reversed colormaps are generated using `.Colormap.reversed`. +# For an example, see :ref:`reversing-colormap` ############################################################################# # diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 0d2233294113..5441b0d617b5 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -870,13 +870,13 @@ def reversed(self, name=None): """ Return a reversed instance of the Colormap. - .. note:: This function is not implemented for base class. + .. note:: This function is not implemented for the base class. Parameters ---------- name : str, optional - The name for the reversed colormap. If it's None the - name will be the name of the parent colormap + "_r". + The name for the reversed colormap. If None, the + name is set to ``self.name + "_r"``. See Also -------- @@ -1079,8 +1079,8 @@ def reversed(self, name=None): Parameters ---------- name : str, optional - The name for the reversed colormap. If it's None the - name will be the name of the parent colormap + "_r". + The name for the reversed colormap. If None, the + name is set to ``self.name + "_r"``. Returns ------- @@ -1179,8 +1179,8 @@ def reversed(self, name=None): Parameters ---------- name : str, optional - The name for the reversed colormap. If it's None the - name will be the name of the parent colormap + "_r". + The name for the reversed colormap. If None, the + name is set to ``self.name + "_r"``. Returns ------- diff --git a/tutorials/colors/colormap-manipulation.py b/tutorials/colors/colormap-manipulation.py index 297506004861..8b2cbc784bc0 100644 --- a/tutorials/colors/colormap-manipulation.py +++ b/tutorials/colors/colormap-manipulation.py @@ -255,6 +255,48 @@ def plot_linearmap(cdict): plot_examples([cmap1, cmap2]) +############################################################################# +# .. _reversing-colormap: +# +# Reversing a colormap +# ==================== +# +# `.Colormap.reversed` creates a new colormap that is a reversed version of +# the original colormap. + +colors = ["#ffffcc", "#a1dab4", "#41b6c4", "#2c7fb8", "#253494"] +my_cmap = ListedColormap(colors, name="my_cmap") + +my_cmap_r = my_cmap.reversed() + +plot_examples([my_cmap, my_cmap_r]) +# %% +# If no name is passed in, ``.reversed`` also names the copy by +# :ref:`appending '_r' ` to the original colormap's +# name. + +############################################################################## +# .. _registering-colormap: +# +# Registering a colormap +# ====================== +# +# Colormaps can be added to the `matplotlib.colormaps` list of named colormaps. +# This allows the colormaps to be accessed by name in plotting functions: + +# my_cmap, my_cmap_r from reversing a colormap +mpl.colormaps.register(cmap=my_cmap) +mpl.colormaps.register(cmap=my_cmap_r) + +data = [[1, 2, 3, 4, 5]] + +fig, (ax1, ax2) = plt.subplots(nrows=2) + +ax1.imshow(data, cmap='my_cmap') +ax2.imshow(data, cmap='my_cmap_r') + +plt.show() + ############################################################################# # # .. admonition:: References From f3185cedafe5cc8fada3e01c518efc798fa97108 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Wed, 28 Sep 2022 13:57:58 +0200 Subject: [PATCH 021/194] Backport PR #24026: Don't modify Axes property cycle in stackplot --- lib/matplotlib/stackplot.py | 13 ++++++++----- lib/matplotlib/tests/test_axes.py | 5 +++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/stackplot.py b/lib/matplotlib/stackplot.py index c580043eebbc..c97a21e029f9 100644 --- a/lib/matplotlib/stackplot.py +++ b/lib/matplotlib/stackplot.py @@ -6,6 +6,8 @@ (https://stackoverflow.com/users/66549/doug) """ +import itertools + import numpy as np from matplotlib import _api @@ -70,7 +72,9 @@ def stackplot(axes, x, *args, labels = iter(labels) if colors is not None: - axes.set_prop_cycle(color=colors) + colors = itertools.cycle(colors) + else: + colors = (axes._get_lines.get_next_color() for _ in y) # Assume data passed has not been 'stacked', so stack it here. # We'll need a float buffer for the upcoming calculations. @@ -108,17 +112,16 @@ def stackplot(axes, x, *args, stack += first_line # Color between x = 0 and the first array. - color = axes._get_lines.get_next_color() coll = axes.fill_between(x, first_line, stack[0, :], - facecolor=color, label=next(labels, None), + facecolor=next(colors), label=next(labels, None), **kwargs) coll.sticky_edges.y[:] = [0] r = [coll] # Color between array i-1 and array i for i in range(len(y) - 1): - color = axes._get_lines.get_next_color() r.append(axes.fill_between(x, stack[i, :], stack[i + 1, :], - facecolor=color, label=next(labels, None), + facecolor=next(colors), + label=next(labels, None), **kwargs)) return r diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index b35b3feacf18..3864a39c274d 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -2859,10 +2859,11 @@ def test_stackplot(): ax.set_xlim((0, 10)) ax.set_ylim((0, 70)) - # Reuse testcase from above for a labeled data test + # Reuse testcase from above for a test with labeled data and with colours + # from the Axes property cycle. data = {"x": x, "y1": y1, "y2": y2, "y3": y3} fig, ax = plt.subplots() - ax.stackplot("x", "y1", "y2", "y3", data=data) + ax.stackplot("x", "y1", "y2", "y3", data=data, colors=["C0", "C1", "C2"]) ax.set_xlim((0, 10)) ax.set_ylim((0, 70)) From 90672eefe3a7e92ecc11b754ee7ec0cc4f36080c Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Wed, 28 Sep 2022 14:00:21 +0200 Subject: [PATCH 022/194] Backport PR #24019: Don't require FigureCanvas on backend module more --- lib/matplotlib/pyplot.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 1e94d90d1534..e5ae9a0cc11c 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -182,7 +182,8 @@ def findobj(o=None, match=None, include_self=True): def _get_required_interactive_framework(backend_mod): - if not hasattr(backend_mod.FigureCanvas, "required_interactive_framework"): + if not hasattr(getattr(backend_mod, "FigureCanvas", None), + "required_interactive_framework"): _api.warn_deprecated( "3.6", name="Support for FigureCanvases without a " "required_interactive_framework attribute") From 606b86e542f64e68719aaef19007061268c4dd20 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Wed, 28 Sep 2022 19:45:41 +0200 Subject: [PATCH 023/194] Backport PR #24032: Reword SpanSelector example. --- examples/widgets/span_selector.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/widgets/span_selector.py b/examples/widgets/span_selector.py index a9d0cc4960bb..940948719d82 100644 --- a/examples/widgets/span_selector.py +++ b/examples/widgets/span_selector.py @@ -3,9 +3,13 @@ Span Selector ============= -The SpanSelector is a mouse widget to select a xmin/xmax range and plot the -detail view of the selected region in the lower axes +The `.SpanSelector` is a mouse widget that enables selecting a range on an +axis. + +Here, an x-range can be selected on the upper axis; a detailed view of the +selected range is then plotted on the lower axis. """ + import numpy as np import matplotlib.pyplot as plt from matplotlib.widgets import SpanSelector From 9be6284db6b4d7769a78eca5152cc5d8f82f8f56 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Wed, 28 Sep 2022 19:45:41 +0200 Subject: [PATCH 024/194] Backport PR #24032: Reword SpanSelector example. --- examples/widgets/span_selector.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/widgets/span_selector.py b/examples/widgets/span_selector.py index a9d0cc4960bb..940948719d82 100644 --- a/examples/widgets/span_selector.py +++ b/examples/widgets/span_selector.py @@ -3,9 +3,13 @@ Span Selector ============= -The SpanSelector is a mouse widget to select a xmin/xmax range and plot the -detail view of the selected region in the lower axes +The `.SpanSelector` is a mouse widget that enables selecting a range on an +axis. + +Here, an x-range can be selected on the upper axis; a detailed view of the +selected range is then plotted on the lower axis. """ + import numpy as np import matplotlib.pyplot as plt from matplotlib.widgets import SpanSelector From d6b786c07394531faca1d706f684cb4cf5346c90 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 28 Sep 2022 19:56:33 -0400 Subject: [PATCH 025/194] Backport PR #24018: When comparing eps images, run ghostscript with -dEPSCrop. --- .github/workflows/tests.yml | 6 +++--- lib/matplotlib/testing/compare.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4e07aee580c2..0c5b7a08ced5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -146,10 +146,10 @@ jobs: ~/.cache/matplotlib !~/.cache/matplotlib/tex.cache !~/.cache/matplotlib/test_cache - key: 1-${{ runner.os }}-py${{ matrix.python-version }}-mpl-${{ github.ref }}-${{ github.sha }} + key: 2-${{ runner.os }}-py${{ matrix.python-version }}-mpl-${{ github.ref }}-${{ github.sha }} restore-keys: | - 1-${{ runner.os }}-py${{ matrix.python-version }}-mpl-${{ github.ref }}- - 1-${{ runner.os }}-py${{ matrix.python-version }}-mpl- + 2-${{ runner.os }}-py${{ matrix.python-version }}-mpl-${{ github.ref }}- + 2-${{ runner.os }}-py${{ matrix.python-version }}-mpl- - name: Install Python dependencies run: | diff --git a/lib/matplotlib/testing/compare.py b/lib/matplotlib/testing/compare.py index c2ed8247d93b..4c07c7ad7e09 100644 --- a/lib/matplotlib/testing/compare.py +++ b/lib/matplotlib/testing/compare.py @@ -103,7 +103,7 @@ def __call__(self, orig, dest): if not self._proc: self._proc = subprocess.Popen( [mpl._get_executable_info("gs").executable, - "-dNOSAFER", "-dNOPAUSE", "-sDEVICE=png16m"], + "-dNOSAFER", "-dNOPAUSE", "-dEPSCrop", "-sDEVICE=png16m"], # As far as I can see, ghostscript never outputs to stderr. stdin=subprocess.PIPE, stdout=subprocess.PIPE) try: From 649fa325d6350ab8875eed616af884c0e9f11b22 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Thu, 29 Sep 2022 06:59:06 +0200 Subject: [PATCH 026/194] Backport PR #24041: DOC: Fix incorrect redirect --- examples/text_labels_and_annotations/font_family_rc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/text_labels_and_annotations/font_family_rc.py b/examples/text_labels_and_annotations/font_family_rc.py index 6c8b06d88054..d840a8575920 100644 --- a/examples/text_labels_and_annotations/font_family_rc.py +++ b/examples/text_labels_and_annotations/font_family_rc.py @@ -24,7 +24,7 @@ rcParams['font.sans-serif'] = ['Tahoma', 'DejaVu Sans', 'Lucida Grande', 'Verdana'] -.. redirect-from:: /examples/font_family_rc_sgskip +.. redirect-from:: /gallery/font_family_rc_sgskip From 4bb89ee4ea2140d7eb3f6d798ebb490f02eb97c2 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Thu, 29 Sep 2022 06:59:06 +0200 Subject: [PATCH 027/194] Backport PR #24041: DOC: Fix incorrect redirect --- examples/text_labels_and_annotations/font_family_rc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/text_labels_and_annotations/font_family_rc.py b/examples/text_labels_and_annotations/font_family_rc.py index 6c8b06d88054..d840a8575920 100644 --- a/examples/text_labels_and_annotations/font_family_rc.py +++ b/examples/text_labels_and_annotations/font_family_rc.py @@ -24,7 +24,7 @@ rcParams['font.sans-serif'] = ['Tahoma', 'DejaVu Sans', 'Lucida Grande', 'Verdana'] -.. redirect-from:: /examples/font_family_rc_sgskip +.. redirect-from:: /gallery/font_family_rc_sgskip From 5f0631566ce674494ea0b36fba5b71b211020adf Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Thu, 29 Sep 2022 10:15:53 +0200 Subject: [PATCH 028/194] Backport PR #24045: Fix _FigureManagerGTK.resize on GTK4 --- lib/matplotlib/backends/_backend_gtk.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/_backend_gtk.py b/lib/matplotlib/backends/_backend_gtk.py index a482480ce0c0..db5ca34cbf80 100644 --- a/lib/matplotlib/backends/_backend_gtk.py +++ b/lib/matplotlib/backends/_backend_gtk.py @@ -233,8 +233,8 @@ def resize(self, width, height): width = int(width / self.canvas.device_pixel_ratio) height = int(height / self.canvas.device_pixel_ratio) if self.toolbar: - toolbar_size = self.toolbar.size_request() - height += toolbar_size.height + min_size, nat_size = self.toolbar.get_preferred_size() + height += nat_size.height canvas_size = self.canvas.get_allocation() if self._gtk_ver >= 4 or canvas_size.width == canvas_size.height == 1: # A canvas size of (1, 1) cannot exist in most cases, because From 0e982d748ff8bcaf4d36c662ffaed878fc6cdd93 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Thu, 29 Sep 2022 18:07:39 +0200 Subject: [PATCH 029/194] Backport PR #24037: [DOC]: make spanselector example codeblock continuous --- examples/widgets/span_selector.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/examples/widgets/span_selector.py b/examples/widgets/span_selector.py index 940948719d82..fa75a70d2863 100644 --- a/examples/widgets/span_selector.py +++ b/examples/widgets/span_selector.py @@ -8,6 +8,11 @@ Here, an x-range can be selected on the upper axis; a detailed view of the selected range is then plotted on the lower axis. + +.. note:: + + If the SpanSelector object is garbage collected you will lose the + interactivity. You must keep a hard reference to it to prevent this. """ import numpy as np @@ -44,14 +49,6 @@ def onselect(xmin, xmax): fig.canvas.draw_idle() -############################################################################# -# .. note:: -# -# If the SpanSelector object is garbage collected you will lose the -# interactivity. You must keep a hard reference to it to prevent this. -# - - span = SpanSelector( ax1, onselect, From c95a0a538a4ff7df2639325ee769debb502f78c8 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Fri, 30 Sep 2022 00:06:41 +0200 Subject: [PATCH 030/194] Backport PR #24046: Ignore 'CFMessagePort: bootstrap_register' messages --- lib/matplotlib/tests/test_backend_tk.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/tests/test_backend_tk.py b/lib/matplotlib/tests/test_backend_tk.py index 5ad3e3ff28b9..4d43e27aa4a4 100644 --- a/lib/matplotlib/tests/test_backend_tk.py +++ b/lib/matplotlib/tests/test_backend_tk.py @@ -53,11 +53,14 @@ def test_func(): + str(e.stderr)) else: # macOS may actually emit irrelevant errors about Accelerated - # OpenGL vs. software OpenGL, so suppress them. + # OpenGL vs. software OpenGL, or some permission error on Azure, so + # suppress them. # Asserting stderr first (and printing it on failure) should be # more helpful for debugging that printing a failed success count. + ignored_lines = ["OpenGL", "CFMessagePort: bootstrap_register", + "/usr/include/servers/bootstrap_defs.h"] assert not [line for line in proc.stderr.splitlines() - if "OpenGL" not in line] + if all(msg not in line for msg in ignored_lines)] assert proc.stdout.count("success") == success_count return test_func From bf16cb6145920d403e25841437da76cc0b195860 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Fri, 30 Sep 2022 18:27:48 -0400 Subject: [PATCH 031/194] Backport PR #23638: FIX: correctly handle generic font families in svg text-as-text mode --- lib/matplotlib/backends/backend_svg.py | 42 +++++++++++++++- lib/matplotlib/font_manager.py | 17 +++++-- lib/matplotlib/tests/test_backend_svg.py | 61 ++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/backends/backend_svg.py b/lib/matplotlib/backends/backend_svg.py index 7d94c429eed7..738fe44c6f81 100644 --- a/lib/matplotlib/backends/backend_svg.py +++ b/lib/matplotlib/backends/backend_svg.py @@ -1151,10 +1151,48 @@ def _draw_text_as_text(self, gc, x, y, s, prop, angle, ismath, mtext=None): weight = fm.weight_dict[prop.get_weight()] if weight != 400: font_parts.append(f'{weight}') + + def _format_font_name(fn): + normalize_names = { + 'sans': 'sans-serif', + 'sans serif': 'sans-serif' + } + # A generic font family. We need to do two things: + # 1. list all of the configured fonts with quoted names + # 2. append the generic name unquoted + if fn in fm.font_family_aliases: + # fix spelling of sans-serif + # we accept 3 ways CSS only supports 1 + fn = normalize_names.get(fn, fn) + # get all of the font names and fix spelling of sans-serif + # if it comes back + aliases = [ + normalize_names.get(_, _) for _ in + fm.FontManager._expand_aliases(fn) + ] + # make sure the generic name appears at least once + # duplicate is OK, next layer will deduplicate + aliases.append(fn) + + for a in aliases: + # generic font families must not be quoted + if a in fm.font_family_aliases: + yield a + # specific font families must be quoted + else: + yield repr(a) + # specific font families must be quoted + else: + yield repr(fn) + + def _get_all_names(prop): + for f in prop.get_family(): + yield from _format_font_name(f) + font_parts.extend([ f'{_short_float_fmt(prop.get_size())}px', - # ensure quoting - f'{", ".join(repr(f) for f in prop.get_family())}', + # ensure quoting and expansion of font names + ", ".join(dict.fromkeys(_get_all_names(prop))) ]) style['font'] = ' '.join(font_parts) if prop.get_stretch() != 'normal': diff --git a/lib/matplotlib/font_manager.py b/lib/matplotlib/font_manager.py index 99e1fecabbeb..a5742ef88f61 100644 --- a/lib/matplotlib/font_manager.py +++ b/lib/matplotlib/font_manager.py @@ -1345,9 +1345,12 @@ def findfont(self, prop, fontext='ttf', directory=None, rc_params = tuple(tuple(mpl.rcParams[key]) for key in [ "font.serif", "font.sans-serif", "font.cursive", "font.fantasy", "font.monospace"]) - return self._findfont_cached( + ret = self._findfont_cached( prop, fontext, directory, fallback_to_default, rebuild_if_missing, rc_params) + if isinstance(ret, Exception): + raise ret + return ret def get_font_names(self): """Return the list of available fonts.""" @@ -1496,8 +1499,11 @@ def _findfont_cached(self, prop, fontext, directory, fallback_to_default, return self.findfont(default_prop, fontext, directory, fallback_to_default=False) else: - raise ValueError(f"Failed to find font {prop}, and fallback " - f"to the default font was disabled") + # This return instead of raise is intentional, as we wish to + # cache the resulting exception, which will not occur if it was + # actually raised. + return ValueError(f"Failed to find font {prop}, and fallback " + f"to the default font was disabled") else: _log.debug('findfont: Matching %s to %s (%r) with score of %f.', prop, best_font.name, best_font.fname, best_score) @@ -1516,7 +1522,10 @@ def _findfont_cached(self, prop, fontext, directory, fallback_to_default, return self.findfont( prop, fontext, directory, rebuild_if_missing=False) else: - raise ValueError("No valid font could be found") + # This return instead of raise is intentional, as we wish to + # cache the resulting exception, which will not occur if it was + # actually raised. + return ValueError("No valid font could be found") return _cached_realpath(result) diff --git a/lib/matplotlib/tests/test_backend_svg.py b/lib/matplotlib/tests/test_backend_svg.py index 7ea81730f20d..680efd67379b 100644 --- a/lib/matplotlib/tests/test_backend_svg.py +++ b/lib/matplotlib/tests/test_backend_svg.py @@ -527,3 +527,64 @@ def test_svg_escape(): fig.savefig(fd, format='svg') buf = fd.getvalue().decode() assert '<'"&>"' in buf + + +@pytest.mark.parametrize("font_str", [ + "'DejaVu Sans', 'WenQuanYi Zen Hei', 'Arial', sans-serif", + "'DejaVu Serif', 'WenQuanYi Zen Hei', 'Times New Roman', serif", + "'Arial', 'WenQuanYi Zen Hei', cursive", + "'Impact', 'WenQuanYi Zen Hei', fantasy", + "'DejaVu Sans Mono', 'WenQuanYi Zen Hei', 'Courier New', monospace", + # These do not work because the logic to get the font metrics will not find + # WenQuanYi as the fallback logic stops with the first fallback font: + # "'DejaVu Sans Mono', 'Courier New', 'WenQuanYi Zen Hei', monospace", + # "'DejaVu Sans', 'Arial', 'WenQuanYi Zen Hei', sans-serif", + # "'DejaVu Serif', 'Times New Roman', 'WenQuanYi Zen Hei', serif", +]) +@pytest.mark.parametrize("include_generic", [True, False]) +def test_svg_font_string(font_str, include_generic): + fp = fm.FontProperties(family=["WenQuanYi Zen Hei"]) + if Path(fm.findfont(fp)).name != "wqy-zenhei.ttc": + pytest.skip("Font may be missing") + + explicit, *rest, generic = map( + lambda x: x.strip("'"), font_str.split(", ") + ) + size = len(generic) + if include_generic: + rest = rest + [generic] + plt.rcParams[f"font.{generic}"] = rest + plt.rcParams["font.size"] = size + plt.rcParams["svg.fonttype"] = "none" + + fig, ax = plt.subplots() + if generic == "sans-serif": + generic_options = ["sans", "sans-serif", "sans serif"] + else: + generic_options = [generic] + + for generic_name in generic_options: + # test that fallback works + ax.text(0.5, 0.5, "There are 几个汉字 in between!", + family=[explicit, generic_name], ha="center") + # test deduplication works + ax.text(0.5, 0.1, "There are 几个汉字 in between!", + family=[explicit, *rest, generic_name], ha="center") + ax.axis("off") + + with BytesIO() as fd: + fig.savefig(fd, format="svg") + buf = fd.getvalue() + + tree = xml.etree.ElementTree.fromstring(buf) + ns = "http://www.w3.org/2000/svg" + text_count = 0 + for text_element in tree.findall(f".//{{{ns}}}text"): + text_count += 1 + font_info = dict( + map(lambda x: x.strip(), _.strip().split(":")) + for _ in dict(text_element.items())["style"].split(";") + )["font"] + + assert font_info == f"{size}px {font_str}" + assert text_count == len(ax.texts) From 9ab4b504695b5d26ec0e499263059ad171ade45e Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Sun, 2 Oct 2022 12:21:32 +0200 Subject: [PATCH 032/194] Backport PR #24069: Clarification of marker size in scatter --- lib/matplotlib/axes/_axes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index c578765bfa1c..9df42e0c4d0b 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -4402,7 +4402,7 @@ def scatter(self, x, y, s=None, c=None, marker=None, cmap=None, norm=None, The data positions. s : float or array-like, shape (n, ), optional - The marker size in points**2. + The marker size in points**2 (typographic points are 1/72 in.). Default is ``rcParams['lines.markersize'] ** 2``. c : array-like or list of colors or color, optional From 31ef9bceb7b69de0239a9b3534a05e8395f0e697 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Sun, 2 Oct 2022 12:23:30 +0200 Subject: [PATCH 033/194] Backport PR #24070: DOC: colorbar may steal from array of axes --- lib/matplotlib/colorbar.py | 2 +- lib/matplotlib/figure.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index b9293fbd902e..ee47d2107fd6 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -1364,7 +1364,7 @@ def make_axes(parents, location=None, orientation=None, fraction=0.15, Parameters ---------- - parents : `~.axes.Axes` or list of `~.axes.Axes` + parents : `~.axes.Axes` or list or `numpy.ndarray` of `~.axes.Axes` The Axes to use as parents for placing the colorbar. %(_make_axes_kw_doc)s diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 447f508194a1..4aebc1696543 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -1197,7 +1197,7 @@ def colorbar( cax : `~matplotlib.axes.Axes`, optional Axes into which the colorbar will be drawn. - ax : `~matplotlib.axes.Axes`, list of Axes, optional + ax : `~.axes.Axes` or list or `numpy.ndarray` of Axes, optional One or more parent axes from which space for a new colorbar axes will be stolen, if *cax* is None. This has no effect if *cax* is set. From 80698784acd6c5d9ff708ff5e0575803dfde532e Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sun, 2 Oct 2022 18:37:58 +0200 Subject: [PATCH 034/194] Backport PR #24054: DOC: Move OO-examples from pyplot section --- doc/users/faq/howto_faq.rst | 6 +- examples/{pyplots => misc}/fig_x.py | 2 + examples/pyplots/boxplot_demo_pyplot.py | 89 ------------------- examples/pyplots/fig_axes_labels_simple.py | 42 --------- examples/pyplots/pyplot_formatstr.py | 21 ----- examples/pyplots/pyplot_simple.py | 9 +- examples/pyplots/text_layout.py | 63 ------------- examples/statistics/boxplot_demo.py | 2 + .../auto_subplots_adjust.py | 2 + .../align_ylabels.py | 1 + .../annotate_transform.py | 2 + .../annotation_basic.py | 2 + .../annotation_polar.py | 2 + .../text_alignment.py | 2 + .../text_commands.py | 2 + examples/{pyplots => ticks}/dollar_ticks.py | 2 + .../fig_axes_customize_simple.py | 2 + examples/ticks/tick-formatters.py | 1 + tutorials/intermediate/artists.py | 2 +- tutorials/text/annotations.py | 8 +- 20 files changed, 37 insertions(+), 225 deletions(-) rename examples/{pyplots => misc}/fig_x.py (93%) delete mode 100644 examples/pyplots/boxplot_demo_pyplot.py delete mode 100644 examples/pyplots/fig_axes_labels_simple.py delete mode 100644 examples/pyplots/pyplot_formatstr.py delete mode 100644 examples/pyplots/text_layout.py rename examples/{pyplots => subplots_axes_and_figures}/auto_subplots_adjust.py (98%) rename examples/{pyplots => text_labels_and_annotations}/align_ylabels.py (97%) rename examples/{pyplots => text_labels_and_annotations}/annotate_transform.py (96%) rename examples/{pyplots => text_labels_and_annotations}/annotation_basic.py (94%) rename examples/{pyplots => text_labels_and_annotations}/annotation_polar.py (95%) rename examples/{pyplots => text_labels_and_annotations}/text_commands.py (96%) rename examples/{pyplots => ticks}/dollar_ticks.py (94%) rename examples/{pyplots => ticks}/fig_axes_customize_simple.py (95%) diff --git a/doc/users/faq/howto_faq.rst b/doc/users/faq/howto_faq.rst index 4f60b9e14fe3..4ea220d969b0 100644 --- a/doc/users/faq/howto_faq.rst +++ b/doc/users/faq/howto_faq.rst @@ -187,7 +187,7 @@ multiple ways to fix this: - tight layout (:doc:`/tutorials/intermediate/tight_layout_guide`) - Calculate good values from the size of the plot elements yourself - (:doc:`/gallery/pyplots/auto_subplots_adjust`) + (:doc:`/gallery/subplots_axes_and_figures/auto_subplots_adjust`) .. _howto-align-label: @@ -203,8 +203,8 @@ behavior by specifying the coordinates of the label. The example below shows the default behavior in the left subplots, and the manual setting in the right subplots. -.. figure:: ../../gallery/pyplots/images/sphx_glr_align_ylabels_001.png - :target: ../../gallery/pyplots/align_ylabels.html +.. figure:: ../../gallery/text_labels_and_annotations/images/sphx_glr_align_ylabels_001.png + :target: ../../gallery/text_labels_and_annotations/align_ylabels.html :align: center :scale: 50 diff --git a/examples/pyplots/fig_x.py b/examples/misc/fig_x.py similarity index 93% rename from examples/pyplots/fig_x.py rename to examples/misc/fig_x.py index 9ca5a3b13d8a..eaa16d80fa35 100644 --- a/examples/pyplots/fig_x.py +++ b/examples/misc/fig_x.py @@ -4,6 +4,8 @@ ======================= Adding lines to a figure without any axes. + +.. redirect-from:: /gallery/pyplots/fig_x """ import matplotlib.pyplot as plt diff --git a/examples/pyplots/boxplot_demo_pyplot.py b/examples/pyplots/boxplot_demo_pyplot.py deleted file mode 100644 index 501eb2cf3447..000000000000 --- a/examples/pyplots/boxplot_demo_pyplot.py +++ /dev/null @@ -1,89 +0,0 @@ -""" -============ -Boxplot Demo -============ - -Example boxplot code -""" - -import numpy as np -import matplotlib.pyplot as plt - -# Fixing random state for reproducibility -np.random.seed(19680801) - -# fake up some data -spread = np.random.rand(50) * 100 -center = np.ones(25) * 50 -flier_high = np.random.rand(10) * 100 + 100 -flier_low = np.random.rand(10) * -100 -data = np.concatenate((spread, center, flier_high, flier_low)) - -############################################################################### - -fig1, ax1 = plt.subplots() -ax1.set_title('Basic Plot') -ax1.boxplot(data) - -############################################################################### - -fig2, ax2 = plt.subplots() -ax2.set_title('Notched boxes') -ax2.boxplot(data, notch=True) - -############################################################################### - -green_diamond = dict(markerfacecolor='g', marker='D') -fig3, ax3 = plt.subplots() -ax3.set_title('Changed Outlier Symbols') -ax3.boxplot(data, flierprops=green_diamond) - -############################################################################### - -fig4, ax4 = plt.subplots() -ax4.set_title('Hide Outlier Points') -ax4.boxplot(data, showfliers=False) - -############################################################################### - -red_square = dict(markerfacecolor='r', marker='s') -fig5, ax5 = plt.subplots() -ax5.set_title('Horizontal Boxes') -ax5.boxplot(data, vert=False, flierprops=red_square) - -############################################################################### - -fig6, ax6 = plt.subplots() -ax6.set_title('Shorter Whisker Length') -ax6.boxplot(data, flierprops=red_square, vert=False, whis=0.75) - -############################################################################### -# Fake up some more data - -spread = np.random.rand(50) * 100 -center = np.ones(25) * 40 -flier_high = np.random.rand(10) * 100 + 100 -flier_low = np.random.rand(10) * -100 -d2 = np.concatenate((spread, center, flier_high, flier_low)) - -############################################################################### -# Making a 2-D array only works if all the columns are the -# same length. If they are not, then use a list instead. -# This is actually more efficient because boxplot converts -# a 2-D array into a list of vectors internally anyway. - -data = [data, d2, d2[::2]] -fig7, ax7 = plt.subplots() -ax7.set_title('Multiple Samples with Different sizes') -ax7.boxplot(data) - -plt.show() - -############################################################################# -# -# .. admonition:: References -# -# The use of the following functions, methods, classes and modules is shown -# in this example: -# -# - `matplotlib.axes.Axes.boxplot` / `matplotlib.pyplot.boxplot` diff --git a/examples/pyplots/fig_axes_labels_simple.py b/examples/pyplots/fig_axes_labels_simple.py deleted file mode 100644 index 353f09477dfd..000000000000 --- a/examples/pyplots/fig_axes_labels_simple.py +++ /dev/null @@ -1,42 +0,0 @@ -""" -================== -Simple axes labels -================== - -Label the axes of a plot. -""" -import numpy as np -import matplotlib.pyplot as plt - -fig = plt.figure() -fig.subplots_adjust(top=0.8) -ax1 = fig.add_subplot(211) -ax1.set_ylabel('Voltage [V]') -ax1.set_title('A sine wave') - -t = np.arange(0.0, 1.0, 0.01) -s = np.sin(2 * np.pi * t) -line, = ax1.plot(t, s, lw=2) - -# Fixing random state for reproducibility -np.random.seed(19680801) - -ax2 = fig.add_axes([0.15, 0.1, 0.7, 0.3]) -n, bins, patches = ax2.hist(np.random.randn(1000), 50) -ax2.set_xlabel('Time [s]') - -plt.show() - -############################################################################# -# -# .. admonition:: References -# -# The use of the following functions, methods, classes and modules is shown -# in this example: -# -# - `matplotlib.axes.Axes.set_xlabel` -# - `matplotlib.axes.Axes.set_ylabel` -# - `matplotlib.axes.Axes.set_title` -# - `matplotlib.axes.Axes.plot` -# - `matplotlib.axes.Axes.hist` -# - `matplotlib.figure.Figure.add_axes` diff --git a/examples/pyplots/pyplot_formatstr.py b/examples/pyplots/pyplot_formatstr.py deleted file mode 100644 index e9be3830ec98..000000000000 --- a/examples/pyplots/pyplot_formatstr.py +++ /dev/null @@ -1,21 +0,0 @@ -""" -==================== -plot() format string -==================== - -Use a format string (here, 'ro') to set the color and markers of a -`~matplotlib.axes.Axes.plot`. -""" - -import matplotlib.pyplot as plt -plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro') -plt.show() - -############################################################################# -# -# .. admonition:: References -# -# The use of the following functions, methods, classes and modules is shown -# in this example: -# -# - `matplotlib.axes.Axes.plot` / `matplotlib.pyplot.plot` diff --git a/examples/pyplots/pyplot_simple.py b/examples/pyplots/pyplot_simple.py index 414e5ae4f7ab..1a3b457acedd 100644 --- a/examples/pyplots/pyplot_simple.py +++ b/examples/pyplots/pyplot_simple.py @@ -5,10 +5,15 @@ A very simple pyplot where a list of numbers are plotted against their index. Creates a straight line due to the rate of change being 1 for -both the X and Y axis. +both the X and Y axis. Use a format string (here, 'o-r') to set the +markers (circles), linestyle (solid line) and color (red). + +.. redirect-from:: /gallery/pyplots/fig_axes_labels_simple +.. redirect-from:: /gallery/pyplots/pyplot_formatstr """ import matplotlib.pyplot as plt -plt.plot([1, 2, 3, 4]) + +plt.plot([1, 2, 3, 4], 'o-r') plt.ylabel('some numbers') plt.show() diff --git a/examples/pyplots/text_layout.py b/examples/pyplots/text_layout.py deleted file mode 100644 index 641aa77320a5..000000000000 --- a/examples/pyplots/text_layout.py +++ /dev/null @@ -1,63 +0,0 @@ -""" -=========== -Text Layout -=========== - -Create text with different alignment and rotation. -""" - -import matplotlib.pyplot as plt -import matplotlib.patches as patches - -fig = plt.figure() - -left, width = .25, .5 -bottom, height = .25, .5 -right = left + width -top = bottom + height - -# Draw a rectangle in figure coordinates ((0, 0) is bottom left and (1, 1) is -# upper right). -p = patches.Rectangle((left, bottom), width, height, fill=False) -fig.add_artist(p) - -# Figure.text (aka. plt.figtext) behaves like Axes.text (aka. plt.text), with -# the sole exception that the coordinates are relative to the figure ((0, 0) is -# bottom left and (1, 1) is upper right). -fig.text(left, bottom, 'left top', - horizontalalignment='left', verticalalignment='top') -fig.text(left, bottom, 'left bottom', - horizontalalignment='left', verticalalignment='bottom') -fig.text(right, top, 'right bottom', - horizontalalignment='right', verticalalignment='bottom') -fig.text(right, top, 'right top', - horizontalalignment='right', verticalalignment='top') -fig.text(right, bottom, 'center top', - horizontalalignment='center', verticalalignment='top') -fig.text(left, 0.5*(bottom+top), 'right center', - horizontalalignment='right', verticalalignment='center', - rotation='vertical') -fig.text(left, 0.5*(bottom+top), 'left center', - horizontalalignment='left', verticalalignment='center', - rotation='vertical') -fig.text(0.5*(left+right), 0.5*(bottom+top), 'middle', - horizontalalignment='center', verticalalignment='center', - fontsize=20, color='red') -fig.text(right, 0.5*(bottom+top), 'centered', - horizontalalignment='center', verticalalignment='center', - rotation='vertical') -fig.text(left, top, 'rotated\nwith newlines', - horizontalalignment='center', verticalalignment='center', - rotation=45) - -plt.show() - -############################################################################# -# -# .. admonition:: References -# -# The use of the following functions, methods, classes and modules is shown -# in this example: -# -# - `matplotlib.figure.Figure.add_artist` -# - `matplotlib.figure.Figure.text` diff --git a/examples/statistics/boxplot_demo.py b/examples/statistics/boxplot_demo.py index 0ad146aa1d2d..252ca25bd58d 100644 --- a/examples/statistics/boxplot_demo.py +++ b/examples/statistics/boxplot_demo.py @@ -8,6 +8,8 @@ The following examples show off how to visualize boxplots with Matplotlib. There are many options to control their appearance and the statistics that they use to summarize the data. + +.. redirect-from:: /gallery/pyplots/boxplot_demo_pyplot """ import matplotlib.pyplot as plt diff --git a/examples/pyplots/auto_subplots_adjust.py b/examples/subplots_axes_and_figures/auto_subplots_adjust.py similarity index 98% rename from examples/pyplots/auto_subplots_adjust.py rename to examples/subplots_axes_and_figures/auto_subplots_adjust.py index b4c731cb4cdc..bd6326b8291f 100644 --- a/examples/pyplots/auto_subplots_adjust.py +++ b/examples/subplots_axes_and_figures/auto_subplots_adjust.py @@ -36,6 +36,8 @@ This function is executed after the figure has been drawn. It can now check if the subplot leaves enough room for the text. If not, the subplot parameters are updated and second draw is triggered. + +.. redirect-from:: /gallery/pyplots/auto_subplots_adjust """ import matplotlib.pyplot as plt diff --git a/examples/pyplots/align_ylabels.py b/examples/text_labels_and_annotations/align_ylabels.py similarity index 97% rename from examples/pyplots/align_ylabels.py rename to examples/text_labels_and_annotations/align_ylabels.py index 3523e08f93fd..8e47909cc6c1 100644 --- a/examples/pyplots/align_ylabels.py +++ b/examples/text_labels_and_annotations/align_ylabels.py @@ -6,6 +6,7 @@ Two methods are shown here, one using a short call to `.Figure.align_ylabels` and the second a manual way to align the labels. +.. redirect-from:: /gallery/pyplots/align_ylabels """ import numpy as np import matplotlib.pyplot as plt diff --git a/examples/pyplots/annotate_transform.py b/examples/text_labels_and_annotations/annotate_transform.py similarity index 96% rename from examples/pyplots/annotate_transform.py rename to examples/text_labels_and_annotations/annotate_transform.py index 9d3d09f5a0ba..1145f7fdb9a2 100644 --- a/examples/pyplots/annotate_transform.py +++ b/examples/text_labels_and_annotations/annotate_transform.py @@ -6,6 +6,8 @@ This example shows how to use different coordinate systems for annotations. For a complete overview of the annotation capabilities, also see the :doc:`annotation tutorial`. + +.. redirect-from:: /gallery/pyplots/annotate_transform """ import numpy as np diff --git a/examples/pyplots/annotation_basic.py b/examples/text_labels_and_annotations/annotation_basic.py similarity index 94% rename from examples/pyplots/annotation_basic.py rename to examples/text_labels_and_annotations/annotation_basic.py index 5a6327b48748..d9ea9748197f 100644 --- a/examples/pyplots/annotation_basic.py +++ b/examples/text_labels_and_annotations/annotation_basic.py @@ -8,6 +8,8 @@ For a complete overview of the annotation capabilities, also see the :doc:`annotation tutorial`. + +.. redirect-from:: /gallery/pyplots/annotation_basic """ import numpy as np import matplotlib.pyplot as plt diff --git a/examples/pyplots/annotation_polar.py b/examples/text_labels_and_annotations/annotation_polar.py similarity index 95% rename from examples/pyplots/annotation_polar.py rename to examples/text_labels_and_annotations/annotation_polar.py index 24a3a20bc3fe..a7f8b764d914 100644 --- a/examples/pyplots/annotation_polar.py +++ b/examples/text_labels_and_annotations/annotation_polar.py @@ -7,6 +7,8 @@ For a complete overview of the annotation capabilities, also see the :doc:`annotation tutorial`. + +.. redirect-from:: /gallery/pyplots/annotation_polar """ import numpy as np import matplotlib.pyplot as plt diff --git a/examples/text_labels_and_annotations/text_alignment.py b/examples/text_labels_and_annotations/text_alignment.py index a12002972233..a748481d5261 100644 --- a/examples/text_labels_and_annotations/text_alignment.py +++ b/examples/text_labels_and_annotations/text_alignment.py @@ -6,6 +6,8 @@ Texts are aligned relative to their anchor point depending on the properties ``horizontalalignment`` and ``verticalalignment``. +.. redirect-from:: /gallery/pyplots/text_layout + .. plot:: import matplotlib.pyplot as plt diff --git a/examples/pyplots/text_commands.py b/examples/text_labels_and_annotations/text_commands.py similarity index 96% rename from examples/pyplots/text_commands.py rename to examples/text_labels_and_annotations/text_commands.py index a13532246f0a..cb6d5413f8d4 100644 --- a/examples/pyplots/text_commands.py +++ b/examples/text_labels_and_annotations/text_commands.py @@ -4,6 +4,8 @@ ============= Plotting text of many different kinds. + +.. redirect-from:: /gallery/pyplots/text_commands """ import matplotlib.pyplot as plt diff --git a/examples/pyplots/dollar_ticks.py b/examples/ticks/dollar_ticks.py similarity index 94% rename from examples/pyplots/dollar_ticks.py rename to examples/ticks/dollar_ticks.py index 1f99ccdd674d..694e613db08d 100644 --- a/examples/pyplots/dollar_ticks.py +++ b/examples/ticks/dollar_ticks.py @@ -4,6 +4,8 @@ ============ Use a `~.ticker.FormatStrFormatter` to prepend dollar signs on y axis labels. + +.. redirect-from:: /gallery/pyplots/dollar_ticks """ import numpy as np import matplotlib.pyplot as plt diff --git a/examples/pyplots/fig_axes_customize_simple.py b/examples/ticks/fig_axes_customize_simple.py similarity index 95% rename from examples/pyplots/fig_axes_customize_simple.py rename to examples/ticks/fig_axes_customize_simple.py index b557feb961aa..74742f718939 100644 --- a/examples/pyplots/fig_axes_customize_simple.py +++ b/examples/ticks/fig_axes_customize_simple.py @@ -4,6 +4,8 @@ ========================= Customize the background, labels and ticks of a simple plot. + +.. redirect-from:: /gallery/pyplots/fig_axes_customize_simple """ import matplotlib.pyplot as plt diff --git a/examples/ticks/tick-formatters.py b/examples/ticks/tick-formatters.py index ea9dc214fbb0..ac118cbfce03 100644 --- a/examples/ticks/tick-formatters.py +++ b/examples/ticks/tick-formatters.py @@ -7,6 +7,7 @@ is formatted as a string. This example illustrates the usage and effect of the most common formatters. + """ import matplotlib.pyplot as plt diff --git a/tutorials/intermediate/artists.py b/tutorials/intermediate/artists.py index e2cf55fd5992..0078813f9edd 100644 --- a/tutorials/intermediate/artists.py +++ b/tutorials/intermediate/artists.py @@ -719,6 +719,6 @@ class in the Matplotlib API, and the one you will be working with most # dollar signs and colors them green on the right side of the yaxis. # # -# .. include:: ../../gallery/pyplots/dollar_ticks.rst +# .. include:: ../../gallery/ticks/dollar_ticks.rst # :start-after: y axis labels. # :end-before: .. admonition:: References diff --git a/tutorials/text/annotations.py b/tutorials/text/annotations.py index df2dda7ad580..7ab582d9f20f 100644 --- a/tutorials/text/annotations.py +++ b/tutorials/text/annotations.py @@ -25,8 +25,8 @@ # *xy* and the location of the text *xytext*. Both of these # arguments are ``(x, y)`` tuples. # -# .. figure:: ../../gallery/pyplots/images/sphx_glr_annotation_basic_001.png -# :target: ../../gallery/pyplots/annotation_basic.html +# .. figure:: ../../gallery/text_labels_and_annotations/images/sphx_glr_annotation_basic_001.png +# :target: ../../gallery/text_labels_and_annotations/annotation_basic.html # :align: center # # In this example, both the *xy* (arrow tip) and *xytext* locations @@ -86,8 +86,8 @@ # *fontsize* are passed from `~matplotlib.axes.Axes.annotate` to the # ``Text`` instance. # -# .. figure:: ../../gallery/pyplots/images/sphx_glr_annotation_polar_001.png -# :target: ../../gallery/pyplots/annotation_polar.html +# .. figure:: ../../gallery/text_labels_and_annotations/images/sphx_glr_annotation_polar_001.png +# :target: ../../gallery/text_labels_and_annotations/annotation_polar.html # :align: center # # For more on all the wild and wonderful things you can do with From 2e351d150180eb4aaa1aa9244376c74c59ebe9e2 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sun, 2 Oct 2022 22:09:58 +0200 Subject: [PATCH 035/194] Backport PR #24047: Revert #22360: Let TeX handle multiline strings itself --- lib/matplotlib/dates.py | 12 +++++- lib/matplotlib/dviread.py | 32 +++++++++++++- .../baseline_images/test_usetex/eqnarray.png | Bin 0 -> 1322 bytes lib/matplotlib/tests/test_dates.py | 40 +++++++++--------- lib/matplotlib/tests/test_text.py | 21 +++++++-- lib/matplotlib/tests/test_usetex.py | 15 +++++++ lib/matplotlib/texmanager.py | 3 +- lib/matplotlib/text.py | 3 +- 8 files changed, 97 insertions(+), 29 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_usetex/eqnarray.png diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py index ac1a7d03c687..672ea2c3b003 100644 --- a/lib/matplotlib/dates.py +++ b/lib/matplotlib/dates.py @@ -173,6 +173,7 @@ import functools import logging import math +import re from dateutil.rrule import (rrule, MO, TU, WE, TH, FR, SA, SU, YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, @@ -597,7 +598,16 @@ def drange(dstart, dend, delta): def _wrap_in_tex(text): - return r"{\fontfamily{\familydefault}\selectfont " + text + "}" + p = r'([a-zA-Z]+)' + ret_text = re.sub(p, r'}$\1$\\mathdefault{', text) + + # Braces ensure symbols are not spaced like binary operators. + ret_text = ret_text.replace('-', '{-}').replace(':', '{:}') + # To not concatenate space between numbers. + ret_text = ret_text.replace(' ', r'\;') + ret_text = '$\\mathdefault{' + ret_text + '}$' + ret_text = ret_text.replace('$\\mathdefault{}$', '') + return ret_text ## date tickers and formatters ### diff --git a/lib/matplotlib/dviread.py b/lib/matplotlib/dviread.py index 8c83d8d6c508..296e67c4d5ff 100644 --- a/lib/matplotlib/dviread.py +++ b/lib/matplotlib/dviread.py @@ -352,10 +352,40 @@ 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 + # # if using chemformula + # down + # push + # down + # # if using xcolor + # down + # push + # down (possibly multiple) + # push <= here, v is the baseline position. + # etc. + # (dviasm is useful to explore this structure.) + # Thus, we use the vertical position at the first time the stack depth + # reaches 3, while at least three "downs" have been executed (excluding + # those popped out (corresponding to the chemformula preamble)), as the + # baseline (the "down" count is necessary to handle xcolor). + down_stack = [0] self._baseline_v = None while True: byte = self.file.read(1)[0] self._dtable[byte](self, byte) + name = self._dtable[byte].__name__ + if name == "_push": + down_stack.append(down_stack[-1]) + elif name == "_pop": + down_stack.pop() + elif name == "_down": + down_stack[-1] += 1 + if (self._baseline_v is None + and len(getattr(self, "stack", [])) == 3 + and down_stack[-1] >= 4): + self._baseline_v = self.v if byte == 140: # end of page return True if self.state is _dvistate.post_post: # end of file @@ -488,8 +518,6 @@ def _fnt_num(self, new_f): @_dispatch(min=239, max=242, args=('ulen1',)) def _xxx(self, datalen): special = self.file.read(datalen) - if special == b'matplotlibbaselinemarker': - self._baseline_v = self.v _log.debug( 'Dvi._xxx: encountered special: %s', ''.join([chr(ch) if 32 <= ch < 127 else '<%02x>' % ch diff --git a/lib/matplotlib/tests/baseline_images/test_usetex/eqnarray.png b/lib/matplotlib/tests/baseline_images/test_usetex/eqnarray.png new file mode 100644 index 0000000000000000000000000000000000000000..249f15d238ddacf216965801675667d6edb85da3 GIT binary patch literal 1322 zcmeAS@N?(olHy`uVBq!ia0vp^DImv~(l@_;SZF8i$S^J$mm}g-zS*UD3z4Tw8JdHArUurkeZhk1ec^Up8?SV6on+(UlN+ZFyYP4w^=jzVwKBY? zT>pOjC>S~I;nSzAd*jx>D(mA~I^kyx-&)gOf9-E|{rE$bd8wwe zeRZav{$K0CXVEAa)UtYN5XWJG$Z2oqOisO-pFNv#XaBk6#yAfFmJK@GQQ2E==lZBk zUMsyTLZ_gp&65Y~Jgof^CXZf+YHnhsK<8yukgjR(|ot6?ddpUVjaY zRfcQT&*nXU`0N?mfhrNn$f^@@*Q5 zmb~FUv(ZV{C428wBb{w!)qCS457p_PE}XOW|E62&Qzf$$-z(3be3E7JO`fe$yxVf$ zpJ2LX9+w>}XTS6!cXSIyry4Q;? zzYJI}J^KQ;rTL2GYl>Y6r2GK(r{{E4*ykMJuv|Vt#zF7N9jBrLoNwCa1bgr)$SdCG zJ(>G&-r3qR&QrA$-?u$!_-gh(!QjBtr>c`w93|S0@9VLD{Nw#@%Q+7Vc6|M|{r2tK ze;z(mJpcLY>S;2^HM0w4-q#jixP3eN=jWoGcYdAW_{;G#%VXVwi0Up8<=;^*+D~>X z?)2^2V7i;9A>zb+j+2bplCzbY|As!@;`GnWLyyNfW9{kWM2Ts^a@tq!JMR;obb1qy zqrigOZ<9=<60PPYna#dv-?UJysPBSb info.misses diff --git a/lib/matplotlib/tests/test_usetex.py b/lib/matplotlib/tests/test_usetex.py index 22309afdaf97..0f01ebaffb56 100644 --- a/lib/matplotlib/tests/test_usetex.py +++ b/lib/matplotlib/tests/test_usetex.py @@ -64,6 +64,21 @@ def test_mathdefault(): fig.canvas.draw() +@image_comparison(['eqnarray.png']) +def test_multiline_eqnarray(): + text = ( + r'\begin{eqnarray*}' + r'foo\\' + r'bar\\' + r'baz\\' + r'\end{eqnarray*}' + ) + + fig = plt.figure(figsize=(1, 1)) + fig.text(0.5, 0.5, text, usetex=True, + horizontalalignment='center', verticalalignment='center') + + @pytest.mark.parametrize("fontsize", [8, 10, 12]) def test_minus_no_descent(fontsize): # Test special-casing of minus descent in DviFont._height_depth_of, by diff --git a/lib/matplotlib/texmanager.py b/lib/matplotlib/texmanager.py index edac2fec9c79..f53377cf5597 100644 --- a/lib/matplotlib/texmanager.py +++ b/lib/matplotlib/texmanager.py @@ -230,8 +230,7 @@ def _get_tex_source(cls, tex, fontsize): r"% last line's baseline.", rf"\fontsize{{{fontsize}}}{{{baselineskip}}}%", r"\ifdefined\psfrag\else\hbox{}\fi%", - rf"{{\obeylines{fontcmd} {tex}}}%", - r"\special{matplotlibbaselinemarker}%", + rf"{{{fontcmd} {tex}}}%", r"\end{document}", ]) diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index 3c998d540c48..ccf6ce879b2a 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -302,8 +302,7 @@ def _get_layout(self, renderer): of a rotated text when necessary. """ thisx, thisy = 0.0, 0.0 - text = self.get_text() - lines = [text] if self.get_usetex() else text.split("\n") # Not empty. + lines = self.get_text().split("\n") # Ensures lines is not empty. ws = [] hs = [] From 8e840d7e3d4ec18b6c00ea3c52f23b71ad10e51b Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Mon, 3 Oct 2022 13:19:47 -0700 Subject: [PATCH 036/194] Backport PR #24084: Revert argument checking for label_mode --- lib/mpl_toolkits/axes_grid1/axes_grid.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/mpl_toolkits/axes_grid1/axes_grid.py b/lib/mpl_toolkits/axes_grid1/axes_grid.py index 2435f2258e25..b2fe5d249609 100644 --- a/lib/mpl_toolkits/axes_grid1/axes_grid.py +++ b/lib/mpl_toolkits/axes_grid1/axes_grid.py @@ -269,7 +269,6 @@ def set_label_mode(self, mode): - "1": Only the bottom left axes is labelled. - "all": all axes are labelled. """ - _api.check_in_list(["all", "L", "1"], mode=mode) if mode == "all": for ax in self.axes_all: _tick_only(ax, False, False) @@ -290,7 +289,7 @@ def set_label_mode(self, mode): ax = col[-1] _tick_only(ax, bottom_on=False, left_on=True) - else: # "1" + elif mode == "1": for ax in self.axes_all: _tick_only(ax, bottom_on=True, left_on=True) From fd4bd8002276d5c69a5b706ddeb82c0073979aa3 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Thu, 6 Oct 2022 04:37:27 -0400 Subject: [PATCH 037/194] Backport PR #23684: Fix rectangle and hatches for colorbar --- lib/matplotlib/colorbar.py | 17 +++++++--- .../test_colorbar/contourf_extend_patches.png | Bin 0 -> 65946 bytes lib/matplotlib/tests/test_colorbar.py | 30 ++++++++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_colorbar/contourf_extend_patches.png diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index ee47d2107fd6..2983e3fa51ce 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -606,10 +606,13 @@ def _update_dividers(self): self.dividers.set_segments(segments) def _add_solids_patches(self, X, Y, C, mappable): - hatches = mappable.hatches * len(C) # Have enough hatches. + hatches = mappable.hatches * (len(C) + 1) # Have enough hatches. + if self._extend_lower(): + # remove first hatch that goes into the extend patch + hatches = hatches[1:] patches = [] for i in range(len(X) - 1): - xy = np.array([[X[i, 0], Y[i, 0]], + xy = np.array([[X[i, 0], Y[i, 1]], [X[i, 1], Y[i, 0]], [X[i + 1, 1], Y[i + 1, 0]], [X[i + 1, 0], Y[i + 1, 1]]]) @@ -661,9 +664,9 @@ def _do_extends(self, ax=None): mappable = getattr(self, 'mappable', None) if (isinstance(mappable, contour.ContourSet) and any(hatch is not None for hatch in mappable.hatches)): - hatches = mappable.hatches + hatches = mappable.hatches * (len(self._y) + 1) else: - hatches = [None] + hatches = [None] * (len(self._y) + 1) if self._extend_lower(): if not self.extendrect: @@ -687,6 +690,8 @@ def _do_extends(self, ax=None): zorder=np.nextafter(self.ax.patch.zorder, -np.inf)) self.ax.add_patch(patch) self._extend_patches.append(patch) + # remove first hatch that goes into the extend patch + hatches = hatches[1:] if self._extend_upper(): if not self.extendrect: # triangle @@ -699,10 +704,12 @@ def _do_extends(self, ax=None): # add the patch val = 0 if self._long_axis().get_inverted() else -1 color = self.cmap(self.norm(self._values[val])) + hatch_idx = len(self._y) - 1 patch = mpatches.PathPatch( mpath.Path(xy), facecolor=color, alpha=self.alpha, linewidth=0, antialiased=False, - transform=self.ax.transAxes, hatch=hatches[-1], clip_on=False, + transform=self.ax.transAxes, hatch=hatches[hatch_idx], + clip_on=False, # Place it right behind the standard patches, which is # needed if we updated the extends zorder=np.nextafter(self.ax.patch.zorder, -np.inf)) diff --git a/lib/matplotlib/tests/baseline_images/test_colorbar/contourf_extend_patches.png b/lib/matplotlib/tests/baseline_images/test_colorbar/contourf_extend_patches.png new file mode 100644 index 0000000000000000000000000000000000000000..0e5ef52cf549e15ae9ea2b49e81468db15b9c296 GIT binary patch literal 65946 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 Date: Thu, 6 Oct 2022 14:06:55 -0400 Subject: [PATCH 038/194] Backport PR #24088: MNT: make orphaned colorbar deprecate versus raise --- lib/matplotlib/figure.py | 6 ++++-- lib/matplotlib/tests/test_colorbar.py | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 4aebc1696543..1636e201019b 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -1253,11 +1253,13 @@ def colorbar( # Store the value of gca so that we can set it back later on. if cax is None: if ax is None: - raise ValueError( + _api.warn_deprecated("3.6", message=( 'Unable to determine Axes to steal space for Colorbar. ' + 'Using gca(), but will raise in the future. ' 'Either provide the *cax* argument to use as the Axes for ' 'the Colorbar, provide the *ax* argument to steal space ' - 'from it, or add *mappable* to an Axes.') + 'from it, or add *mappable* to an Axes.')) + ax = self.gca() current_ax = self.gca() userax = False if (use_gridspec and isinstance(ax, SubplotBase)): diff --git a/lib/matplotlib/tests/test_colorbar.py b/lib/matplotlib/tests/test_colorbar.py index ee10c5b6befc..4336b761f698 100644 --- a/lib/matplotlib/tests/test_colorbar.py +++ b/lib/matplotlib/tests/test_colorbar.py @@ -1,10 +1,12 @@ import numpy as np import pytest +from matplotlib import _api from matplotlib import cm import matplotlib.colors as mcolors import matplotlib as mpl + from matplotlib import rc_context from matplotlib.testing.decorators import image_comparison import matplotlib.pyplot as plt @@ -319,7 +321,8 @@ def test_parentless_mappable(): pc = mpl.collections.PatchCollection([], cmap=plt.get_cmap('viridis')) pc.set_array([]) - with pytest.raises(ValueError, match='Unable to determine Axes to steal'): + with pytest.warns(_api.MatplotlibDeprecationWarning, + match='Unable to determine Axes to steal'): plt.colorbar(pc) From 688e3cab4b247d4bdc4a839d1ce01ee4667bd4cb Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Thu, 6 Oct 2022 23:07:24 -0400 Subject: [PATCH 039/194] Backport PR #24109: DOC: add API change note for colorbar deprecation --- doc/api/next_api_changes/deprecations/24088-JMK.rst | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 doc/api/next_api_changes/deprecations/24088-JMK.rst diff --git a/doc/api/next_api_changes/deprecations/24088-JMK.rst b/doc/api/next_api_changes/deprecations/24088-JMK.rst new file mode 100644 index 000000000000..caa7e93a05b4 --- /dev/null +++ b/doc/api/next_api_changes/deprecations/24088-JMK.rst @@ -0,0 +1,9 @@ +Colorbars for orphaned mappables are deprecated, but no longer raise +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Before 3.6.0, Colorbars for mappables that do not have a parent axes would +steal space from the current Axes. 3.6.0 raised an error on this, but without +a deprecation cycle. For 3.6.1 this is reverted, the current axes is used, +but a deprecation warning is shown instead. In this undetermined case users +and libraries should explicitly specify what axes they want space to be stolen +from: ``fig.colorbar(mappable, ax=plt.gca())``. From 0c248accc8f597ac8217ce9fe5bba049699b6194 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Fri, 7 Oct 2022 10:02:51 +0200 Subject: [PATCH 040/194] Backport PR #24115: Fix mask lookup in fill_between for NumPy 1.24+ --- lib/matplotlib/axes/_axes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 9df42e0c4d0b..e5e34c91257d 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5256,7 +5256,7 @@ def _fill_between_x_or_y( raise ValueError(f"where size ({where.size}) does not match " f"{ind_dir} size ({ind.size})") where = where & ~functools.reduce( - np.logical_or, map(np.ma.getmask, [ind, dep1, dep2])) + np.logical_or, map(np.ma.getmaskarray, [ind, dep1, dep2])) ind, dep1, dep2 = np.broadcast_arrays( np.atleast_1d(ind), dep1, dep2, subok=True) From 305a146e7bcf28abe0decc67770f2bbfd39015f0 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Fri, 7 Oct 2022 10:04:16 +0200 Subject: [PATCH 041/194] Backport PR #24113: Add exception class to pytest.warns calls --- lib/matplotlib/tests/test_axes.py | 6 ++++-- lib/matplotlib/tests/test_colors.py | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 3864a39c274d..d6d44bcdb283 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -491,13 +491,15 @@ def test_subclass_clear_cla(): # Note, we cannot use mocking here as we want to be sure that the # superclass fallback does not recurse. - with pytest.warns(match='Overriding `Axes.cla`'): + with pytest.warns(PendingDeprecationWarning, + match='Overriding `Axes.cla`'): class ClaAxes(Axes): def cla(self): nonlocal called called = True - with pytest.warns(match='Overriding `Axes.cla`'): + with pytest.warns(PendingDeprecationWarning, + match='Overriding `Axes.cla`'): class ClaSuperAxes(Axes): def cla(self): nonlocal called diff --git a/lib/matplotlib/tests/test_colors.py b/lib/matplotlib/tests/test_colors.py index f0c23038e11a..6d618c1b847c 100644 --- a/lib/matplotlib/tests/test_colors.py +++ b/lib/matplotlib/tests/test_colors.py @@ -117,7 +117,7 @@ def test_double_register_builtin_cmap(): mpl.colormaps[name], name=name, force=True ) with pytest.raises(ValueError, match='A colormap named "viridis"'): - with pytest.warns(): + with pytest.warns(PendingDeprecationWarning): cm.register_cmap(name, mpl.colormaps[name]) with pytest.warns(UserWarning): # TODO is warning more than once! @@ -128,7 +128,7 @@ def test_unregister_builtin_cmap(): name = "viridis" match = f'cannot unregister {name!r} which is a builtin colormap.' with pytest.raises(ValueError, match=match): - with pytest.warns(): + with pytest.warns(PendingDeprecationWarning): cm.unregister_cmap(name) From 3863297228c2832770ab15dbc4b3406b19253eb7 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 8 Oct 2022 01:02:06 -0400 Subject: [PATCH 042/194] Backport PR #24111: FIX: add missing method to ColormapRegistry --- .../api_changes_3.6.0/deprecations.rst | 9 +++- lib/matplotlib/cm.py | 48 ++++++++++++++++--- lib/matplotlib/tests/test_colors.py | 20 ++++++++ 3 files changed, 68 insertions(+), 9 deletions(-) diff --git a/doc/api/prev_api_changes/api_changes_3.6.0/deprecations.rst b/doc/api/prev_api_changes/api_changes_3.6.0/deprecations.rst index d59077d2b2d2..3a9e91e12289 100644 --- a/doc/api/prev_api_changes/api_changes_3.6.0/deprecations.rst +++ b/doc/api/prev_api_changes/api_changes_3.6.0/deprecations.rst @@ -52,7 +52,12 @@ In Matplotlib 3.6 we have marked those top level functions as pending deprecation with the intention of deprecation in Matplotlib 3.7. The following functions have been marked for pending deprecation: -- ``matplotlib.cm.get_cmap``; use ``matplotlib.colormaps[name]`` instead +- ``matplotlib.cm.get_cmap``; use ``matplotlib.colormaps[name]`` instead if you + have a `str`. + + **Added 3.6.1** Use `matplotlib.cm.ColormapRegistry.get_cmap` if you + have a string, `None` or a `matplotlib.colors.Colormap` object that you want + to convert to a `matplotlib.colors.Colormap` instance. - ``matplotlib.cm.register_cmap``; use `matplotlib.colormaps.register <.ColormapRegistry.register>` instead - ``matplotlib.cm.unregister_cmap``; use `matplotlib.colormaps.unregister @@ -305,7 +310,7 @@ Backend-specific deprecations private functions if you rely on it. - ``backend_svg.generate_transform`` and ``backend_svg.generate_css`` - ``backend_tk.NavigationToolbar2Tk.lastrect`` and - ``backend_tk.RubberbandTk.lastrect`` + ``backend_tk.RubberbandTk.lastrect`` - ``backend_tk.NavigationToolbar2Tk.window``; use ``toolbar.master`` instead. - ``backend_tools.ToolBase.destroy``; To run code upon tool removal, connect to the ``tool_removed_event`` event. diff --git a/lib/matplotlib/cm.py b/lib/matplotlib/cm.py index f6e5ee8b7156..ec0d472992ef 100644 --- a/lib/matplotlib/cm.py +++ b/lib/matplotlib/cm.py @@ -61,12 +61,6 @@ class ColormapRegistry(Mapping): r""" Container for colormaps that are known to Matplotlib by name. - .. admonition:: Experimental - - While we expect the API to be final, we formally mark it as - experimental for 3.5 because we want to keep the option to still adapt - the API for 3.6 should the need arise. - The universal registry instance is `matplotlib.colormaps`. There should be no need for users to instantiate `.ColormapRegistry` themselves. @@ -193,6 +187,38 @@ def unregister(self, name): "colormap.") self._cmaps.pop(name, None) + def get_cmap(self, cmap): + """ + Return a color map specified through *cmap*. + + Parameters + ---------- + cmap : str or `~matplotlib.colors.Colormap` or None + + - if a `.Colormap`, return it + - if a string, look it up in ``mpl.colormaps`` + - if None, return the Colormap defined in :rc:`image.cmap` + + Returns + ------- + Colormap + """ + # get the default color map + if cmap is None: + return self[mpl.rcParams["image.cmap"]] + + # if the user passed in a Colormap, simply return it + if isinstance(cmap, colors.Colormap): + return cmap + if isinstance(cmap, str): + _api.check_in_list(sorted(_colormaps), cmap=cmap) + # otherwise, it must be a string so look it up + return self[cmap] + raise TypeError( + 'get_cmap expects None or an instance of a str or Colormap . ' + + f'you passed {cmap!r} of type {type(cmap)}' + ) + # public access to the colormaps should be via `matplotlib.colormaps`. For now, # we still create the registry here, but that should stay an implementation @@ -281,7 +307,12 @@ def _get_cmap(name=None, lut=None): # pyplot. get_cmap = _api.deprecated( '3.6', - name='get_cmap', pending=True, alternative="``matplotlib.colormaps[name]``" + name='get_cmap', + pending=True, + alternative=( + "``matplotlib.colormaps[name]`` " + + "or ``matplotlib.colormaps.get_cmap(obj)``" + ) )(_get_cmap) @@ -687,6 +718,8 @@ def _ensure_cmap(cmap): """ Ensure that we have a `.Colormap` object. + For internal use to preserve type stability of errors. + Parameters ---------- cmap : None, str, Colormap @@ -698,6 +731,7 @@ def _ensure_cmap(cmap): Returns ------- Colormap + """ if isinstance(cmap, colors.Colormap): return cmap diff --git a/lib/matplotlib/tests/test_colors.py b/lib/matplotlib/tests/test_colors.py index 6d618c1b847c..3adfce2833a6 100644 --- a/lib/matplotlib/tests/test_colors.py +++ b/lib/matplotlib/tests/test_colors.py @@ -109,6 +109,26 @@ def test_register_cmap(): cm.register_cmap('nome', cmap='not a cmap') +def test_colormaps_get_cmap(): + cr = mpl.colormaps + + # check str, and Colormap pass + assert cr.get_cmap('plasma') == cr["plasma"] + assert cr.get_cmap(cr["magma"]) == cr["magma"] + + # check default + assert cr.get_cmap(None) == cr[mpl.rcParams['image.cmap']] + + # check ValueError on bad name + bad_cmap = 'AardvarksAreAwkward' + with pytest.raises(ValueError, match=bad_cmap): + cr.get_cmap(bad_cmap) + + # check TypeError on bad type + with pytest.raises(TypeError, match='object'): + cr.get_cmap(object()) + + def test_double_register_builtin_cmap(): name = "viridis" match = f"Re-registering the builtin cmap {name!r}." From 746f3ce53d5cab0862b2a69f0a0473807d6eb514 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 8 Oct 2022 03:13:21 -0400 Subject: [PATCH 043/194] DOC: Update GitHub stats for 3.6.1 --- doc/users/github_stats.rst | 1383 ++--------------- .../prev_whats_new/github_stats_3.6.0.rst | 1292 +++++++++++++++ 2 files changed, 1409 insertions(+), 1266 deletions(-) create mode 100644 doc/users/prev_whats_new/github_stats_3.6.0.rst diff --git a/doc/users/github_stats.rst b/doc/users/github_stats.rst index e23d1e8f6fd0..7e5c3fe14a66 100644 --- a/doc/users/github_stats.rst +++ b/doc/users/github_stats.rst @@ -1,1295 +1,146 @@ .. _github-stats: -GitHub statistics for 3.6.0 (Sep 15, 2022) +GitHub statistics for 3.6.1 (Oct 08, 2022) ========================================== -GitHub statistics for 2021/11/16 (tag: v3.5.0) - 2022/09/15 +GitHub statistics for 2022/09/16 (tag: v3.6.0) - 2022/10/08 These lists are automatically generated, and may be incomplete or contain duplicates. -We closed 202 issues and merged 894 pull requests. -The full list can be seen `on GitHub `__ +We closed 22 issues and merged 80 pull requests. +The full list can be seen `on GitHub `__ -The following 174 authors contributed 4425 commits. +The following 19 authors contributed 129 commits. -* Abhishek K M -* Adeel Hassan -* agra -* Aitik Gupta -* ambi7 -* Andras Deak -* Andres Martinez -* Andrew Fennell -* andrzejnovak -* Andrés Martínez -* Anna Mastori -* AnnaMastori -* Ante Sikic * Antony Lee -* arndRemy -* Ben Root -* Biswapriyo Nath -* cavesdev -* Clément Phan -* Clément Walter -* code-review-doctor -* Connor Cozad -* Constantine Evans -* Croadden -* daniilS -* Danilo Palumbo -* David Gilbertson -* David Ketcheson -* David Matos -* David Poznik +* baharev * David Stansby -* Davide Sandonà * dependabot[bot] -* dermasugita -* Diego Solano -* Dimitri Papadopoulos -* dj4t9n -* Dmitriy Fishman -* DWesl -* Edouard Berthe -* eindH +* Eli Rykoff * Elliott Sales de Andrade -* Eric Firing -* Eric Larson -* Eric Prestat -* Federico Ariza -* Felix Nößler -* Fernando -* Gajendra Pal -* gajendra0180 -* GavinZhang +* erykoff * Greg Lucas * hannah -* Hansin Ahuja -* Harshal Prakash Patankar -* Hassan Kibirige -* Haziq Khurshid -* Henry -* henrybeUM -* Hood -* Hood Chatham * Ian Hunt-Isaak -* Ian Thomas -* igurin-invn -* ikhebgeenaccount -* Isha Mehta -* Jake Bowhay -* Jake Li -* Jake Lishman -* Jake VanderPlas -* Jakub Klus -* James Tocknell -* Jan-Hendrik Müller -* Jay Joshi -* Jay Stanley -* jayjoshi112711 -* Jeff Beck * Jody Klymak -* Joel Frederico -* Joseph Fox-Rabinovitz -* Josh Soref -* Jouni K. Seppänen -* Kayran Schmidt -* kdpenner -* Kian Eliasi -* Kinshuk Dua -* kislovskiy -* KIU Shueng Chuan -* kjain -* kolibril13 -* krassowski -* Krish-sysadmin -* Leeh Peter -* lgfunderburk -* Liam Toney -* Lucas Ricci -* Luke Davis -* luz paz -* mackopes -* MAKOMO -* MalikIdreesHasa -* Marcin Swaltek -* Mario -* Mario Sergio Valdés Tresanco -* martinRenou -* Matthew Feickert -* Matthias Bussonnier -* Mauricio Collares -* MeeseeksMachine * melissawm -* Mr-Milk -* Navid C. Constantinou -* Nickolaos Giannatos -* Nicolas P. Rougier -* Niyas Sait -* noatamir -* ojeda-e -* Olivier Gauthé * Oscar Gustafsson -* patquem -* Philipp Rohde -* Pieter Eendebak -* Pieter P -* Péter Leéh -* Qijia Liu -* Quentin Peter -* Raphael Quast -* rditlar9 -* Richard Penney -* richardsheridan -* Rike-Benjamin Schuppner -* Robert Cimrman -* Roberto Toro -* root * Ruth Comer -* Ruth G. N -* Ruth Nainggolan -* Ryan May -* Rémi Achard -* SaumyaBhushan -* Scott Jones -* Scott Shambaugh -* selormtamakloe -* Simon Hoxbro -* skywateryang -* Stefanie Molin +* slackline * Steffen Rehberg -* stone -* Sven Eschlbeck -* sveneschlbeck -* takimata -* tfpf * Thomas A Caswell * Tim Hoffmann -* Tobias Megies -* Tomas Hrnciar -* Tomasz Kuliński -* trichter -* unknown -* Uwe Hubert -* vfdev-5 -* Vishal Chandratreya -* Vishal Pankaj Chandratreya -* Vishnu V K -* vk0812 -* Vlad Korolev -* Will Qian -* William Qian -* wqh17101 -* wsykala -* yaaun -* Yannic Schroeder -* yuanx749 -* 渡邉 美希 +* مهدي شينون (Mehdi Chinoune) GitHub issues and pull requests: -Pull Requests (894): - -* :ghpull:`23814`: Consolidate release notes for 3.6 -* :ghpull:`23899`: Backport PR #23885 on branch v3.6.x (DOC: Rearrange navbar-end elements) -* :ghpull:`23898`: Backport PR #23892 on branch v3.6.x (DOC: Fix docs for linestyles in contour) -* :ghpull:`23885`: DOC: Rearrange navbar-end elements -* :ghpull:`23894`: Backport PR #23881 on branch v3.6.x (Fix Pillow compatibility in example) -* :ghpull:`23897`: Backport PR #23887 on branch v3.6.x (Add missing label argument to barh docs) -* :ghpull:`23892`: DOC: Fix docs for linestyles in contour -* :ghpull:`23887`: Add missing label argument to barh docs -* :ghpull:`23893`: Backport PR #23886 on branch v3.6.x (CI: prefer (older) binaries over (newer) sdists) -* :ghpull:`23881`: Fix Pillow compatibility in example -* :ghpull:`23886`: CI: prefer (older) binaries over (newer) sdists -* :ghpull:`23880`: Backport PR #23862 on branch v3.6.x (Remove triggering of deprecation warning in AnchoredEllipse) -* :ghpull:`23862`: Remove triggering of deprecation warning in AnchoredEllipse -* :ghpull:`23879`: Backport PR #23864 on branch v3.6.x (Correct and improve documentation for anchored artists) -* :ghpull:`23877`: Backport PR #23841 on branch v3.6.x (clarified that hist computes histogram on unbinned data) -* :ghpull:`23872`: Backport PR #23871 on branch v3.6.x (DOC: Fix formatting of pick event demo example) -* :ghpull:`23841`: clarified that hist computes histogram on unbinned data -* :ghpull:`23864`: Correct and improve documentation for anchored artists -* :ghpull:`23871`: DOC: Fix formatting of pick event demo example -* :ghpull:`23869`: Backport PR #23867 on branch v3.6.x (DOC: fix deprecation warnings in examples) -* :ghpull:`23867`: DOC: fix deprecation warnings in examples -* :ghpull:`23858`: Backport PR #23855 on branch v3.6.x (DOC: fix deprecation warnings) -* :ghpull:`23859`: Backport PR #23844 on branch v3.6.x (Further improve dev setup instructions) -* :ghpull:`23844`: Further improve dev setup instructions -* :ghpull:`23855`: DOC: fix deprecation warnings -* :ghpull:`23854`: Backport PR #23852 on branch v3.6.x (Fix cross-compiling internal freetype) -* :ghpull:`23852`: Fix cross-compiling internal freetype -* :ghpull:`23853`: Backport PR #23830 on branch v3.6.x (Start testing on Python 3.11) -* :ghpull:`23830`: Start testing on Python 3.11 -* :ghpull:`23851`: Backport PR #23850 on branch v3.6.x (removed single word in documenting doc) -* :ghpull:`23850`: removed single word in documenting doc -* :ghpull:`23848`: Backport PR #23843 on branch v3.6.x (Clarify that pycairo>=1.14.0 is needed.) -* :ghpull:`23843`: Clarify that pycairo>=1.14.0 is needed. -* :ghpull:`23842`: Backport PR #23840 on branch v3.6.x (Remove documentation for axes_grid) -* :ghpull:`23838`: Backport PR #23834 on branch v3.6.x (Revert "Refactor handling of tick and ticklabel visibility in Axis.clear") -* :ghpull:`23840`: Remove documentation for axes_grid -* :ghpull:`23837`: Backport PR #23833 on branch v3.6.x (Remove search field from sidebar) -* :ghpull:`23836`: Backport PR #23823 on branch v3.6.x ([DOC] Improve dev setup description) -* :ghpull:`23834`: Revert "Refactor handling of tick and ticklabel visibility in Axis.clear" -* :ghpull:`23833`: Remove search field from sidebar -* :ghpull:`23823`: [DOC] Improve dev setup description -* :ghpull:`23822`: Backport PR #23813 on branch v3.6.x (Triplot duplicated label) -* :ghpull:`23813`: Triplot duplicated label -* :ghpull:`23811`: Backport PR #23805 on branch v3.6.x (sphinxext: Do not copy plot_directive.css's metadata) -* :ghpull:`23805`: sphinxext: Do not copy plot_directive.css's metadata -* :ghpull:`23800`: Backport PR #23785 on branch v3.6.x (FIX: ensure type stability for missing cmaps in ``set_cmap``) -* :ghpull:`23799`: Backport PR #23790 on branch v3.6.x (DOC: Add cache busting to all static assets) -* :ghpull:`23785`: FIX: ensure type stability for missing cmaps in ``set_cmap`` -* :ghpull:`23790`: DOC: Add cache busting to all static assets -* :ghpull:`23791`: Backport PR #23774 on branch v3.6.x (Correct rcParams-name in AutoDateFormatter doc-string) -* :ghpull:`23792`: Backport PR #23781 on branch v3.6.x (ci: Add plot types to sphinx-gallery artifacts) -* :ghpull:`23789`: Backport PR #23786 on branch v3.6.x (DOC: fontfallback works for most of the backends) -* :ghpull:`23788`: Backport PR #23784 on branch v3.6.x (DOC: Fix num2date docstring) -* :ghpull:`23786`: DOC: fontfallback works for most of the backends -* :ghpull:`23784`: DOC: Fix num2date docstring -* :ghpull:`23781`: ci: Add plot types to sphinx-gallery artifacts -* :ghpull:`23783`: Backport PR #23782 on branch v3.6.x (Remove ``Axes.cla`` from examples) -* :ghpull:`23782`: Remove ``Axes.cla`` from examples -* :ghpull:`23774`: Correct rcParams-name in AutoDateFormatter doc-string -* :ghpull:`23773`: Backport PR #23772 on branch v3.6.x (3d plots what's new cleanups) -* :ghpull:`23772`: 3d plots what's new cleanups -* :ghpull:`23765`: Backport PR #23762 on branch v3.6.x (FIX: legend handler warning too liberal) -* :ghpull:`23762`: FIX: legend handler warning too liberal -* :ghpull:`23759`: Backport PR #23686 on branch v3.6.x (Improve matplotlib.pyplot importtime by caching ArtistInspector) -* :ghpull:`23686`: Improve matplotlib.pyplot importtime by caching ArtistInspector -* :ghpull:`23756`: Backport PR #23569 on branch v3.6.x (Fix hidden xlabel bug in colorbar) -* :ghpull:`23755`: Backport PR #23742 on branch v3.6.x (FIX: unbreak ipympl) -* :ghpull:`23569`: Fix hidden xlabel bug in colorbar -* :ghpull:`23742`: FIX: unbreak ipympl -* :ghpull:`23752`: Backport PR #23750 on branch v3.6.x (Fix rcParams documentation) -* :ghpull:`23749`: Backport PR #23735 on branch v3.6.x (Correctly handle Axes subclasses that override cla) -* :ghpull:`23735`: Correctly handle Axes subclasses that override cla -* :ghpull:`23748`: Backport PR #23746 on branch v3.6.x (DOC: add numpydoc docstring + commentary to Axis.get_ticklocs) -* :ghpull:`23747`: Backport PR #23721 on branch v3.6.x (3d plot view angle documentation) -* :ghpull:`23746`: DOC: add numpydoc docstring + commentary to Axis.get_ticklocs -* :ghpull:`23721`: 3d plot view angle documentation -* :ghpull:`23744`: Backport PR #23740 on branch v3.6.x (Clarify error for colorbar with unparented mappable) -* :ghpull:`23741`: Backport PR #23674 on branch v3.6.x (Re-rename builtin seaborn styles to not include a dot.) -* :ghpull:`23740`: Clarify error for colorbar with unparented mappable -* :ghpull:`23674`: Re-rename builtin seaborn styles to not include a dot. -* :ghpull:`23738`: Backport PR #23639 on branch v3.6.x (Adding the new contributor meeting) -* :ghpull:`23739`: Backport PR #23712 on branch v3.6.x (FIX: do not try to help CPython with garbage collection) -* :ghpull:`23712`: FIX: do not try to help CPython with garbage collection -* :ghpull:`23639`: Adding the new contributor meeting -* :ghpull:`23732`: Backport PR #23729 on branch v3.6.x (Use cleaner recursion check in PyQt FigureCanvas' resizeEvent.) -* :ghpull:`23734`: Backport PR #23733 on branch v3.6.x (DOC: Update theme configuration for upcoming changes) -* :ghpull:`23733`: DOC: Update theme configuration for upcoming changes -* :ghpull:`23728`: Backport PR #23722 on branch v3.6.x (Restore deprecation class aliases in cbook) -* :ghpull:`23729`: Use cleaner recursion check in PyQt FigureCanvas' resizeEvent. -* :ghpull:`23726`: Backport PR #23711 on branch v3.6.x (Fix deprecation messages for vendoring unused things) -* :ghpull:`23722`: Restore deprecation class aliases in cbook -* :ghpull:`23727`: Backport PR #23724 on branch v3.6.x (Fix/harmonize spacing in dependencies.rst.) -* :ghpull:`23724`: Fix/harmonize spacing in dependencies.rst. -* :ghpull:`23711`: Fix deprecation messages for vendoring unused things -* :ghpull:`23715`: Backport PR #23708 on branch v3.6.x (Loosen up test_Normalize test) -* :ghpull:`23713`: Backport PR #23710 on branch v3.6.x (Fix cmap deprecations) -* :ghpull:`23708`: Loosen up test_Normalize test -* :ghpull:`23710`: Fix cmap deprecations -* :ghpull:`23696`: Backport PR #23695 on branch v3.6.x (Document polar handling of _interpolation_steps.) -* :ghpull:`23706`: Backport PR #23705 on branch v3.6.x (DOC: Added link to class under discussion) -* :ghpull:`23705`: DOC: Added link to class under discussion -* :ghpull:`23695`: Document polar handling of _interpolation_steps. -* :ghpull:`23668`: Api deprecate cmap functions -* :ghpull:`23049`: Add ``minor`` keyword argument to ``plt.x/yticks`` -* :ghpull:`23665`: Harmonize docstrings for boxstyle/connectionstyle/arrowstyle. -* :ghpull:`23636`: FIX: macosx flush_events should process all events -* :ghpull:`23555`: Uncamelcase offsetTrans in draw_path_collection. -* :ghpull:`23682`: Fix generated documentation for deprecated modules -* :ghpull:`23678`: Get rcParams from mpl -* :ghpull:`23571`: Simplify _bind_draw_path_function. -* :ghpull:`23673`: DOC: Highlight information about avoiding labels in legend -* :ghpull:`22506`: Replace MathtextBackend mechanism. -* :ghpull:`23340`: Set correct path for Arc -* :ghpull:`23562`: Fix issue with get_edgecolor and get_facecolor in 3D plots -* :ghpull:`23634`: make.bat: Don't override SPHINXOPTS/O from the environment -* :ghpull:`23675`: Deprecate helper functions in axis3d -* :ghpull:`23676`: MNT: Get rcParams from mpl -* :ghpull:`23677`: TST: Use article class when checking for pgf -* :ghpull:`23669`: CI: Azure update from ubuntu-18.04 to ubuntu-latest and ubuntu-20.04 -* :ghpull:`23670`: Add bar color demo. -* :ghpull:`23644`: Standardize edge-on axis locations when viewing primary 3d axis planes -* :ghpull:`23563`: Fix issue with drawing 3D lines where points are from nparray -* :ghpull:`23666`: MNT: Deprecate macosx prepare subplots tool -* :ghpull:`23572`: Deprecate ``get_grid_positions(..., raw=True)``. -* :ghpull:`23525`: Add functionality to label individual bars with Axes.bar() -* :ghpull:`23667`: Fix flake8 errors introduced by crossed PRs -* :ghpull:`23554`: MNT: Remove unused imports -* :ghpull:`23659`: Simplify/fix save_diff_image. -* :ghpull:`23663`: Small cleanups to _find_fonts_by_props. -* :ghpull:`23662`: Add tolerance to test failing on ppc64le -* :ghpull:`23623`: MNT: remove _gridspecs attribute on Figure classes -* :ghpull:`23654`: Reverts macosx change to ARC -* :ghpull:`23661`: Remove unused fontsize argument from private mathtext _get_info. -* :ghpull:`23655`: Merge branch v3.5.x into main -* :ghpull:`23658`: Increase tolerance on multi-font tests -* :ghpull:`23657`: Add eps to extension list in image triager -* :ghpull:`23656`: Fix broken link to MathML torture tests. -* :ghpull:`23649`: CI: Use anaconda-client v1.10.0 for upload of nightlies -* :ghpull:`23647`: Allow any color format to be used for axis3d.Axis.set_pane_color -* :ghpull:`23643`: Enable wheels for PyPy 3.8+ -* :ghpull:`23621`: DOC: update and extend fonts explanation -* :ghpull:`23612`: CI: try installing a different version of noto on OSX -* :ghpull:`23619`: add pikepdf and visual c++ dependency -* :ghpull:`23631`: Leave out ``barh`` from the basic plot types. -* :ghpull:`23637`: BLD: Add Python 3.11 builds to CI -* :ghpull:`23632`: Add discouraged admonitions -* :ghpull:`23620`: Doc update deps -* :ghpull:`23627`: Bump pypa/cibuildwheel from 2.8.1 to 2.9.0 -* :ghpull:`23628`: Change Title Case to Upper lower in templates -* :ghpull:`23206`: Change exception type for incorrect SVG date metadata -* :ghpull:`23387`: Remove setuptools_scm_git_archive dependency and add sdist test -* :ghpull:`23605`: Fix issues in examples, docs, and tutorials -* :ghpull:`23618`: [Doc]: Document the position parameter in apply_aspect() -* :ghpull:`23355`: Revert "Try to unbreak CI by xfailing OSX Tk tests" -* :ghpull:`23610`: TST: be more forgiving about IDing Noto -* :ghpull:`23609`: print version number when building docs -* :ghpull:`20832`: Implement multi-font embedding for PS Backend -* :ghpull:`20804`: Implement multi-font embedding for PDF Backend -* :ghpull:`23202`: MNT: Remove cached renderer from figure -* :ghpull:`23497`: Avoid gridspec in more examples -* :ghpull:`23602`: Editing "issues for new contributors" -* :ghpull:`23600`: DOC: view_init docstring for 3d axes primary view angles -* :ghpull:`23587`: BUG:datetime list starting with none -* :ghpull:`23559`: re-base of font fallback for pdf and eps output + SVG support -* :ghpull:`23557`: BLD: update the manylinux versions used -* :ghpull:`23596`: Minor cleanup of axes_grid1 -* :ghpull:`23594`: Expire deprecation on passing bytes to FT2Font.set_text -* :ghpull:`23435`: Add conda env to setup instructions -* :ghpull:`23574`: Move colorbar() doc to method itself. -* :ghpull:`23584`: Bump Ubuntu to 20.04 on GitHub Actions -* :ghpull:`23561`: Clean up code in tri -* :ghpull:`23582`: Cleanup axis3d.Axis.draw -* :ghpull:`23510`: Refactor Widget tests -* :ghpull:`20718`: Circle: Build docs in parallel. -* :ghpull:`22452`: ENH: add ability to remove layout engine -* :ghpull:`23516`: warning when scatter plot color settings discarded -* :ghpull:`23577`: apply_aspect cleanups -* :ghpull:`23575`: Cleanup parasite_simple example. -* :ghpull:`23567`: Remove noop setattr_cm. -* :ghpull:`23412`: Fix dash offset bug in Patch -* :ghpull:`21756`: MNT: Clean up some UTF strings and memory autorelease -* :ghpull:`23558`: MNT: Use UTF-8 string in macosx backend -* :ghpull:`23550`: Change exception types, improve argument checking, and cleanups in mpl_toolkits -* :ghpull:`23196`: Unify set_pickradius argument -* :ghpull:`20740`: Implement Font-Fallback in Matplotlib -* :ghpull:`22566`: Add rcparam for figure label size and weight -* :ghpull:`23551`: Remove transform arguments from _iter_collection -* :ghpull:`23444`: Deduplicate common parts in LatexManager.{__init__,_setup_latex_process} -* :ghpull:`23017`: [ENH] : Provide axis('equal') for Axes3D (replace PR #22705) -* :ghpull:`22950`: Simplify definition of mathtext symbols & correctly end tokens in mathtext parsing -* :ghpull:`23409`: Provide axis('equal') for Axes3D (replaces PR #23017) -* :ghpull:`23434`: Fix array-like linewidth for 3d scatter -* :ghpull:`23500`: Move the common implementation of Axes.set_x/y/zscale to Axis. -* :ghpull:`23533`: Add tests for sankey and minor fixes -* :ghpull:`23535`: Make margins error as claimed in doc-string -* :ghpull:`23546`: Simplify impl. of functions optionally used as context managers. -* :ghpull:`23494`: Fix various issues from SonarQube -* :ghpull:`23529`: Add workflow dispatch GitHub CI -* :ghpull:`23539`: Small improvements to WebAgg example -* :ghpull:`23541`: Change doc-build CI install order -* :ghpull:`23526`: DOC: make "family" less ambiguous in FontProperties docs -* :ghpull:`23537`: Move the deprecated RendererGTK{3,4}Cairo to a single place. -* :ghpull:`23140`: [Features] Allow setting legend title alignment -* :ghpull:`23538`: Fix imprecise docs re: backend dependencies. -* :ghpull:`23532`: Add test for RGBAxes -* :ghpull:`23453`: Add more tests for mplot3d -* :ghpull:`23501`: Let Axes.clear iterate over Axises. -* :ghpull:`23469`: Inline _init_axis_artists & _init_gridlines into clear. -* :ghpull:`23475`: Add markerfacealt to pass-through arguments for error bar lines -* :ghpull:`23527`: STY: fix whitespace on an assert -* :ghpull:`23495`: Fix sgskip'd examples -* :ghpull:`23404`: Restore matplotlib.__doc__ in Sphinx docs -* :ghpull:`23507`: Add hint when More than {max_open_warning} figures have been opened -* :ghpull:`23499`: Fix outdated comment re: event handlers in test_backends_interactive. -* :ghpull:`23498`: Fix direct instantiation of webagg_core managers. -* :ghpull:`23504`: Clarify formatting of the code-for-reproduction field in bug reports. -* :ghpull:`23489`: Add missing test data to install -* :ghpull:`23482`: Mathtext spaces must be independent of font style. -* :ghpull:`23486`: Bump pypa/cibuildwheel from 2.8.0 to 2.8.1 -* :ghpull:`23461`: Tweak Axes repr. -* :ghpull:`16931`: Make it easier to improve UI event metadata. -* :ghpull:`23468`: Display grid in floating axes example. -* :ghpull:`23467`: Remove old handling for factor=None in axisartist. -* :ghpull:`23443`: Try running the pgf backend off the article class. -* :ghpull:`23373`: Fix pan/zoom crashing when widget lock is unavailable -* :ghpull:`23466`: Update filename in example. -* :ghpull:`23464`: Deprecate macos close handler. -* :ghpull:`23463`: Deprecate Tick.label -* :ghpull:`23455`: Deprecate properties w_xaxis, w_yaxis, and w_zaxis -* :ghpull:`23448`: Tweak callbacks to generate pick events. -* :ghpull:`23233`: Default stem marker color follows the linecolor -* :ghpull:`23452`: Generalize Axes __repr__ to 3D -* :ghpull:`23445`: Compare thread native ids when checking whether running on main thread. -* :ghpull:`20752`: Set norms using scale names. -* :ghpull:`23438`: DOC: numpydoc-ify date Locator classes -* :ghpull:`23427`: Tweak pgf escapes. -* :ghpull:`23432`: Fixed typo in docs animation api -* :ghpull:`23420`: Clean up test_chunksize_fails() -* :ghpull:`23415`: Minor improvements to units_sample example -* :ghpull:`21339`: Added linear scaling test to Hexbin marginals -* :ghpull:`23414`: Bump pypa/cibuildwheel from 2.7.0 to 2.8.0 -* :ghpull:`23413`: Combine chunk size tests into one -* :ghpull:`23403`: Small cleanup to VertexSelector. -* :ghpull:`23291`: In the new/simplified backend API, don't customize draw_if_interactive. -* :ghpull:`23350`: Fixed SVG-as-text image comparison tests. -* :ghpull:`23406`: DOC: Fix calculation of bin centers in multi-histogram -* :ghpull:`23407`: TST: Add missing warning type to pytest.warns -* :ghpull:`23402`: Link 3D animation examples to one another. -* :ghpull:`23401`: Upload wheel artifacts from the correct directory -* :ghpull:`23374`: GOV: point CoC reports at CoC steering council subcomittee mailing list -* :ghpull:`23393`: Clean up formatting of custom cmap example -* :ghpull:`23146`: Update cibuildwheel -* :ghpull:`23368`: Add a helper to generate closed paths. -* :ghpull:`20220`: DOC: add mission statement -* :ghpull:`22364`: Tweak mathtext/tex docs. -* :ghpull:`23377`: Use tick_params more often over tick iteration -* :ghpull:`22820`: [Doc] consolidate ``rect`` documentation -* :ghpull:`23371`: Default animation.convert_args to ["-layers", "OptimizePlus"]. -* :ghpull:`23148`: DOC: change address to send security issues to -* :ghpull:`23365`: DOC: add new showcase example, replace gendered one -* :ghpull:`23033`: Fix issue with tex-encoding on non-Unicode platforms -* :ghpull:`23358`: Shorten/clarify definition of extension types. -* :ghpull:`23370`: Small cleanups to animation. -* :ghpull:`23364`: Rename/change signature of PyGlyph_new. -* :ghpull:`23363`: Simplify FigureCanvas multiple inheritance init by swapping bases order. -* :ghpull:`23366`: MNT: use devel version of theme -* :ghpull:`23357`: Fixed decimal points not appearing at end of Mathtext string. -* :ghpull:`23351`: DOC/MNT install docs with dev version of sphinx theme -* :ghpull:`23349`: CI: Remove old scipy-wheels-nightly uploads to ensure space -* :ghpull:`23348`: Support multi-figure MultiCursor; prepare improving its signature. -* :ghpull:`23360`: embedding_in_tk_sgskip.py: use root.destroy -* :ghpull:`23354`: MNT: Use list comprehension -* :ghpull:`23299`: FIX/API: do not reset backend key in rc_context -* :ghpull:`23191`: ENH: add width_ratios and height_ratios to subplots -* :ghpull:`23060`: MNT: Change objective C code to Automatic Reference Counting (ARC) -* :ghpull:`23347`: Simplify/improve check for pycairo in Gtk-based backends. -* :ghpull:`23316`: DOC: improve spines crosslinking -* :ghpull:`23100`: Remove custom backend_nbagg.show(), putting logic in manager show. -* :ghpull:`23342`: FIX: make sure addFont test removes the test font -* :ghpull:`23266`: negative_linestyles kwarg in contour.py -* :ghpull:`23332`: Validate Text linespacing on input. -* :ghpull:`23336`: Remove ineffective exclusion of Arcs without parent Axes. -* :ghpull:`23341`: MNT: Use '--pytest-test-first' option for naming clarity -* :ghpull:`23337`: Remove now inexistent "datapath" rcParam from style blacklist. -* :ghpull:`22004`: Make RendererCairo auto-infer surface size. -* :ghpull:`23208`: ENH: enable stripey lines -* :ghpull:`23288`: Correct URL area with rotated texts in PDFs -* :ghpull:`23197`: Add tests for pan -* :ghpull:`22167`: Deprecate selector ``visible`` attribute -* :ghpull:`23322`: Cleanup FontProperties examples. -* :ghpull:`23321`: Tweak examples capitalization/punctuation. -* :ghpull:`23270`: Fix handling of nonmath hyphens in mathtext. -* :ghpull:`23310`: Move Cursor demo from examples/misc to examples/event_handling -* :ghpull:`23313`: Drop CSS styles that are in mpl-sphinx-theme -* :ghpull:`23314`: Don't draw invisible 3D Axes -* :ghpull:`23302`: Deprecate stem(..., use_line_collection=False) -* :ghpull:`23309`: Remove front page examples -* :ghpull:`23282`: Backport PR #22865 on branch v3.5.x (Fix issue with colorbar extend and drawedges) -* :ghpull:`23231`: Add pytest-xvfb as test dependency -* :ghpull:`23318`: No need to return OrderedDict from _gen_axes_spines. -* :ghpull:`23295`: Replace re.sub by the faster str.translate. -* :ghpull:`23300`: Modify example of "Fig Axes Customize Simple" -* :ghpull:`23014`: Improve consistency in LogLocator and LogFormatter API -* :ghpull:`23286`: Refactor URL handling in PDF backend -* :ghpull:`23065`: Fix test_image_comparison_expect_rms -* :ghpull:`23294`: Simplify binary data handling in ps backend. -* :ghpull:`23284`: DOC: Switch to HTML5 and cleanup CSS -* :ghpull:`23276`: Add get/set methods for DPI in SubFigure -* :ghpull:`23207`: Update build environment and improve test -* :ghpull:`23213`: DEV: Add name-tests-test to pre-commit hooks -* :ghpull:`23289`: Properly make Name.hexify go through a deprecation cycle. -* :ghpull:`23177`: Deprecate positional passing of most Artist constructor parameters -* :ghpull:`23287`: Minor tweaks to pdf Name. -* :ghpull:`23285`: In mathtext, replace manual caching (via ``glyphd``) by lru_cache. -* :ghpull:`23034`: Correctly read the 'style' argument while processing 'genfrac'. -* :ghpull:`23247`: Support inverted parentheses in mathtext. -* :ghpull:`23190`: Deprecate unused methods in axis.py -* :ghpull:`23219`: MNT: Rename example files with 'test' in name -* :ghpull:`23277`: MNT: Remove dead code in SVG backend -* :ghpull:`23261`: Bump actions/setup-python from 3 to 4 -* :ghpull:`23264`: Changing environment.yml for it to work on Windows -* :ghpull:`23269`: MNT: Remove dead code in Colorbar -* :ghpull:`23262`: Simplify qt_compat, in particular post-removal of qt4 support. -* :ghpull:`23263`: Private helper to get requested backend without triggering resolution. -* :ghpull:`23243`: Fix spacing after mathtext operators with sub/superscripts -* :ghpull:`22839`: Fix spacing after mathtext operators with sub/superscripts -* :ghpull:`23256`: DOC: Add note about Inkscape install on Windows -* :ghpull:`23258`: DOC: remove Blue Book url -* :ghpull:`23255`: Add a helper to generate mathtext error strings. -* :ghpull:`23246`: Fix argument checking for set_interpolation_stage -* :ghpull:`22881`: Support not embedding glyphs in svg mathtests. -* :ghpull:`23198`: Rename ncol parameter in legend to ncols -* :ghpull:`23251`: Small simplifications to mathtext tests. -* :ghpull:`23249`: Don't allow ``r"$\left\\|\right.$"``, as in TeX. -* :ghpull:`23248`: Rename test markers -* :ghpull:`22507`: Remove *math* parameter of various mathtext internal APIs. -* :ghpull:`23192`: Add tests, improve error messages in axis/_base, and code cleanup -* :ghpull:`23241`: Fix invalid value in radio buttons example -* :ghpull:`23187`: Correct docs and use keyword arguments in _mathtext.py -* :ghpull:`23045`: MNT: Merge locally defined test marks -* :ghpull:`22289`: ENH: compressed layout -* :ghpull:`23237`: Expire BoxStyle._Base deprecation. -* :ghpull:`23225`: DOC: Fix version switcher links to documentation -* :ghpull:`23221`: DOC: recommend numpy random number generator class -* :ghpull:`23223`: Changed offset reference, add small doc -* :ghpull:`23215`: DOC: link the transforms tutorial from the module -* :ghpull:`23201`: Rework tricontour and tricontourf documentation -* :ghpull:`23013`: Add tests for date module -* :ghpull:`23188`: Mnt new default dates -* :ghpull:`22745`: MNT: Don't require renderer for window_extent and tightbbox -* :ghpull:`23077`: MNT: Remove keyword arguments to gca() -* :ghpull:`23182`: Simplify webagg blitting. -* :ghpull:`23181`: Init FigureCanvasAgg._lastKey in ``__init__``. -* :ghpull:`23175`: Point the version switcher to a name listed in switcher.json -* :ghpull:`22669`: Cleanup documentation generation for pyplot -* :ghpull:`22519`: fix markevery plot option with nans in data -* :ghpull:`21584`: Move towards having get_shared_{x,y}_axes return immutable views. -* :ghpull:`23170`: ENH: update ticks when requesting labels -* :ghpull:`23169`: DOC: Migrate to sphinx-design -* :ghpull:`23180`: Improve docstring of triplot() and PatchCollection -* :ghpull:`23153`: Restore accidentally removed pytest.ini and tests.py. -* :ghpull:`23166`: Deprecate passing most Legend arguments positionally -* :ghpull:`23165`: DOCS Fix a few typos -* :ghpull:`23167`: DOCS fix typo -* :ghpull:`23062`: Add stackplot to plot types listing -* :ghpull:`23161`: Added my (open access) book -* :ghpull:`23141`: Minor fix for astropy units support broken in earlier PR -* :ghpull:`23156`: No longer call draw_if_interactive in parasite_axes. -* :ghpull:`23150`: DOC fix typo -* :ghpull:`23149`: DOCS remove duplicate text -* :ghpull:`23145`: Fix format error in switcher.json -* :ghpull:`21755`: MNT: Clean up macosx backend set_message -* :ghpull:`23128`: DOCS Fix typos -* :ghpull:`23130`: Drop pytest warning config in nightly tests -* :ghpull:`23135`: Unpin coverage again -* :ghpull:`23133`: Make module deprecation messages consistent -* :ghpull:`23134`: Remove newline from start of deprecation warnings -* :ghpull:`22964`: Fix spelling errors -* :ghpull:`22929`: Handle NaN in bar labels and error bars -* :ghpull:`23093`: MNT: Removing 3.4 deprecations -* :ghpull:`23090`: Derive new_figure_manager from FigureCanvas.new_manager. -* :ghpull:`23099`: Remove unneeded cutout for webagg in show(). -* :ghpull:`23097`: Tweak check for IPython pylab mode. -* :ghpull:`23088`: Improve error for invalid format strings / misspelled data keys. -* :ghpull:`23092`: Ensure updated monkey-patching of sphinx-gallery EXAMPLE_HEADER -* :ghpull:`23087`: Fix width/height inversion in dviread debug helper. -* :ghpull:`23089`: Normalize tk load failures to ImportErrors. -* :ghpull:`23091`: Move test that fig.add_axes() needs parameters -* :ghpull:`23067`: more explicit in windows doc build instructions -* :ghpull:`23081`: MNT: Deprecate date_ticker_factory -* :ghpull:`23079`: MNT: Remove key_press and button_press from FigureManager -* :ghpull:`23076`: MNT: Remove positional argument handling in LineCollection -* :ghpull:`23078`: MNT: Remove deprecated axis.cla() -* :ghpull:`23054`: Slightly simplify tcl/tk load in extension. -* :ghpull:`23073`: MNT: Remove dummy_threading because threading is always available -* :ghpull:`22405`: DOC: put the gallery keywords in the meta tag -* :ghpull:`23071`: Fix installing contourpy on CI -* :ghpull:`23068`: Slight refactor of _c_internal_utils to linewrap it better. -* :ghpull:`23070`: Pathlibify autotools invocation in build. -* :ghpull:`22755`: Maybe run autogen as part of freetype install -* :ghpull:`23063`: doc: mathtext example: use axhspan() instead of fill_between() for backdrop rectangle shading -* :ghpull:`23055`: Cleanup Annotation.update_position. -* :ghpull:`22567`: Use contourpy for quad contour calculations -* :ghpull:`22801`: TST: fully parameterize test_lazy_linux_headless -* :ghpull:`22180`: ENH: Use rcParams savefig.directory on macosx backend -* :ghpull:`23048`: Add rrulewrapper to docs -* :ghpull:`23047`: Fix issue with hist and float16 data -* :ghpull:`23044`: Fix missing section header for nightly builds -* :ghpull:`23029`: Demonstrate both usetex and non-usetex in demo_text_path.py. -* :ghpull:`23038`: Factor out errorevery parsing for 2D and 3D errorbars. -* :ghpull:`23036`: Suppress traceback chaining for tex subprocess failures. -* :ghpull:`23037`: Suppress exception chaining in FontProperties. -* :ghpull:`23020`: Add test to close legend issue -* :ghpull:`23031`: Specify that style files are utf-8. -* :ghpull:`22991`: Enable ``plt.sca`` on subfigure's axes -* :ghpull:`23030`: DOC: Fix charset declaration in redirects -* :ghpull:`23022`: Fix some possible encoding issues for non-utf8 systems. -* :ghpull:`23023`: Bump docker/setup-qemu-action from 1 to 2 -* :ghpull:`23024`: DOC: do not suggest to sudo pip install Matplotlib -* :ghpull:`23018`: Fix typo in font family -* :ghpull:`22627`: ENH: rect for constrained_layout -* :ghpull:`22891`: Font example monospace -* :ghpull:`23006`: docs: add subplot-mosaic string compact notation -* :ghpull:`23009`: Fixed installation guide command typo -* :ghpull:`22926`: Fix RangeSlider for same init values #22686 -* :ghpull:`22989`: Merge v3.5.x back into main -* :ghpull:`22993`: STY: Fix typos in colormap -* :ghpull:`22777`: DEV: Add codespell to pre-commit hooks -* :ghpull:`22940`: Fixed dpi bug in rainbow text example -* :ghpull:`22298`: MNT: Remove cmap_d colormap access -* :ghpull:`22387`: Add a registry for color sequences -* :ghpull:`21594`: Document text alignment -* :ghpull:`22967`: TST: Add some tests for QuadMesh contains function -* :ghpull:`22936`: ENH: Add full-screen toggle to the macosx backend -* :ghpull:`22886`: MNT: remove mpl_toolkits.axes_grid -* :ghpull:`22952`: Make MarkerStyle immutable -* :ghpull:`22953`: MNT: Move set_cursor to the FigureCanvas -* :ghpull:`18854`: Standardize creation of FigureManager from a given FigureCanvas class. -* :ghpull:`22925`: Standardize creation of FigureManager from a given FigureCanvas class. -* :ghpull:`22875`: Remove Forward definitions where possible. -* :ghpull:`22928`: ENH: Add option to disable raising the window for macosx -* :ghpull:`22912`: DOC: Better doc of colors -* :ghpull:`22931`: BUG: Fix regression with ls=(0, ()) -* :ghpull:`22909`: FIX: skip sub directories when finding fonts on windows -* :ghpull:`22911`: Clarify docstring of [un]install_repl_displayhook() -* :ghpull:`22919`: CI: Add concurrency skips for GH Actions -* :ghpull:`22899`: Fix documentation markup issues -* :ghpull:`22906`: Clarify logic for repl displayhook. -* :ghpull:`22892`: Remove support for IPython<4. -* :ghpull:`22896`: Remove python-dateutil as test requirement -* :ghpull:`22885`: Deprecate two-layered backend_pdf.Op enum. -* :ghpull:`22883`: Tweak argument checking in tripcolor(). -* :ghpull:`22884`: Missing ``f`` prefix on f-strings fix -* :ghpull:`22877`: Small cleanups to mathtext. -* :ghpull:`21374`: Snap selectors -* :ghpull:`22824`: Remove some unnecessary extra boundaries for colorbars with extensions. -* :ghpull:`21448`: Use named groups in mathtext parser. -* :ghpull:`22609`: Improve usability of dviread.Text by third parties. -* :ghpull:`22809`: STY: Apply pre-commit hooks to codebase -* :ghpull:`22730`: Fix removed cross-references -* :ghpull:`22857`: Slightly simplify twin axes detection in MEP22 zoom. -* :ghpull:`22813`: MNT: Deprecate figure callbacks -* :ghpull:`22802`: MNT: make Axes.cla an alias for Axes.clear in all cases -* :ghpull:`22855`: Remove non-needed remove_text=False. -* :ghpull:`22854`: TST: Avoid floating point errors in asinh ticker -* :ghpull:`22850`: Simplify tick creation -* :ghpull:`22841`: Fix Tk error when updating toolbar checkbutton images -* :ghpull:`22707`: Proposed ENH: Allow user to turn off breaking of streamlines in streamplot (rebased) -* :ghpull:`22826`: Bump actions/upload-artifact from 2 to 3 -* :ghpull:`22825`: Bump codecov/codecov-action from 2 to 3 -* :ghpull:`22821`: Use bool for bool keyword arguments -* :ghpull:`22815`: Fix pickling of globally available, dynamically generated norm classes. -* :ghpull:`22702`: Doc tweak transform tutorial -* :ghpull:`22613`: DOC: Add links to explicit vs implicit API everywhere "OO" is used -* :ghpull:`22712`: Use repr in error messages -* :ghpull:`22794`: Fix ps export of colored hatches with no linewidth -* :ghpull:`22797`: Deprecate functions in backends -* :ghpull:`22608`: Axes.inset_axes: enable Axes subclass creation -* :ghpull:`22795`: Replace "marker simplification" by "marker subsampling" in docs. -* :ghpull:`22768`: Fix inkscape tests -* :ghpull:`22791`: Tweak _ConverterError reporting. -* :ghpull:`22447`: Improve bar_label annotation -* :ghpull:`22710`: Fix the error- TypeError: 'float' object is not iterable -* :ghpull:`22444`: Revert "CI: skip test to work around gs bug" -* :ghpull:`22785`: CI: Update weekly dependency test job -* :ghpull:`22784`: Fix 'misspelled' transform variable -* :ghpull:`22778`: Fix LaTeX formatting in examples -* :ghpull:`22779`: Improve mlab documentation (and example) -* :ghpull:`22759`: MNT: Skip existing wheels during nightly wheel upload -* :ghpull:`22751`: BLD: do not put an upper bound on pyparsing -* :ghpull:`22752`: DOC: Correct nightly wheels pip install command -* :ghpull:`22742`: Fix deprecation of backend_tools.ToolBase.destroy -* :ghpull:`22725`: Move towards making texmanager stateless. -* :ghpull:`22734`: Added clim support to tripcolor -* :ghpull:`22733`: CI: Add GHA workflow to upload nightly wheels -* :ghpull:`21637`: Also upload a subset of nightly wheels -* :ghpull:`22698`: Correct cross-references in documentation -* :ghpull:`22263`: DOC: condense version switcher -* :ghpull:`22361`: Revert datetime usetex ticklabels to use default tex font. -* :ghpull:`22721`: Small style fixes. -* :ghpull:`22356`: Cleanup tripcolor() -* :ghpull:`22360`: Let TeX handle multiline strings itself. -* :ghpull:`22418`: Deprecate auto-removal of overlapping Axes by plt.subplot{,2grid}. -* :ghpull:`22722`: Rename confusingly-named cm_fallback. -* :ghpull:`22697`: Deprecate in testing.decorators -* :ghpull:`22556`: Add text.parse_math rcParams -* :ghpull:`22163`: Change colour of Tk toolbar icons on dark backgrounds -* :ghpull:`22704`: Small simplification to textpath. -* :ghpull:`22498`: TST: increase coverage on tk tests -* :ghpull:`21425`: Make Axis3D constructor signature closer to the one of 2D axis. -* :ghpull:`22665`: Improve error message for incorrect color string -* :ghpull:`22685`: Rewrite plot format detection from sphinx build target -* :ghpull:`22670`: Update deprecated vmImage 'vs2017-win2016' in azure pipelines -* :ghpull:`22503`: Deprecate backend_qt.qApp. -* :ghpull:`22683`: Add missing space before : for parameters -* :ghpull:`22591`: Fix Path/str-discrepancy in FontManager.addpath and improve documentation -* :ghpull:`22680`: Bump actions/cache from 2 to 3 -* :ghpull:`22659`: Add description on quiver head parameters -* :ghpull:`22668`: Raise on missing closing quotes in matplotlibrc -* :ghpull:`22675`: Tweak colorbar_placement example. -* :ghpull:`22276`: Merge "Scatter Symbol" and "Scatter Custom Symbol" examples -* :ghpull:`22658`: Remove reference to now-deleted reminder note. -* :ghpull:`22652`: Update documentation example and fix See also -* :ghpull:`22587`: Refactor handling of tick and ticklabel visibility in Axis.clear() -* :ghpull:`22148`: MNT: Deprecate ``docstring`` -* :ghpull:`22170`: Add example to polygon selector docstring showing how to set vertices programmatically -* :ghpull:`22650`: Fix new leak in ft2font introduced in #22604 -* :ghpull:`22644`: FIX: Flush events after closing figures in macosx backend -* :ghpull:`22643`: Suppress exception chaining in colormap lookup. -* :ghpull:`22639`: ENH: MacOSX backend to use sRGB instead of GenericRGB colorspace -* :ghpull:`22509`: Simplifications to ToolManager.{add,remove}_tool. -* :ghpull:`22633`: DOC: remove space in directive. -* :ghpull:`22631`: Add space between individual transform components in svg output. -* :ghpull:`22523`: MNT: Use a context manager to change the norm in colorbar code -* :ghpull:`22615`: FIX: Change get_axis_map to axis_map now -* :ghpull:`22508`: Move tracking of autoscale status to Axis. -* :ghpull:`22547`: Small cleanups around TexManager usage. -* :ghpull:`22511`: Remove redundant rcParam-lookup in patches -* :ghpull:`22516`: Expire deprecations in backends -* :ghpull:`22612`: Updated grammar to reflect more common usage of output vs outputted in animation.py -* :ghpull:`22589`: Support quoted strings in matplotlibrc -* :ghpull:`22604`: MNT: Fix types in C-code to reduce warnings -* :ghpull:`22610`: Fix alternative suggestion in epoch2num() deprecation -* :ghpull:`22554`: Prepare for making create_dummy_axis not necessary. -* :ghpull:`22607`: ENH: Add dark/light mode theme to the buttons -* :ghpull:`21790`: FIX: Update blitting and drawing on the macosx backend -* :ghpull:`22175`: FIX: Update macosx animation handling -* :ghpull:`22569`: Require non-zero dash value -* :ghpull:`22544`: Correct paper sizes -* :ghpull:`20470`: Issues warnings for legend handles without handlers -* :ghpull:`22558`: MNT: Simplify imports -* :ghpull:`22580`: fix doc for annotation_clip parameter -* :ghpull:`22581`: DOC: fix various typos -* :ghpull:`22573`: Bump actions/setup-python from 2 to 3 -* :ghpull:`22568`: Rename qhull source to _qhull_wrapper.cpp. -* :ghpull:`22561`: FIX: Handle stopped animation figure resize -* :ghpull:`22562`: TST: Add a frame test for animations -* :ghpull:`22514`: Expire deprecations in cbook.deprecation -* :ghpull:`22555`: Use picklable callbacks for DraggableBase. -* :ghpull:`22552`: Tweak dependency checking in doc/conf.py. -* :ghpull:`22550`: Require sphinx>=3 & numpydoc>=1.0 for building docs. -* :ghpull:`22539`: Deprecate toplevel mpl.text.get_rotation; normalize rotations early. -* :ghpull:`22502`: Cleanup unused imports and variables in backends -* :ghpull:`20071`: Document, test, and simplify impl. of auto_adjustable_area. -* :ghpull:`22366`: Deprecation removal/updates in axes3d -* :ghpull:`22484`: Simplify the internal API to connect picklable callbacks. -* :ghpull:`22417`: Support passing rgbaFace as an array to agg's draw_path. -* :ghpull:`22412`: Turn _get_axis_map() into a property and remove _get_axis_list() -* :ghpull:`22486`: Expire deprecations in lines and patches -* :ghpull:`22512`: Increase coverage -* :ghpull:`22504`: Simplify FontProperties init. -* :ghpull:`22497`: Remove entries of MathTextParser._backend_mapping deprecated in 3.4. -* :ghpull:`22487`: Don't key MathTextParser cache off a mutable FontProperties. -* :ghpull:`22468`: Turn _mathtext.ship into a plain function. -* :ghpull:`22490`: Deprecate unused, untested Affine2D.identity(). -* :ghpull:`22491`: Linewrap setupext to 79 character lines. -* :ghpull:`22488`: Some more maintenance for mathtext internal implementation. -* :ghpull:`22485`: Change string representation of AxesImage -* :ghpull:`22240`: Add minimum macosx version -* :ghpull:`22480`: Remove _point_size_reduction. -* :ghpull:`22204`: Cleanup _mathtext internal API -* :ghpull:`22469`: Improve readability of mathtext internal structures. -* :ghpull:`22477`: Un-pyplot some examples which were already explicitly referencing axes. -* :ghpull:`22467`: Small cleanup to font handling in agg. -* :ghpull:`21178`: Add asinh axis scaling (*smooth* symmetric logscale) -* :ghpull:`22411`: Move cbook._define_aliases() to _api.define_aliases() -* :ghpull:`22465`: Deprecate unused AddList. -* :ghpull:`22451`: Clarify error message for bad keyword arguments. -* :ghpull:`21267`: Cleanup AnnotationBbox. -* :ghpull:`22464`: Small improvements related to radar_chart example. -* :ghpull:`22421`: Make most params to figure()/Figure() kwonly. -* :ghpull:`22457`: Copy arrowprops argument to FancyAnnotationBbox. -* :ghpull:`22454`: move ``_toolbar_2`` from webagg_core to webagg -* :ghpull:`22413`: Remove some trivial private getters/setters in axisartist -* :ghpull:`21634`: TST: Add future dependency tests as a weekly CI job -* :ghpull:`22079`: Share FigureManager class between gtk3 and gtk4. -* :ghpull:`22440`: Clarify warning about labels with leading underscores. -* :ghpull:`17488`: Make error message explicit in legend.py -* :ghpull:`22453`: Simplify impl. of polar limits setting API. -* :ghpull:`22449`: Small cleanup to quiver. -* :ghpull:`22415`: Make emit and auto args of set_{x,y,z}lim keyword only. -* :ghpull:`22422`: Deprecate backend_ps.convert_psfrags. -* :ghpull:`22194`: Drop support for Python 3.7 -* :ghpull:`22234`: Partial fix for grid alpha -* :ghpull:`22433`: Fix ambiguous link targets in docs. -* :ghpull:`22420`: Update plt.figure() docstring. -* :ghpull:`22388`: Make signature of Axes.annotate() more explicit. -* :ghpull:`22419`: Remove "Matplotlib version" from docs issue template -* :ghpull:`22423`: Avoid indiscriminate glob-remove in xpdf_distill. -* :ghpull:`22406`: [DOC]: Removed a redundant 'The' -* :ghpull:`21442`: Factor out common limits handling for x/y/z axes. -* :ghpull:`22397`: Axes capitalization in widgets and axes3d -* :ghpull:`22394`: Tweak Axes3D docstrings that refer to 2D plotting methods. -* :ghpull:`22383`: TST: fix doc build -* :ghpull:`21877`: DOC: attempt to explain the main different APIs -* :ghpull:`21238`: Raise when unknown signals are connected to CallbackRegistries. -* :ghpull:`22345`: MNT: make layout deprecations pending -* :ghpull:`21597`: FIX: Remove the deepcopy override from transforms -* :ghpull:`22370`: Replace tabs with spaces in C code. -* :ghpull:`22371`: Corrected a mistake in comments (Issue #22369) -* :ghpull:`21352`: Refactor hexbin(). -* :ghpull:`19214`: Improve autoscaling for high order Bezier curves -* :ghpull:`22268`: Deprecated is_decade and is_close_to_int -* :ghpull:`22359`: Slightly refactor TeX source generation. -* :ghpull:`22365`: Remove deprecated ``MovieWriter.cleanup`` -* :ghpull:`22363`: Properly capitalize "Unicode". -* :ghpull:`22025`: Deprecate various custom FigureFrameWx attributes/methods. -* :ghpull:`21391`: Reuse imsave()'s background-blending code in FigureCanvasAgg.print_jpeg. -* :ghpull:`22026`: Simplify wxframe deletion. -* :ghpull:`22351`: Fix "trailing" whitespace in C docstrings. -* :ghpull:`22342`: Docstrings for _qhull. -* :ghpull:`21836`: Slightly shorten ft2font init. -* :ghpull:`21962`: Privatize various internal APIs of backend_pgf. -* :ghpull:`22114`: Rewrite AxesStack independently of cbook.Stack. -* :ghpull:`22332`: Let TransformedPatchPath inherit most functionality from TransformedPath. -* :ghpull:`22292`: Cleanup Axis._translate_tick_kw -* :ghpull:`22339`: wx.App() should be init'ed in new_figure_manager_given_figure -* :ghpull:`22315`: More standardization of floating point slop in mpl_toolkits. -* :ghpull:`22337`: DOC: More cleanup axes -> Axes -* :ghpull:`22323`: Replace sole use of maxdict by lru_cache. -* :ghpull:`22229`: FIX: make safe to add / remove artists during ArtistList iteration -* :ghpull:`22196`: ``dates`` classes and functions support ``tz`` both as string and ``tzinfo`` -* :ghpull:`22161`: Add box when setting ``PolygonSelector.verts`` -* :ghpull:`19368`: Raise warning and downsample if data given to _image.resample is too large -* :ghpull:`22250`: Unify toolbar init across backends. -* :ghpull:`22304`: Added tests for ContourSet.legend_elements -* :ghpull:`21583`: Add pre-commit config and dev instructions -* :ghpull:`21547`: Custom cap widths in box and whisker plots in bxp() and boxplot() -* :ghpull:`20887`: Implement a consistent behavior in TkAgg backend for bad blit bbox -* :ghpull:`22317`: Rename outdated seaborn styles. -* :ghpull:`22271`: Rework/fix Text layout cache. -* :ghpull:`22097`: In mpl_toolkits, use the same floating point slop as for standard ticks. -* :ghpull:`22295`: Display bad format string in error message. -* :ghpull:`22287`: Removed unused code and variables -* :ghpull:`22244`: MNT: colorbar locators properties -* :ghpull:`22270`: Expanded documentation of Axis.set_ticks as per discussion in issue #22262 -* :ghpull:`22280`: Simplify FontProperties.copy(). -* :ghpull:`22174`: Give the Tk toolbar buttons a flat look -* :ghpull:`22046`: Add the ability to change the focal length of the camera for 3D plots -* :ghpull:`22251`: Colorbar docstring reorg -* :ghpull:`21933`: MNT: privatize colorbar attr -* :ghpull:`22258`: DOC: fix version switcher -* :ghpull:`22261`: DOC: fix switcher json -* :ghpull:`22154`: Add some tests for minspan{x,y} in RectangleSelector -* :ghpull:`22246`: DOC: add dropdown -* :ghpull:`22133`: Deprecated ``afm``, ``fontconfig_pattern``, and ``type1font`` -* :ghpull:`22249`: DOC: More capitalization of Axes -* :ghpull:`22021`: Ensure that all toolbar (old/new) subclasses can be init'ed consistently -* :ghpull:`22213`: Improve ft2font error reporting. -* :ghpull:`22245`: Deprecate cleared kwarg to get_renderer. -* :ghpull:`22239`: Fix typos -* :ghpull:`22216`: turn off the grid after creating colorbar axes -* :ghpull:`22055`: FIX: Return value instead of enum in get_capstyle/_joinstyle -* :ghpull:`22228`: Remove some unnecessary getattrs. -* :ghpull:`20426`: ENH: Layout engine -* :ghpull:`22224`: Trivial doc fix to annotations tutorial. -* :ghpull:`21894`: Jointly track x and y in PolygonSelector. -* :ghpull:`22205`: Bump minimum NumPy to 1.19 -* :ghpull:`22203`: Factor out underline-thickness lookups in mathtext. -* :ghpull:`22189`: DOC: Add hatch API to reference -* :ghpull:`22084`: Clean up 3d plot box_aspect zooming -* :ghpull:`22098`: Expire axes_grid1/axisartist deprecations. -* :ghpull:`22013`: Use standard toolbar in wx. -* :ghpull:`22160`: Removed unused variables etc. -* :ghpull:`22179`: FIX: macosx check case-insensitive app name -* :ghpull:`22157`: Improved coverage of mathtext and removed unused code -* :ghpull:`21781`: Use a fixture to get widget testing axes -* :ghpull:`22140`: Ensure log formatters use Unicode minus -* :ghpull:`21342`: Fix drawing animated artists changed in selector callback -* :ghpull:`22134`: Deprecated ``tight_bbox`` and ``tight_layout`` modules -* :ghpull:`21965`: Switch transOffset to offset_transform. -* :ghpull:`22145`: Make Tk windows use the same icon as other backends -* :ghpull:`22107`: Expire mathttext-related deprecations -* :ghpull:`22139`: FIX: width/height were reversed in macosx rectangle creation -* :ghpull:`22123`: Deprecate accepting arbitrary parameters in some get_window_extent() methods -* :ghpull:`22122`: Hint at draw_without_rendering() in Text.get_window_extent -* :ghpull:`22120`: Drop dependency on scipy in the docs. -* :ghpull:`22063`: FIX: Autoposition title when yaxis has offset -* :ghpull:`22119`: Micro-optimize skew(). -* :ghpull:`22109`: Remove unnecessary null checks in macosx.m, and some more maintenance -* :ghpull:`21977`: Add corner coordinate helper methods to Ellipse/Rectangle -* :ghpull:`21830`: Add option of bounding box for PolygonSelector -* :ghpull:`22115`: Turn _localaxes into a plain list. -* :ghpull:`22108`: Micro-optimize rotation transform. -* :ghpull:`22043`: Cleanup differential equations examples. -* :ghpull:`22080`: Simple style(ish) fixes. -* :ghpull:`22110`: Right-aligned status text in backends -* :ghpull:`21873`: DOC: Update and consolidate Custom Tick Formatter for Time Series example -* :ghpull:`22112`: Fix a small typo -* :ghpull:`20117`: Very soft-deprecate AxesDivider.new_{horizontal,vertical}. -* :ghpull:`22034`: Update lines_with_ticks_demo.py -* :ghpull:`22102`: DOC: rename usage tutorial to quick_start -* :ghpull:`19228`: Validate text rotation in setter -* :ghpull:`22081`: Expire colorbar-related deprecations. -* :ghpull:`22008`: Added color keyword argument to math_to_image -* :ghpull:`22058`: Remove exprired mplot3d deprecations for 3.6 -* :ghpull:`22073`: DOC: Add new tutorial to external resources. -* :ghpull:`22054`: MNT: Set CapStyle member names automatically -* :ghpull:`22061`: De-duplicate mplot3D API docs -* :ghpull:`22075`: Remove unnecessary ``.figure`` qualifier in docs. -* :ghpull:`22051`: Make required_interactive_framework required on FigureCanvas. -* :ghpull:`22050`: Deprecate the noop, unused FigureCanvasBase.resize. -* :ghpull:`22030`: Add explanatory comments to "broken" horizontal bar plot example -* :ghpull:`22001`: Fix: [Bug]: triplot with 'ls' argument yields TypeError #21995 -* :ghpull:`22045`: Fill in missing Axes3D box_aspect argument docstring -* :ghpull:`22042`: Keep FontEntry helpers private. -* :ghpull:`21042`: Make rcParams.copy() return a new RcParams instance. -* :ghpull:`22032`: flipy only affects the drawing of texts, not of images. -* :ghpull:`21993`: Added docstring to rrulewrapper class -* :ghpull:`21935`: Significantly improve tight layout performance for cartopy axes -* :ghpull:`22000`: Some gtk cleanups. -* :ghpull:`21983`: Simplify canvas class control in FigureFrameWx. -* :ghpull:`21985`: Slightly tighten the _get_layout_cache_key API. -* :ghpull:`22020`: Simplify wx _print_image. -* :ghpull:`22010`: Fix syntax highlighting in contrib guide. -* :ghpull:`22003`: Initialize RendererCairo.{width,height} in constructor. -* :ghpull:`21992`: Use _make_classic_style_pseudo_toolbar more. -* :ghpull:`21916`: Fix picklability of make_norm_from_scale norms. -* :ghpull:`21981`: FigureCanvasCairo can init RendererCairo; kill RendererCairo subclasses. -* :ghpull:`21986`: InvLogTransform should only return masked arrays for masked inputs. -* :ghpull:`21991`: PEP8ify wx callback names. -* :ghpull:`21975`: DOC: remove experimental tag from CL -* :ghpull:`21989`: Autoinfer norm bounds. -* :ghpull:`21980`: Removed loaded modules logging -* :ghpull:`21982`: Deprecate duplicated FigureManagerGTK{3,4}Agg classes. -* :ghpull:`21963`: Clarify current behavior of draw_path_collection. -* :ghpull:`21974`: Reword inset axes example. -* :ghpull:`21835`: Small improvements to interactive examples -* :ghpull:`21050`: Store dash_pattern as single attribute, not two. -* :ghpull:`21557`: Fix transparency when exporting to png via pgf backend. -* :ghpull:`21904`: Added _repr_html_ for fonts -* :ghpull:`21696`: Use cycling iterators in RendererBase. -* :ghpull:`21955`: Refactor common parts of ImageMagick{,File}Writer. -* :ghpull:`21952`: Clarify coordinates for RectangleSelector properties -* :ghpull:`21964`: Fix some more missing references. -* :ghpull:`21516`: Make _request_autoscale_view more generalizable to 3D. -* :ghpull:`21947`: Slightly cleanup RendererBase docs. -* :ghpull:`21961`: Privatize various internal APIs of backend_pgf. -* :ghpull:`21956`: Remove tests for avconv animation writers. -* :ghpull:`21954`: DOC: Move Animation and MovieWriter inheritance diagrams ... -* :ghpull:`21780`: Add a click_and_move widget test helper -* :ghpull:`21941`: Merge branch v3.5.x into main -* :ghpull:`21936`: Small ``__getstate__`` cleanups. -* :ghpull:`21939`: Update comment re: register_at_fork. -* :ghpull:`21910`: Fold _rgbacache into _imcache. -* :ghpull:`21921`: Clean up RectangleSelector move code -* :ghpull:`21925`: Drop labelling from PR welcome action -* :ghpull:`14930`: Set Dock icon on the macosx backend -* :ghpull:`21920`: Improve square state calculation in RectangleSelector -* :ghpull:`21919`: Fix use_data_coordinates docstring -* :ghpull:`21881`: Add a PolygonSelector.verts setter -* :ghpull:`20839`: Fix centre and square state and add rotation for rectangle selector -* :ghpull:`21874`: DOC: Add Date Tick Locators and Formatters example -* :ghpull:`21799`: Added get_font_names() to fontManager -* :ghpull:`21871`: DOC: Code from markevery_prop_cycle moved to test. -* :ghpull:`21395`: Expire _check_savefig_extra_args-related deprecations. -* :ghpull:`21867`: Remove unused bbox arg to _convert_agg_to_wx_bitmap. -* :ghpull:`21868`: Use partialmethod for better signatures in backend_ps. -* :ghpull:`21520`: Shorten some inset_locator docstrings. -* :ghpull:`21737`: Update the "Rotating a 3D plot" gallery example to show all 3 rotation axes -* :ghpull:`21851`: Re-order a widget test function -* :ghpull:`10762`: Normalization of elevation and azimuth angles for surface plots -* :ghpull:`21426`: Add ability to roll the camera in 3D plots -* :ghpull:`21822`: Replace NSDictionary by switch-case. -* :ghpull:`21512`: MNT: Add modifier key press handling to macosx backend -* :ghpull:`21784`: Set macOS icon when using Qt backend -* :ghpull:`21748`: Shorten PyObjectType defs in macosx.m. -* :ghpull:`21809`: MNT: Turn all macosx warnings into errors while building -* :ghpull:`21792`: Fix missing return value in closeButtonPressed. -* :ghpull:`21767`: Inherit many macos backend docstrings. -* :ghpull:`21766`: Don't hide build log on GHA. -* :ghpull:`21728`: Factor out some macosx gil handling for py-method calls from callbacks. -* :ghpull:`21754`: Update gitattributes so that objc diffs are correctly contextualized. -* :ghpull:`21752`: Add a helper for directly output pdf streams. -* :ghpull:`21750`: Don't sort pdf dicts. -* :ghpull:`21745`: DOC: Clarify Coords Report Example -* :ghpull:`21746`: Fix/add docstring signatures to many C++ methods. -* :ghpull:`21631`: DOC: change gridspec tutorial to arranging_axes tutorial -* :ghpull:`21318`: FIX: better error message for shared axes and axis('equal') -* :ghpull:`21519`: mark_inset should manually unstale axes limits before drawing itself. -* :ghpull:`21724`: Fix copyright date with SOURCE_DATE_EPOCH set -* :ghpull:`21398`: FIX: logic of title repositioning -* :ghpull:`21717`: Simplify macosx toolbar init. -* :ghpull:`21690`: Whitespace/braces/#defines cleanup to macosx. -* :ghpull:`21695`: Use _api.check_shape more. -* :ghpull:`21698`: Small code cleanups and style fixes. -* :ghpull:`21529`: Delay-load keymaps in toolmanager. -* :ghpull:`21525`: Fix support for clim in scatter. -* :ghpull:`21697`: Drop non-significant zeros from ps output. -* :ghpull:`21692`: CI: Remove CI test runs from forks of matplotlib -* :ghpull:`21591`: Make ToolFullScreen a Tool, not a ToolToggle. -* :ghpull:`21677`: Simplify test for negative xerr/yerr. -* :ghpull:`21657`: Replace some image_comparisons by return-value-tests/check_figures_e… -* :ghpull:`21664`: Merge 3.5.x into main -* :ghpull:`21490`: Make Line2D copy its inputs -* :ghpull:`21639`: Skip some uses of packaging's PEP440 version for non-Python versions. -* :ghpull:`21604`: Fix centre square rectangle selector part 1 -* :ghpull:`21593`: Check for images added-and-modified in a same PR -* :ghpull:`20750`: Shorten issue templates -* :ghpull:`21590`: Make gtk3 full_screen_toggle more robust against external changes. -* :ghpull:`21582`: Organize checklist in PR template -* :ghpull:`21580`: Rename/remove _lastCursor, as needed. -* :ghpull:`21567`: Removed the range parameter from the validate_whiskers function's err… -* :ghpull:`21565`: Further remove remnants of offset_position. -* :ghpull:`21542`: [ENH]: Use new style format strings for colorbar ticks -* :ghpull:`21564`: Skip invisible artists when doing 3d projection. -* :ghpull:`21558`: Various small fixes for streamplot(). -* :ghpull:`21544`: Return minorticks as array, not as list. -* :ghpull:`21546`: Added links to the mosaic docs in figure and pyplot module docstrings -* :ghpull:`21545`: Turn mouseover into a mpl-style getset_property. -* :ghpull:`21537`: Remove unnecessary False arg when constructing wx.App. -* :ghpull:`21536`: Reword margins docstrings, and fix bounds on zmargin values. -* :ghpull:`21535`: typo-correction-on-line-185 -* :ghpull:`21534`: Do not use space in directive calling. -* :ghpull:`21494`: Adding tutorial links for blitting in widgets.py -* :ghpull:`21407`: Stash exceptions when FT2Font closes the underlying stream. -* :ghpull:`21431`: set_ticks([single_tick]) should also expand view limits. -* :ghpull:`21444`: Make pipong example self-contained. -* :ghpull:`21392`: Add label about workflow to new contributor PRs -* :ghpull:`21440`: Install sphinx-panels along with development setup -* :ghpull:`21434`: Remove coords_flat variable -* :ghpull:`21415`: Move gui_support.macosx option to packages section. -* :ghpull:`21412`: Privatize some SVG internal APIs. -* :ghpull:`21401`: Uncamelcase some internal variables in axis.py; rename _get_tick_bboxes. -* :ghpull:`21417`: Use Bbox.unit() more. -* :ghpull:`20253`: Simplify parameter handling in FloatingAxesBase. -* :ghpull:`21379`: Simplify filename tracking in FT2Font. -* :ghpull:`21278`: Clear findfont cache when calling addfont(). -* :ghpull:`21400`: Use bbox.{size,bounds,width,height,p0,...} where appropriate. -* :ghpull:`21408`: Reword annotations tutorial section titles. -* :ghpull:`21371`: Rename default branch -* :ghpull:`21389`: Log pixel coordinates in event_handling coords_demo example on terminal/console -* :ghpull:`21376`: Factor common parts of saving to different formats using pillow. -* :ghpull:`21377`: Enable tests for text path based markers -* :ghpull:`21283`: Demonstrate inset_axes in scatter_hist example. -* :ghpull:`21356`: Raise an exception when find_tex_file fails to find a file. -* :ghpull:`21362`: Simplify wording of allowed errorbar() error values -* :ghpull:`21274`: ENH: Add support to save images in WebP format -* :ghpull:`21289`: Simplify _init_legend_box. -* :ghpull:`21256`: Make image_comparison work even without the autoclose fixture. -* :ghpull:`21343`: Fix type1font docstring markup/punctuation. -* :ghpull:`21341`: Fix trivial docstring typo. -* :ghpull:`21301`: Simplify ``Colormap.__call__`` a bit. -* :ghpull:`21280`: Make ``Path.__deepcopy__`` interact better with subclasses, e.g. TextPath. -* :ghpull:`21266`: Fix #21101 Add validator to errorbar method -* :ghpull:`20921`: Fix problem with (deep)copy of TextPath -* :ghpull:`20914`: 19195 rotated markers -* :ghpull:`21276`: Add language about not assigning issues -* :ghpull:`20715`: Improve Type-1 font parsing -* :ghpull:`21218`: Parametrize/simplify test_missing_psfont. -* :ghpull:`21213`: Compress comments in make_image. -* :ghpull:`21187`: Deprecate error_msg_foo helpers. -* :ghpull:`21190`: Deprecate mlab.stride_windows. -* :ghpull:`21152`: Rename ``**kw`` to ``**kwargs``. -* :ghpull:`21087`: Move colormap examples from userdemo to images_contours_and_fields. -* :ghpull:`21074`: Deprecate MarkerStyle(None). -* :ghpull:`20990`: Explicit registration of canvas-specific tool subclasses. -* :ghpull:`21049`: Simplify setting Legend attributes -* :ghpull:`21056`: Deprecate support for no-args MarkerStyle(). -* :ghpull:`21059`: Remove dummy test command from setup.py -* :ghpull:`21015`: Prepare for rcParams.copy() returning a new RcParams instance in the future -* :ghpull:`21021`: Factor out for_layout_only backcompat support in get_tightlayout. -* :ghpull:`21023`: Inline ToolManager._trigger_tool to its sole call site. -* :ghpull:`21005`: Test the rcParams deprecation machinery. -* :ghpull:`21010`: Avoid TransformedBbox where unneeded. -* :ghpull:`21019`: Reword custom_ticker1 example. -* :ghpull:`20995`: Deprecate some backend_gtk3 helper globals. -* :ghpull:`21004`: Remove now-unused rcParams _deprecated entries. -* :ghpull:`20986`: Make HandlerLine2D{,Compound} inherit constructors from HandlerNpoints. -* :ghpull:`20974`: Rename symbol_name to glyph_name where appropriate. -* :ghpull:`20961`: Small cleanups to math_to_image. -* :ghpull:`20957`: legend_handler_map cleanups. -* :ghpull:`20955`: Remove unused HostAxes._get_legend_handles. -* :ghpull:`20851`: Try to install the Noto Sans CJK font - -Issues (202): - -* :ghissue:`23827`: backend_gtk3agg.py calls set_device_scale -* :ghissue:`23560`: [Doc]: mpl_toolkits.axes_grid still mentioned as maintained -* :ghissue:`23794`: [Doc]: Version switcher broken in devdocs -* :ghissue:`23806`: [Bug]: possible regression in axis ticks handling in matplotlib 3.6.0rc2 -* :ghissue:`22965`: [Bug]: triplot duplicates label legend -* :ghissue:`23807`: streamplot raises ValueError when the input is zeros -* :ghissue:`23761`: [Bug]: False positive legend handler warnings in 3.6.0.rc1 -* :ghissue:`23398`: [Bug]: Newer versions of matplotlib ignore xlabel on colorbar axis -* :ghissue:`23699`: [Bug]: Bug with toolbar instantiation in notebook -* :ghissue:`23745`: [Doc]: Minor rcParams/matplotlibrc doc issues -* :ghissue:`23717`: [Bug]: AxesSubplot.get_yticks not returning the actual printed ticks -* :ghissue:`21508`: [Doc]: Create diagram to show rotation directions for 3D plots -* :ghissue:`23709`: [Bug]: colorbar with unattached mappables can't steal space -* :ghissue:`23701`: [Bug]: plt.figure(), plt.close() leaks memory -* :ghissue:`22409`: [Bug]: AttributeError: 'QResizeEvent' object has no attribute 'pos' -* :ghissue:`19609`: DeprecationWarning when changing color maps -* :ghissue:`23716`: MatplotlibDeprecationWarning removal hard-breaks seaborn in 3.6rc1 -* :ghissue:`23719`: [Bug]: register_cmap deprecation message seems wrong -* :ghissue:`23707`: test_Normalize fails on aarch64/ppc64le/s390x -* :ghissue:`21107`: [MNT]: Should plt.xticks() get a minor keyword argument -* :ghissue:`23679`: [Doc]: Deprecated modules not in docs -* :ghissue:`19550`: Arc and pathpatch_2d_to_3d plots full ellipse -* :ghissue:`23329`: [Bug]: ``plt.autoscale()`` fails for partial ``Arc`` -* :ghissue:`11266`: Arc patch ignoring theta1/theta2 when added to Axes via PatchCollection -* :ghissue:`4067`: 'Poly3DCollection' object has no attribute '_facecolors2d' -* :ghissue:`23622`: [MNT]: make.bat not parsing sphinxopt -* :ghissue:`23459`: [Bug]: 'Line3D' object has no attribute '_verts3d' -* :ghissue:`23653`: [Bug]: macosx subplot tool causes segfault when window closed -* :ghissue:`23660`: [Bug]: Test test_figure.py::test_subfigure_ss[png] FAILED on ppc64le -* :ghissue:`23645`: [MNT]: Python 3.11 manylinux wheels -* :ghissue:`23650`: TTF fonts loaded from file are not embedded/displayed properly when saved to pdf -* :ghissue:`23583`: [Doc]: Document the position parameter in apply_aspect() -* :ghissue:`23386`: setuptools_scm-git-archive is obsolete -* :ghissue:`23220`: [Doc]: Clarify ``offset`` parameter in linestyle -* :ghissue:`22746`: [Doc]: Document that rcParams['font.family'] can be a list -* :ghissue:`8187`: Axes doesn't have ````legends```` attribute? -* :ghissue:`23580`: [Bug]: TypeError when plotting against list of datetime.date where 0th element of list is None -* :ghissue:`15514`: Relevant methods are only documented in base classes and thus not easily discoverable -* :ghissue:`21611`: DOC: Add conda environment instructions to developers guide -* :ghissue:`23487`: [Bug]: scatter plot color settings discarded unless c given -* :ghissue:`22977`: [Bug]: offset dash linestyle has no effect in patch objects -* :ghissue:`18883`: Matplotlib would not try to apply all the font in font list to draw all characters in the given string. -* :ghissue:`22570`: [ENH]: Provide ``axis('equal')`` for ``Axes3D``. -* :ghissue:`23433`: [Bug]: array-like linewidth raises an error for scatter3D -* :ghissue:`12388`: Legend Title Left Alignment -* :ghissue:`23375`: [Bug]: markerfacecoloralt not supported when drawing errorbars -* :ghissue:`17973`: DOC: matplotlib.__doc__ not included in online docs ? -* :ghissue:`23474`: [Bug]: ``\,`` and ``\mathrm{\,}`` are not identical in Mathtext when using CM and STIX -* :ghissue:`8715`: event handlers have different signatures across backends -* :ghissue:`18271`: PGF uses the minimal document class -* :ghissue:`23324`: [Bug]: Exception not handled in widgetlock() -* :ghissue:`15710`: doc for type of tz parameter is inconsistent throughout dates.py -* :ghissue:`21165`: Hexbin marginals need a test for linear scaling -* :ghissue:`23105`: [MNT]: Deprecate per-backend customization of draw_if_interactive -* :ghissue:`23147`: [Bug]: with setuptools>=60, cannot find msbuild -* :ghissue:`23379`: [Bug]: Offset notation on y-axis can overlap with a long title -* :ghissue:`22819`: [Doc]: Make rect argument consistent in the docstrings -* :ghissue:`23172`: [Bug]: Calling matplotlib.pyplot.show() outside of matplotlib.pyplot.rc_context no longer works -* :ghissue:`23019`: [Bug]: ``UnicodeDecodeError`` when using some special and accented characters in TeX -* :ghissue:`23334`: [Doc]: Tk embedding example crashes Spyder -* :ghissue:`23298`: [Bug]: get_backend() clears figures from Gcf.figs if they were created under rc_context -* :ghissue:`21942`: [ENH]: add width/height_ratios to subplots and friends -* :ghissue:`23028`: [ENH]: contour kwarg for negative_linestyle -* :ghissue:`19223`: Certain non-hashable parameters to text() give cryptic error messages -* :ghissue:`18351`: Add the ability to plot striped lines -* :ghissue:`23205`: [Bug]: URL-area not rotated in PDFs -* :ghissue:`23268`: [Bug]: hyphen renders different length depending on presence of MathText -* :ghissue:`23308`: [Bug]: set_visible() not working for 3d projection -* :ghissue:`23296`: Set_color method for line2d object in latest document not work -* :ghissue:`22992`: [Bug]: test_image_comparison_expect_rms nondeterministic failure -* :ghissue:`23008`: [ENH]: Use ``\genfrac`` in display style? -* :ghissue:`23214`: [MNT]: Rename examples with "test" in the name -* :ghissue:`17852`: Thin space missing after mathtext operators -* :ghissue:`12078`: Inconsistency in keyword-arguments ncol/ncols, nrow/nrows -* :ghissue:`23239`: [Doc]: steps is not implemented in line styles. -* :ghissue:`23151`: [MNT]: default date limits... -* :ghissue:`9462`: Misaligned bottoms of subplots for png output with bbox_inches='tight' -* :ghissue:`21369`: [Bug]: ax.invert_xaxis() and ax.invert_yaxis() both flip the X axis -* :ghissue:`20797`: ``macosx`` cursors break with images -* :ghissue:`23084`: [TST] Upcoming dependency test failures -* :ghissue:`22910`: [Bug]: bar_label fails with nan errorbar values -* :ghissue:`23074`: [Bug]: matplotlib crashes if ``_tkinter`` doesn't have ``__file__`` -* :ghissue:`23083`: [Bug]: Confusing error messages -* :ghissue:`22391`: [Doc]: Remove "keywords" line at the bottom of all examples -* :ghissue:`20202`: Daylocator causes frozen computer when used with FuncAnimation -* :ghissue:`22529`: Replace C++ quad contouring code with use of ContourPy -* :ghissue:`21710`: [ENH]: macosx backend does not respect rcParams["savefig.directory"] -* :ghissue:`21880`: [Doc]: rrulewrapper not included in API docs -* :ghissue:`22622`: [Bug]: Gaps and overlapping areas between bins when using float16 -* :ghissue:`23043`: [TST] Upcoming dependency test failures -* :ghissue:`17960`: Line2D object markers are lost when retrieved from legend.get_lines() when linestyle='None' -* :ghissue:`23026`: [MNT]: Require that matplotlibrc/style files use utf-8 (or have an encoding cookie) -* :ghissue:`22947`: [Bug]: Can't use ``plt.sca()`` on axes created using subfigures -* :ghissue:`22623`: [ENH]: support rect with constrained_layout ("layout only to part of the figure") -* :ghissue:`22917`: "ab;cd" missing in subplot_mosaic tutorial -* :ghissue:`22686`: [Bug]: can not give init value for RangeSlider widget -* :ghissue:`22740`: [MNT]: Add codespell to pre-commit hooks -* :ghissue:`22893`: rainbow text example is broken -* :ghissue:`21571`: [Doc]: Clarify text positioning -* :ghissue:`22092`: [Bug]: Configure subplots dialog freezes for TkAgg with toolmanager -* :ghissue:`22760`: [Bug]: Macosx legend picker doesn't work anymore -* :ghissue:`16369`: Call to input blocks slider input on osx with the default agg 'MacOSX'. It works fine on when TkAgg is used. -* :ghissue:`22915`: [Bug]: figure.raise_window rcParam does not work on MacOSX backend -* :ghissue:`22930`: [Bug]: Regression in dashes due to #22569 -* :ghissue:`22859`: [Bug]: findSystemFonts should not look in subdirectories of C:\Windows\Fonts\ -* :ghissue:`22882`: Missing ``f`` prefix on f-strings -* :ghissue:`22738`: [MNT]: make Axes.cla an alias for Axes.clear in all cases -* :ghissue:`22708`: [TST] Upcoming dependency test failures -* :ghissue:`8388`: Proposed ENH: Allow user to turn off breaking of streamlines in streamplot -* :ghissue:`20755`: [Bug]: make_norm_from_scale should create picklable classes even when used in-line. -* :ghissue:`18249`: Expand the explanation of the Object-Oriented interface -* :ghissue:`22792`: [Bug]: .eps greyscale hatching of patches when lw=0 -* :ghissue:`22630`: [ENH]: enable passing of projection keyword to Axes.inset_axes -* :ghissue:`22414`: [Bug]: bar_label overlaps bars when y-axis is inverted -* :ghissue:`22726`: [Bug]: tripcolor ignores clim -* :ghissue:`21635`: [ENH]: Add a nightly wheel build -* :ghissue:`9994`: document where nightly wheels are published -* :ghissue:`22350`: [Bug]: text.usetex Vs. DateFormatter -* :ghissue:`4976`: missing imshow() subplots when using tight_layout() -* :ghissue:`22150`: [ENH]: Tool icons are hardly visible in Tk when using a dark theme -* :ghissue:`22662`: Leave color parameter empty should be fine[ENH]: -* :ghissue:`22671`: [Doc]: plot_format adaption invalidates sphinx cache -* :ghissue:`22582`: [Bug]: FontManager.addfont doesn't accept pathlib.Path of TTF font -* :ghissue:`22657`: [ENH]: vector map -* :ghissue:`16181`: The great API cleanup -* :ghissue:`22636`: [Bug]: Infinite loop when there is single double quote in matplotlibrc -* :ghissue:`22266`: [Doc]: Improve examples in documentation -* :ghissue:`11861`: Figure does not close until script finishes execution -* :ghissue:`19288`: Escape # character in matplotlibrc -* :ghissue:`22579`: [Bug]: Replacement for epoch2num behaves differently (does not accept arrays) -* :ghissue:`22605`: [Bug]: Tool contrast low with dark theme on macosx backend -* :ghissue:`17642`: bring osx backend flush_events to feature parity with other backend -* :ghissue:`19268`: Drawing the canvas does not populate ticklabels on MacOSX backend -* :ghissue:`17445`: MacOSX does not render frames in which new artists are added when blitting -* :ghissue:`10980`: Current versions cannot reproduce rotate_axes_3d_demo.py -* :ghissue:`18451`: MacOSX backend fails with animation in certain scripts -* :ghissue:`22603`: [MNT]: Replace str(n)cpy etc with safe versions (C++) -* :ghissue:`19121`: Handle and label not created for Text with label -* :ghissue:`22563`: [Doc]: annotation_clip=None not correctly documented -* :ghissue:`12528`: Empty axes on draw after blitted animation finishes -* :ghissue:`20991`: [Bug]: Error when using path effect with a PolyCollection -* :ghissue:`19563`: path_effects kwarg triggers exception on 3D scatterplot -* :ghissue:`8650`: System Error in backend_agg. (with a fix!) -* :ghissue:`20294`: ``AxesImage.__str__`` is wrong if the image does not span the full Axes. -* :ghissue:`18066`: Document minimum supported OSX version for macos backend -* :ghissue:`17018`: Add documentation about transparency of frame -* :ghissue:`22403`: [MNT]: Confusing prompt in docs issue template -* :ghissue:`8839`: mpl_connect silently does nothing when passed an invalid event type string -* :ghissue:`22343`: [MNT]: Delay (or make pending) the deprecation of set_constrained_layout/set_tight_layout -* :ghissue:`21554`: [Bug]: ``ValueError`` upon deepcopy of a ``Figure`` object -* :ghissue:`22369`: [Doc]: Incorrect comment in example code for creating adjacent subplots -* :ghissue:`19174`: connectionstyle arc3 with high rad value pushes up data interval of x-axis and y-axis. -* :ghissue:`8351`: seaborn styles make "+", "x" markers invisible; proposed workaround for shipped styles -* :ghissue:`22278`: Deprecate/remove maxdict -* :ghissue:`19276`: imshow with very large arrays not working as expected -* :ghissue:`22035`: [ENH]: Specify a custom focal length / FOV for the 3d camera -* :ghissue:`22264`: [Bug]: new constrained_layout causes axes to go invisible(?) -* :ghissue:`21774`: [MNT]: Improvements to widget tests -* :ghissue:`18722`: Consider removing AFM+mathtext support -* :ghissue:`21540`: [Bug]: cm fontset in log scale does not use Unicode minus -* :ghissue:`22062`: [Bug]: Autopositioned title overlaps with offset text -* :ghissue:`22093`: [Bug]: AttributeError: 'AxesSubplot' object has no attribute 'add_text' -* :ghissue:`22012`: [Bug]: Mouseover coordinate/value text should be right aligned -* :ghissue:`21995`: [Bug]: triplot with 'ls' argument yields TypeError -* :ghissue:`20249`: MatplotlibDeprecationWarning when updating rcparams -* :ghissue:`15781`: MatplotlibDeprecationWarning examples.directory is deprecated -* :ghissue:`13118`: No MatplotlibDeprecationWarning for default rcParams -* :ghissue:`21978`: Remove logging debug of loaded modules -* :ghissue:`11738`: pgf backend doesn't make background transparent -* :ghissue:`18039`: Add ``_repr_html_`` for fonts -* :ghissue:`21970`: [Bug]: tight layout breaks with toolbar.push_current() -* :ghissue:`14850`: No icon showing up with macosx backend -* :ghissue:`17283`: Create Date Formatter/Locator Reference -* :ghissue:`21761`: [Doc]: add how to know available fonts... -* :ghissue:`21863`: [Doc]: Remove example "prop_cycle property markevery in rcParams" -* :ghissue:`10241`: Axes3D.view_init elevation issue between 270 and 360 degrees -* :ghissue:`14453`: add third angle to view_init() -* :ghissue:`20486`: Modifier key press events not recognized on MacOSX backend -* :ghissue:`9837`: MacOS: Key modifiers deprecated -* :ghissue:`11416`: RuntimeError: adjustable='datalim' is not allowed when both axes are shared. -* :ghissue:`17711`: inset_locator.mark_inset() misplaces box connectors -* :ghissue:`20854`: [Doc]: Incorrect copyright start year at the bottom of devdocs page -* :ghissue:`21394`: [Bug]: Subplot title does not obey padding -* :ghissue:`20998`: [Bug]: ToolManager does not respect rcParams["keymap."] set after import time -* :ghissue:`7075`: Superscripts in axis label cut when saving .eps with bbox_inches="tight" -* :ghissue:`21514`: [Doc]: Error message of validate_whiskers is not updated -* :ghissue:`21532`: [Doc]: subplot_mosaic docstring should link to the tutorial -* :ghissue:`16550`: Docs: performance discussion of tight_layout -* :ghissue:`21378`: [ENH]: use new style format strings for colorbar ticks -* :ghissue:`19323`: Streamplot color mapping fails on (near-)empty array. -* :ghissue:`19559`: Axes.get_xticks() returns a numpy array but Axes.get_xticks(minor=True) returns a plain list -* :ghissue:`21526`: [Doc]: Little Typo on Introductory Tutorial -* :ghissue:`19195`: Rotate Markers in functions like plot, scatter, etcetera -* :ghissue:`21364`: [Bug]: double free when FT2Font constructor is interrupted by KeyboardInterrupt -* :ghissue:`16581`: Can't not refresh new font in running interpreter -* :ghissue:`21162`: [ENH]: saving images in webp format -* :ghissue:`18168`: The example of the testing decorator does not work. -* :ghissue:`20943`: [Bug]: Deepcopy of TextPath fails -* :ghissue:`21101`: [Bug]: Errorbars separated from markers with negative errors -* :ghissue:`17986`: MEP22 per-backend tool registration -* :ghissue:`4938`: Feature request: add option to disable mathtext parsing -* :ghissue:`11435`: plt.subplot eats my subplots +Pull Requests (80): + +* :ghpull:`24124`: Backport PR #24111 on branch v3.6.x (FIX: add missing method to ColormapRegistry) +* :ghpull:`24111`: FIX: add missing method to ColormapRegistry +* :ghpull:`24117`: Backport PR #24113 on branch v3.6.x (Add exception class to pytest.warns calls) +* :ghpull:`24116`: Backport PR #24115 on branch v3.6.x (Fix mask lookup in fill_between for NumPy 1.24+) +* :ghpull:`24113`: Add exception class to pytest.warns calls +* :ghpull:`24115`: Fix mask lookup in fill_between for NumPy 1.24+ +* :ghpull:`24112`: Backport PR #24109 on branch v3.6.x (DOC: add API change note for colorbar deprecation) +* :ghpull:`24109`: DOC: add API change note for colorbar deprecation +* :ghpull:`24107`: Backport PR #24088 on branch v3.6.x (MNT: make orphaned colorbar deprecate versus raise) +* :ghpull:`24088`: MNT: make orphaned colorbar deprecate versus raise +* :ghpull:`24103`: Backport PR #23684 on branch v3.6.x (Fix rectangle and hatches for colorbar) +* :ghpull:`23684`: Fix rectangle and hatches for colorbar +* :ghpull:`24087`: Backport PR #24084 on branch v3.6.x (Revert argument checking for label_mode) +* :ghpull:`24084`: Revert argument checking for label_mode +* :ghpull:`24078`: Backport PR #24047 on branch v3.6.x (Revert #22360: Let TeX handle multiline strings itself) +* :ghpull:`24047`: Revert #22360: Let TeX handle multiline strings itself +* :ghpull:`24077`: Backport PR #24054 on branch v3.6.x ( DOC: Move OO-examples from pyplot section) +* :ghpull:`24054`: DOC: Move OO-examples from pyplot section +* :ghpull:`24072`: Backport PR #24069 on branch v3.6.x (Clarification of marker size in scatter) +* :ghpull:`24073`: Backport PR #24070 on branch v3.6.x (DOC: colorbar may steal from array of axes) +* :ghpull:`24070`: DOC: colorbar may steal from array of axes +* :ghpull:`24069`: Clarification of marker size in scatter +* :ghpull:`24059`: Backport PR #23638 on branch v3.6.x (FIX: correctly handle generic font families in svg text-as-text mode) +* :ghpull:`23638`: FIX: correctly handle generic font families in svg text-as-text mode +* :ghpull:`24048`: Backport PR #24045 on branch v3.6.x (Fix _FigureManagerGTK.resize on GTK4) +* :ghpull:`24055`: Backport PR #24046 on branch v3.6.x (Ignore 'CFMessagePort: bootstrap_register' messages) +* :ghpull:`24046`: Ignore 'CFMessagePort: bootstrap_register' messages +* :ghpull:`24051`: Backport PR #24037 on branch v3.6.x ([DOC]: make spanselector example codeblock continuous) +* :ghpull:`24037`: [DOC]: make spanselector example codeblock continuous +* :ghpull:`24045`: Fix _FigureManagerGTK.resize on GTK4 +* :ghpull:`24043`: Backport PR #24041 on branch v3.6.x (DOC: Fix incorrect redirect) +* :ghpull:`24030`: Backport PR #24019 on branch v3.6.x (Don't require FigureCanvas on backend module more) +* :ghpull:`24040`: Backport PR #24018 on branch v3.6.x (When comparing eps images, run ghostscript with -dEPSCrop.) +* :ghpull:`24018`: When comparing eps images, run ghostscript with -dEPSCrop. +* :ghpull:`24033`: Backport PR #24032 on branch v3.6.x (Reword SpanSelector example.) +* :ghpull:`24029`: Backport PR #24026 on branch v3.6.x (Don't modify Axes property cycle in stackplot) +* :ghpull:`23994`: Backport PR #23964 on branch v3.6.x (Fix issue with empty line in ps backend) +* :ghpull:`24019`: Don't require FigureCanvas on backend module more +* :ghpull:`24026`: Don't modify Axes property cycle in stackplot +* :ghpull:`24027`: Backport PR #23904 on branch v3.6.x (added a reversing section to colormap reference) +* :ghpull:`24017`: Backport PR #24014 on branch v3.6.x (Bump pypa/cibuildwheel from 2.10.1 to 2.10.2) +* :ghpull:`24014`: Bump pypa/cibuildwheel from 2.10.1 to 2.10.2 +* :ghpull:`24007`: Backport PR #24004 on branch v3.6.x (Increase consistency in tutorials and examples) +* :ghpull:`23964`: Fix issue with empty line in ps backend +* :ghpull:`23904`: added a reversing section to colormap reference +* :ghpull:`23990`: Backport PR #23978 on branch v3.6.x (DOC: Suppress IPython output in examples and tutorials where not needed) +* :ghpull:`23978`: DOC: Suppress IPython output in examples and tutorials where not needed +* :ghpull:`23916`: Backport PR #23912 on branch v3.6.x (FIX: only expect FigureCanvas on backend module if using new style) +* :ghpull:`23989`: Backport PR #23944 on branch v3.6.x (FIX: ValueError when hexbin is run with empty arrays and log scaling.) +* :ghpull:`23944`: FIX: ValueError when hexbin is run with empty arrays and log scaling. +* :ghpull:`23988`: Backport PR #23987 on branch v3.6.x (FIX: do not set constrained layout on false-y values) +* :ghpull:`23987`: FIX: do not set constrained layout on false-y values +* :ghpull:`23982`: Backport PR #23980 on branch v3.6.x (DOC: Move Quick Start Tutorial to first position) +* :ghpull:`23979`: Backport PR #23975 on branch v3.6.x (Reword docstring of reset_position.) +* :ghpull:`23975`: Reword docstring of reset_position. +* :ghpull:`23966`: Backport PR #23930 on branch v3.6.x (Fix edge color, links, wording; closes matplotlib/matplotlib#23895) +* :ghpull:`23971`: Backport PR #23906 on branch v3.6.x (Edit mplot3d examples for correctness and consistency) +* :ghpull:`23906`: Edit mplot3d examples for correctness and consistency +* :ghpull:`23963`: Backport PR #23957 on branch v3.6.x (Bump pypa/cibuildwheel from 2.9.0 to 2.10.1) +* :ghpull:`23930`: Fix edge color, links, wording; closes matplotlib/matplotlib#23895 +* :ghpull:`23910`: FIX: do not append None to stream in ps +* :ghpull:`23957`: Bump pypa/cibuildwheel from 2.9.0 to 2.10.1 +* :ghpull:`23960`: Backport PR #23947 on branch v3.6.x (Fix building on MINGW) +* :ghpull:`23942`: DOC: fix versions in v3.6.x doc switcher +* :ghpull:`23961`: Backport PR #23958 on branch v3.6.x (DOC: Remove Adding Animations section) +* :ghpull:`23958`: DOC: Remove Adding Animations section +* :ghpull:`23947`: Fix building on MINGW +* :ghpull:`23945`: Backport PR #23941 on branch v3.6.x (consistent notation for minor/patch branches) +* :ghpull:`23956`: Backport PR #23751 on branch v3.6.x (FIX: show bars when the first location is nan) +* :ghpull:`23751`: FIX: show bars when the first location is nan +* :ghpull:`23938`: Backport PR #23919 on branch v3.6.x (DOC: remove dead "Show Source" links) +* :ghpull:`23952`: Backport PR #23951 on branch v3.6.x (DOC: Make animation continuous) +* :ghpull:`23949`: DOC: Display "dev" instead of "devdocs" in the version switcher +* :ghpull:`23940`: Fix typos in github_stats.rst +* :ghpull:`23936`: Backport PR #23935 on branch v3.6.x (DOC: fix versions is doc switcher) +* :ghpull:`23933`: Backport PR #23932 on branch v3.6.x (DOC: Fix formatting in image tutorial) +* :ghpull:`23932`: DOC: Fix formatting in image tutorial +* :ghpull:`23926`: Backport PR #23925 on branch v3.6.x (FIX: use process_event in dpi changes on macosx backend) +* :ghpull:`23925`: FIX: use process_event in dpi changes on macosx backend +* :ghpull:`23912`: FIX: only expect FigureCanvas on backend module if using new style + +Issues (22): + +* :ghissue:`23981`: [ENH]: Default ``matplotlib.colormaps[None]`` to call ``matplotlib.colormaps[matplotlib.rcParams['image.cmap']]``? +* :ghissue:`24106`: [Bug]: fill_between gives IndexError with numpy 1.24.0.dev +* :ghissue:`24053`: Cartopy axes_grid_basic example broken by Matplotlib 3.6 +* :ghissue:`23977`: [Bug]: Eqnarray in AnchoredText results in misplaced text (new in v3.6.0) +* :ghissue:`23973`: [Bug]: ValueError: Unable to determine Axes to steal space for Colorbar. +* :ghissue:`23456`: [Bug]: Horizontal colorbars drawn incorrectly with hatches +* :ghissue:`15922`: Pyplot gallery section is mostly OO examples +* :ghissue:`23700`: [Doc]: scatter points +* :ghissue:`23492`: [Bug]: svg backend does not use configured generic family lists +* :ghissue:`22528`: [Bug]: problem with font property in text elements of svg figures +* :ghissue:`23911`: [Bug]: 3.6.0 doesn't interact well with pycharm throwing "backend_interagg" exception +* :ghissue:`24024`: stackplot should not change Axes cycler +* :ghissue:`23954`: [Bug]: Text label with empty line causes a "TypeError: cannot unpack non-iterable NoneType object" in PostScript backend +* :ghissue:`23922`: [Bug]: Refactor of hexbin for 3.6.0 crashes with empty arrays and log scaling +* :ghissue:`23986`: [Bug]: Constrained layout UserWarning even when False +* :ghissue:`23895`: [Bug]: 3D surface is not plotted for the contour3d_3 example in the gallery +* :ghissue:`23955`: [Doc]: Adding animations to Youtube channel +* :ghissue:`23943`: [Bug]: Couldn't build matplotlib 3.6.0 with both Clang-15 and GCC-12 +* :ghissue:`23687`: [Bug]: barplot does not show anything when x or bottom start and end with NaN +* :ghissue:`23876`: [Doc]: Missing source files +* :ghissue:`23909`: [Doc]: add animation examples to show animated subplots +* :ghissue:`23921`: [Bug]: resize_event deprecation warnings when creating figure on macOS with version 3.6.0 Previous GitHub statistics diff --git a/doc/users/prev_whats_new/github_stats_3.6.0.rst b/doc/users/prev_whats_new/github_stats_3.6.0.rst new file mode 100644 index 000000000000..aac0c0445fd3 --- /dev/null +++ b/doc/users/prev_whats_new/github_stats_3.6.0.rst @@ -0,0 +1,1292 @@ +.. _github-stats-3-6-0: + +GitHub statistics for 3.6.0 (Sep 15, 2022) +========================================== + +GitHub statistics for 2021/11/16 (tag: v3.5.0) - 2022/09/15 + +These lists are automatically generated, and may be incomplete or contain duplicates. + +We closed 202 issues and merged 894 pull requests. +The full list can be seen `on GitHub `__ + +The following 174 authors contributed 4425 commits. + +* Abhishek K M +* Adeel Hassan +* agra +* Aitik Gupta +* ambi7 +* Andras Deak +* Andres Martinez +* Andrew Fennell +* andrzejnovak +* Andrés Martínez +* Anna Mastori +* AnnaMastori +* Ante Sikic +* Antony Lee +* arndRemy +* Ben Root +* Biswapriyo Nath +* cavesdev +* Clément Phan +* Clément Walter +* code-review-doctor +* Connor Cozad +* Constantine Evans +* Croadden +* daniilS +* Danilo Palumbo +* David Gilbertson +* David Ketcheson +* David Matos +* David Poznik +* David Stansby +* Davide Sandonà +* dependabot[bot] +* dermasugita +* Diego Solano +* Dimitri Papadopoulos +* dj4t9n +* Dmitriy Fishman +* DWesl +* Edouard Berthe +* eindH +* Elliott Sales de Andrade +* Eric Firing +* Eric Larson +* Eric Prestat +* Federico Ariza +* Felix Nößler +* Fernando +* Gajendra Pal +* gajendra0180 +* GavinZhang +* Greg Lucas +* hannah +* Hansin Ahuja +* Harshal Prakash Patankar +* Hassan Kibirige +* Haziq Khurshid +* Henry +* henrybeUM +* Hood +* Hood Chatham +* Ian Hunt-Isaak +* Ian Thomas +* igurin-invn +* ikhebgeenaccount +* Isha Mehta +* Jake Bowhay +* Jake Li +* Jake Lishman +* Jake VanderPlas +* Jakub Klus +* James Tocknell +* Jan-Hendrik Müller +* Jay Joshi +* Jay Stanley +* jayjoshi112711 +* Jeff Beck +* Jody Klymak +* Joel Frederico +* Joseph Fox-Rabinovitz +* Josh Soref +* Jouni K. Seppänen +* Kayran Schmidt +* kdpenner +* Kian Eliasi +* Kinshuk Dua +* kislovskiy +* KIU Shueng Chuan +* kjain +* kolibril13 +* krassowski +* Krish-sysadmin +* Leeh Peter +* lgfunderburk +* Liam Toney +* Lucas Ricci +* Luke Davis +* luz paz +* mackopes +* MAKOMO +* MalikIdreesHasa +* Marcin Swaltek +* Mario +* Mario Sergio Valdés Tresanco +* martinRenou +* Matthew Feickert +* Matthias Bussonnier +* Mauricio Collares +* MeeseeksMachine +* melissawm +* Mr-Milk +* Navid C. Constantinou +* Nickolaos Giannatos +* Nicolas P. Rougier +* Niyas Sait +* noatamir +* ojeda-e +* Olivier Gauthé +* Oscar Gustafsson +* patquem +* Philipp Rohde +* Pieter Eendebak +* Pieter P +* Péter Leéh +* Qijia Liu +* Quentin Peter +* Raphael Quast +* rditlar9 +* Richard Penney +* richardsheridan +* Rike-Benjamin Schuppner +* Robert Cimrman +* Roberto Toro +* root +* Ruth Comer +* Ruth G. N +* Ruth Nainggolan +* Ryan May +* Rémi Achard +* SaumyaBhushan +* Scott Jones +* Scott Shambaugh +* selormtamakloe +* Simon Hoxbro +* skywateryang +* Stefanie Molin +* Steffen Rehberg +* stone +* Sven Eschlbeck +* sveneschlbeck +* takimata +* tfpf +* Thomas A Caswell +* Tim Hoffmann +* Tobias Megies +* Tomas Hrnciar +* Tomasz Kuliński +* trichter +* unknown +* Uwe Hubert +* vfdev-5 +* Vishal Chandratreya +* Vishal Pankaj Chandratreya +* Vishnu V K +* vk0812 +* Vlad Korolev +* Will Qian +* William Qian +* wqh17101 +* wsykala +* yaaun +* Yannic Schroeder +* yuanx749 +* 渡邉 美希 + +GitHub issues and pull requests: + +Pull Requests (894): + +* :ghpull:`23814`: Consolidate release notes for 3.6 +* :ghpull:`23899`: Backport PR #23885 on branch v3.6.x (DOC: Rearrange navbar-end elements) +* :ghpull:`23898`: Backport PR #23892 on branch v3.6.x (DOC: Fix docs for linestyles in contour) +* :ghpull:`23885`: DOC: Rearrange navbar-end elements +* :ghpull:`23894`: Backport PR #23881 on branch v3.6.x (Fix Pillow compatibility in example) +* :ghpull:`23897`: Backport PR #23887 on branch v3.6.x (Add missing label argument to barh docs) +* :ghpull:`23892`: DOC: Fix docs for linestyles in contour +* :ghpull:`23887`: Add missing label argument to barh docs +* :ghpull:`23893`: Backport PR #23886 on branch v3.6.x (CI: prefer (older) binaries over (newer) sdists) +* :ghpull:`23881`: Fix Pillow compatibility in example +* :ghpull:`23886`: CI: prefer (older) binaries over (newer) sdists +* :ghpull:`23880`: Backport PR #23862 on branch v3.6.x (Remove triggering of deprecation warning in AnchoredEllipse) +* :ghpull:`23862`: Remove triggering of deprecation warning in AnchoredEllipse +* :ghpull:`23879`: Backport PR #23864 on branch v3.6.x (Correct and improve documentation for anchored artists) +* :ghpull:`23877`: Backport PR #23841 on branch v3.6.x (clarified that hist computes histogram on unbinned data) +* :ghpull:`23872`: Backport PR #23871 on branch v3.6.x (DOC: Fix formatting of pick event demo example) +* :ghpull:`23841`: clarified that hist computes histogram on unbinned data +* :ghpull:`23864`: Correct and improve documentation for anchored artists +* :ghpull:`23871`: DOC: Fix formatting of pick event demo example +* :ghpull:`23869`: Backport PR #23867 on branch v3.6.x (DOC: fix deprecation warnings in examples) +* :ghpull:`23867`: DOC: fix deprecation warnings in examples +* :ghpull:`23858`: Backport PR #23855 on branch v3.6.x (DOC: fix deprecation warnings) +* :ghpull:`23859`: Backport PR #23844 on branch v3.6.x (Further improve dev setup instructions) +* :ghpull:`23844`: Further improve dev setup instructions +* :ghpull:`23855`: DOC: fix deprecation warnings +* :ghpull:`23854`: Backport PR #23852 on branch v3.6.x (Fix cross-compiling internal freetype) +* :ghpull:`23852`: Fix cross-compiling internal freetype +* :ghpull:`23853`: Backport PR #23830 on branch v3.6.x (Start testing on Python 3.11) +* :ghpull:`23830`: Start testing on Python 3.11 +* :ghpull:`23851`: Backport PR #23850 on branch v3.6.x (removed single word in documenting doc) +* :ghpull:`23850`: removed single word in documenting doc +* :ghpull:`23848`: Backport PR #23843 on branch v3.6.x (Clarify that pycairo>=1.14.0 is needed.) +* :ghpull:`23843`: Clarify that pycairo>=1.14.0 is needed. +* :ghpull:`23842`: Backport PR #23840 on branch v3.6.x (Remove documentation for axes_grid) +* :ghpull:`23838`: Backport PR #23834 on branch v3.6.x (Revert "Refactor handling of tick and ticklabel visibility in Axis.clear") +* :ghpull:`23840`: Remove documentation for axes_grid +* :ghpull:`23837`: Backport PR #23833 on branch v3.6.x (Remove search field from sidebar) +* :ghpull:`23836`: Backport PR #23823 on branch v3.6.x ([DOC] Improve dev setup description) +* :ghpull:`23834`: Revert "Refactor handling of tick and ticklabel visibility in Axis.clear" +* :ghpull:`23833`: Remove search field from sidebar +* :ghpull:`23823`: [DOC] Improve dev setup description +* :ghpull:`23822`: Backport PR #23813 on branch v3.6.x (Triplot duplicated label) +* :ghpull:`23813`: Triplot duplicated label +* :ghpull:`23811`: Backport PR #23805 on branch v3.6.x (sphinxext: Do not copy plot_directive.css's metadata) +* :ghpull:`23805`: sphinxext: Do not copy plot_directive.css's metadata +* :ghpull:`23800`: Backport PR #23785 on branch v3.6.x (FIX: ensure type stability for missing cmaps in ``set_cmap``) +* :ghpull:`23799`: Backport PR #23790 on branch v3.6.x (DOC: Add cache busting to all static assets) +* :ghpull:`23785`: FIX: ensure type stability for missing cmaps in ``set_cmap`` +* :ghpull:`23790`: DOC: Add cache busting to all static assets +* :ghpull:`23791`: Backport PR #23774 on branch v3.6.x (Correct rcParams-name in AutoDateFormatter doc-string) +* :ghpull:`23792`: Backport PR #23781 on branch v3.6.x (ci: Add plot types to sphinx-gallery artifacts) +* :ghpull:`23789`: Backport PR #23786 on branch v3.6.x (DOC: fontfallback works for most of the backends) +* :ghpull:`23788`: Backport PR #23784 on branch v3.6.x (DOC: Fix num2date docstring) +* :ghpull:`23786`: DOC: fontfallback works for most of the backends +* :ghpull:`23784`: DOC: Fix num2date docstring +* :ghpull:`23781`: ci: Add plot types to sphinx-gallery artifacts +* :ghpull:`23783`: Backport PR #23782 on branch v3.6.x (Remove ``Axes.cla`` from examples) +* :ghpull:`23782`: Remove ``Axes.cla`` from examples +* :ghpull:`23774`: Correct rcParams-name in AutoDateFormatter doc-string +* :ghpull:`23773`: Backport PR #23772 on branch v3.6.x (3d plots what's new cleanups) +* :ghpull:`23772`: 3d plots what's new cleanups +* :ghpull:`23765`: Backport PR #23762 on branch v3.6.x (FIX: legend handler warning too liberal) +* :ghpull:`23762`: FIX: legend handler warning too liberal +* :ghpull:`23759`: Backport PR #23686 on branch v3.6.x (Improve matplotlib.pyplot importtime by caching ArtistInspector) +* :ghpull:`23686`: Improve matplotlib.pyplot importtime by caching ArtistInspector +* :ghpull:`23756`: Backport PR #23569 on branch v3.6.x (Fix hidden xlabel bug in colorbar) +* :ghpull:`23755`: Backport PR #23742 on branch v3.6.x (FIX: unbreak ipympl) +* :ghpull:`23569`: Fix hidden xlabel bug in colorbar +* :ghpull:`23742`: FIX: unbreak ipympl +* :ghpull:`23752`: Backport PR #23750 on branch v3.6.x (Fix rcParams documentation) +* :ghpull:`23749`: Backport PR #23735 on branch v3.6.x (Correctly handle Axes subclasses that override cla) +* :ghpull:`23735`: Correctly handle Axes subclasses that override cla +* :ghpull:`23748`: Backport PR #23746 on branch v3.6.x (DOC: add numpydoc docstring + commentary to Axis.get_ticklocs) +* :ghpull:`23747`: Backport PR #23721 on branch v3.6.x (3d plot view angle documentation) +* :ghpull:`23746`: DOC: add numpydoc docstring + commentary to Axis.get_ticklocs +* :ghpull:`23721`: 3d plot view angle documentation +* :ghpull:`23744`: Backport PR #23740 on branch v3.6.x (Clarify error for colorbar with unparented mappable) +* :ghpull:`23741`: Backport PR #23674 on branch v3.6.x (Re-rename builtin seaborn styles to not include a dot.) +* :ghpull:`23740`: Clarify error for colorbar with unparented mappable +* :ghpull:`23674`: Re-rename builtin seaborn styles to not include a dot. +* :ghpull:`23738`: Backport PR #23639 on branch v3.6.x (Adding the new contributor meeting) +* :ghpull:`23739`: Backport PR #23712 on branch v3.6.x (FIX: do not try to help CPython with garbage collection) +* :ghpull:`23712`: FIX: do not try to help CPython with garbage collection +* :ghpull:`23639`: Adding the new contributor meeting +* :ghpull:`23732`: Backport PR #23729 on branch v3.6.x (Use cleaner recursion check in PyQt FigureCanvas' resizeEvent.) +* :ghpull:`23734`: Backport PR #23733 on branch v3.6.x (DOC: Update theme configuration for upcoming changes) +* :ghpull:`23733`: DOC: Update theme configuration for upcoming changes +* :ghpull:`23728`: Backport PR #23722 on branch v3.6.x (Restore deprecation class aliases in cbook) +* :ghpull:`23729`: Use cleaner recursion check in PyQt FigureCanvas' resizeEvent. +* :ghpull:`23726`: Backport PR #23711 on branch v3.6.x (Fix deprecation messages for vendoring unused things) +* :ghpull:`23722`: Restore deprecation class aliases in cbook +* :ghpull:`23727`: Backport PR #23724 on branch v3.6.x (Fix/harmonize spacing in dependencies.rst.) +* :ghpull:`23724`: Fix/harmonize spacing in dependencies.rst. +* :ghpull:`23711`: Fix deprecation messages for vendoring unused things +* :ghpull:`23715`: Backport PR #23708 on branch v3.6.x (Loosen up test_Normalize test) +* :ghpull:`23713`: Backport PR #23710 on branch v3.6.x (Fix cmap deprecations) +* :ghpull:`23708`: Loosen up test_Normalize test +* :ghpull:`23710`: Fix cmap deprecations +* :ghpull:`23696`: Backport PR #23695 on branch v3.6.x (Document polar handling of _interpolation_steps.) +* :ghpull:`23706`: Backport PR #23705 on branch v3.6.x (DOC: Added link to class under discussion) +* :ghpull:`23705`: DOC: Added link to class under discussion +* :ghpull:`23695`: Document polar handling of _interpolation_steps. +* :ghpull:`23668`: Api deprecate cmap functions +* :ghpull:`23049`: Add ``minor`` keyword argument to ``plt.x/yticks`` +* :ghpull:`23665`: Harmonize docstrings for boxstyle/connectionstyle/arrowstyle. +* :ghpull:`23636`: FIX: macosx flush_events should process all events +* :ghpull:`23555`: Uncamelcase offsetTrans in draw_path_collection. +* :ghpull:`23682`: Fix generated documentation for deprecated modules +* :ghpull:`23678`: Get rcParams from mpl +* :ghpull:`23571`: Simplify _bind_draw_path_function. +* :ghpull:`23673`: DOC: Highlight information about avoiding labels in legend +* :ghpull:`22506`: Replace MathtextBackend mechanism. +* :ghpull:`23340`: Set correct path for Arc +* :ghpull:`23562`: Fix issue with get_edgecolor and get_facecolor in 3D plots +* :ghpull:`23634`: make.bat: Don't override SPHINXOPTS/O from the environment +* :ghpull:`23675`: Deprecate helper functions in axis3d +* :ghpull:`23676`: MNT: Get rcParams from mpl +* :ghpull:`23677`: TST: Use article class when checking for pgf +* :ghpull:`23669`: CI: Azure update from ubuntu-18.04 to ubuntu-latest and ubuntu-20.04 +* :ghpull:`23670`: Add bar color demo. +* :ghpull:`23644`: Standardize edge-on axis locations when viewing primary 3d axis planes +* :ghpull:`23563`: Fix issue with drawing 3D lines where points are from nparray +* :ghpull:`23666`: MNT: Deprecate macosx prepare subplots tool +* :ghpull:`23572`: Deprecate ``get_grid_positions(..., raw=True)``. +* :ghpull:`23525`: Add functionality to label individual bars with Axes.bar() +* :ghpull:`23667`: Fix flake8 errors introduced by crossed PRs +* :ghpull:`23554`: MNT: Remove unused imports +* :ghpull:`23659`: Simplify/fix save_diff_image. +* :ghpull:`23663`: Small cleanups to _find_fonts_by_props. +* :ghpull:`23662`: Add tolerance to test failing on ppc64le +* :ghpull:`23623`: MNT: remove _gridspecs attribute on Figure classes +* :ghpull:`23654`: Reverts macosx change to ARC +* :ghpull:`23661`: Remove unused fontsize argument from private mathtext _get_info. +* :ghpull:`23655`: Merge branch v3.5.x into main +* :ghpull:`23658`: Increase tolerance on multi-font tests +* :ghpull:`23657`: Add eps to extension list in image triager +* :ghpull:`23656`: Fix broken link to MathML torture tests. +* :ghpull:`23649`: CI: Use anaconda-client v1.10.0 for upload of nightlies +* :ghpull:`23647`: Allow any color format to be used for axis3d.Axis.set_pane_color +* :ghpull:`23643`: Enable wheels for PyPy 3.8+ +* :ghpull:`23621`: DOC: update and extend fonts explanation +* :ghpull:`23612`: CI: try installing a different version of noto on OSX +* :ghpull:`23619`: add pikepdf and visual c++ dependency +* :ghpull:`23631`: Leave out ``barh`` from the basic plot types. +* :ghpull:`23637`: BLD: Add Python 3.11 builds to CI +* :ghpull:`23632`: Add discouraged admonitions +* :ghpull:`23620`: Doc update deps +* :ghpull:`23627`: Bump pypa/cibuildwheel from 2.8.1 to 2.9.0 +* :ghpull:`23628`: Change Title Case to Upper lower in templates +* :ghpull:`23206`: Change exception type for incorrect SVG date metadata +* :ghpull:`23387`: Remove setuptools_scm_git_archive dependency and add sdist test +* :ghpull:`23605`: Fix issues in examples, docs, and tutorials +* :ghpull:`23618`: [Doc]: Document the position parameter in apply_aspect() +* :ghpull:`23355`: Revert "Try to unbreak CI by xfailing OSX Tk tests" +* :ghpull:`23610`: TST: be more forgiving about IDing Noto +* :ghpull:`23609`: print version number when building docs +* :ghpull:`20832`: Implement multi-font embedding for PS Backend +* :ghpull:`20804`: Implement multi-font embedding for PDF Backend +* :ghpull:`23202`: MNT: Remove cached renderer from figure +* :ghpull:`23497`: Avoid gridspec in more examples +* :ghpull:`23602`: Editing "issues for new contributors" +* :ghpull:`23600`: DOC: view_init docstring for 3d axes primary view angles +* :ghpull:`23587`: BUG:datetime list starting with none +* :ghpull:`23559`: re-base of font fallback for pdf and eps output + SVG support +* :ghpull:`23557`: BLD: update the manylinux versions used +* :ghpull:`23596`: Minor cleanup of axes_grid1 +* :ghpull:`23594`: Expire deprecation on passing bytes to FT2Font.set_text +* :ghpull:`23435`: Add conda env to setup instructions +* :ghpull:`23574`: Move colorbar() doc to method itself. +* :ghpull:`23584`: Bump Ubuntu to 20.04 on GitHub Actions +* :ghpull:`23561`: Clean up code in tri +* :ghpull:`23582`: Cleanup axis3d.Axis.draw +* :ghpull:`23510`: Refactor Widget tests +* :ghpull:`20718`: Circle: Build docs in parallel. +* :ghpull:`22452`: ENH: add ability to remove layout engine +* :ghpull:`23516`: warning when scatter plot color settings discarded +* :ghpull:`23577`: apply_aspect cleanups +* :ghpull:`23575`: Cleanup parasite_simple example. +* :ghpull:`23567`: Remove noop setattr_cm. +* :ghpull:`23412`: Fix dash offset bug in Patch +* :ghpull:`21756`: MNT: Clean up some UTF strings and memory autorelease +* :ghpull:`23558`: MNT: Use UTF-8 string in macosx backend +* :ghpull:`23550`: Change exception types, improve argument checking, and cleanups in mpl_toolkits +* :ghpull:`23196`: Unify set_pickradius argument +* :ghpull:`20740`: Implement Font-Fallback in Matplotlib +* :ghpull:`22566`: Add rcparam for figure label size and weight +* :ghpull:`23551`: Remove transform arguments from _iter_collection +* :ghpull:`23444`: Deduplicate common parts in LatexManager.{__init__,_setup_latex_process} +* :ghpull:`23017`: [ENH] : Provide axis('equal') for Axes3D (replace PR #22705) +* :ghpull:`22950`: Simplify definition of mathtext symbols & correctly end tokens in mathtext parsing +* :ghpull:`23409`: Provide axis('equal') for Axes3D (replaces PR #23017) +* :ghpull:`23434`: Fix array-like linewidth for 3d scatter +* :ghpull:`23500`: Move the common implementation of Axes.set_x/y/zscale to Axis. +* :ghpull:`23533`: Add tests for sankey and minor fixes +* :ghpull:`23535`: Make margins error as claimed in doc-string +* :ghpull:`23546`: Simplify impl. of functions optionally used as context managers. +* :ghpull:`23494`: Fix various issues from SonarQube +* :ghpull:`23529`: Add workflow dispatch GitHub CI +* :ghpull:`23539`: Small improvements to WebAgg example +* :ghpull:`23541`: Change doc-build CI install order +* :ghpull:`23526`: DOC: make "family" less ambiguous in FontProperties docs +* :ghpull:`23537`: Move the deprecated RendererGTK{3,4}Cairo to a single place. +* :ghpull:`23140`: [Features] Allow setting legend title alignment +* :ghpull:`23538`: Fix imprecise docs re: backend dependencies. +* :ghpull:`23532`: Add test for RGBAxes +* :ghpull:`23453`: Add more tests for mplot3d +* :ghpull:`23501`: Let Axes.clear iterate over Axises. +* :ghpull:`23469`: Inline _init_axis_artists & _init_gridlines into clear. +* :ghpull:`23475`: Add markerfacealt to pass-through arguments for error bar lines +* :ghpull:`23527`: STY: fix whitespace on an assert +* :ghpull:`23495`: Fix sgskip'd examples +* :ghpull:`23404`: Restore matplotlib.__doc__ in Sphinx docs +* :ghpull:`23507`: Add hint when More than {max_open_warning} figures have been opened +* :ghpull:`23499`: Fix outdated comment re: event handlers in test_backends_interactive. +* :ghpull:`23498`: Fix direct instantiation of webagg_core managers. +* :ghpull:`23504`: Clarify formatting of the code-for-reproduction field in bug reports. +* :ghpull:`23489`: Add missing test data to install +* :ghpull:`23482`: Mathtext spaces must be independent of font style. +* :ghpull:`23486`: Bump pypa/cibuildwheel from 2.8.0 to 2.8.1 +* :ghpull:`23461`: Tweak Axes repr. +* :ghpull:`16931`: Make it easier to improve UI event metadata. +* :ghpull:`23468`: Display grid in floating axes example. +* :ghpull:`23467`: Remove old handling for factor=None in axisartist. +* :ghpull:`23443`: Try running the pgf backend off the article class. +* :ghpull:`23373`: Fix pan/zoom crashing when widget lock is unavailable +* :ghpull:`23466`: Update filename in example. +* :ghpull:`23464`: Deprecate macos close handler. +* :ghpull:`23463`: Deprecate Tick.label +* :ghpull:`23455`: Deprecate properties w_xaxis, w_yaxis, and w_zaxis +* :ghpull:`23448`: Tweak callbacks to generate pick events. +* :ghpull:`23233`: Default stem marker color follows the linecolor +* :ghpull:`23452`: Generalize Axes __repr__ to 3D +* :ghpull:`23445`: Compare thread native ids when checking whether running on main thread. +* :ghpull:`20752`: Set norms using scale names. +* :ghpull:`23438`: DOC: numpydoc-ify date Locator classes +* :ghpull:`23427`: Tweak pgf escapes. +* :ghpull:`23432`: Fixed typo in docs animation api +* :ghpull:`23420`: Clean up test_chunksize_fails() +* :ghpull:`23415`: Minor improvements to units_sample example +* :ghpull:`21339`: Added linear scaling test to Hexbin marginals +* :ghpull:`23414`: Bump pypa/cibuildwheel from 2.7.0 to 2.8.0 +* :ghpull:`23413`: Combine chunk size tests into one +* :ghpull:`23403`: Small cleanup to VertexSelector. +* :ghpull:`23291`: In the new/simplified backend API, don't customize draw_if_interactive. +* :ghpull:`23350`: Fixed SVG-as-text image comparison tests. +* :ghpull:`23406`: DOC: Fix calculation of bin centers in multi-histogram +* :ghpull:`23407`: TST: Add missing warning type to pytest.warns +* :ghpull:`23402`: Link 3D animation examples to one another. +* :ghpull:`23401`: Upload wheel artifacts from the correct directory +* :ghpull:`23374`: GOV: point CoC reports at CoC steering council subcomittee mailing list +* :ghpull:`23393`: Clean up formatting of custom cmap example +* :ghpull:`23146`: Update cibuildwheel +* :ghpull:`23368`: Add a helper to generate closed paths. +* :ghpull:`20220`: DOC: add mission statement +* :ghpull:`22364`: Tweak mathtext/tex docs. +* :ghpull:`23377`: Use tick_params more often over tick iteration +* :ghpull:`22820`: [Doc] consolidate ``rect`` documentation +* :ghpull:`23371`: Default animation.convert_args to ["-layers", "OptimizePlus"]. +* :ghpull:`23148`: DOC: change address to send security issues to +* :ghpull:`23365`: DOC: add new showcase example, replace gendered one +* :ghpull:`23033`: Fix issue with tex-encoding on non-Unicode platforms +* :ghpull:`23358`: Shorten/clarify definition of extension types. +* :ghpull:`23370`: Small cleanups to animation. +* :ghpull:`23364`: Rename/change signature of PyGlyph_new. +* :ghpull:`23363`: Simplify FigureCanvas multiple inheritance init by swapping bases order. +* :ghpull:`23366`: MNT: use devel version of theme +* :ghpull:`23357`: Fixed decimal points not appearing at end of Mathtext string. +* :ghpull:`23351`: DOC/MNT install docs with dev version of sphinx theme +* :ghpull:`23349`: CI: Remove old scipy-wheels-nightly uploads to ensure space +* :ghpull:`23348`: Support multi-figure MultiCursor; prepare improving its signature. +* :ghpull:`23360`: embedding_in_tk_sgskip.py: use root.destroy +* :ghpull:`23354`: MNT: Use list comprehension +* :ghpull:`23299`: FIX/API: do not reset backend key in rc_context +* :ghpull:`23191`: ENH: add width_ratios and height_ratios to subplots +* :ghpull:`23060`: MNT: Change objective C code to Automatic Reference Counting (ARC) +* :ghpull:`23347`: Simplify/improve check for pycairo in Gtk-based backends. +* :ghpull:`23316`: DOC: improve spines crosslinking +* :ghpull:`23100`: Remove custom backend_nbagg.show(), putting logic in manager show. +* :ghpull:`23342`: FIX: make sure addFont test removes the test font +* :ghpull:`23266`: negative_linestyles kwarg in contour.py +* :ghpull:`23332`: Validate Text linespacing on input. +* :ghpull:`23336`: Remove ineffective exclusion of Arcs without parent Axes. +* :ghpull:`23341`: MNT: Use '--pytest-test-first' option for naming clarity +* :ghpull:`23337`: Remove now inexistent "datapath" rcParam from style blacklist. +* :ghpull:`22004`: Make RendererCairo auto-infer surface size. +* :ghpull:`23208`: ENH: enable stripey lines +* :ghpull:`23288`: Correct URL area with rotated texts in PDFs +* :ghpull:`23197`: Add tests for pan +* :ghpull:`22167`: Deprecate selector ``visible`` attribute +* :ghpull:`23322`: Cleanup FontProperties examples. +* :ghpull:`23321`: Tweak examples capitalization/punctuation. +* :ghpull:`23270`: Fix handling of nonmath hyphens in mathtext. +* :ghpull:`23310`: Move Cursor demo from examples/misc to examples/event_handling +* :ghpull:`23313`: Drop CSS styles that are in mpl-sphinx-theme +* :ghpull:`23314`: Don't draw invisible 3D Axes +* :ghpull:`23302`: Deprecate stem(..., use_line_collection=False) +* :ghpull:`23309`: Remove front page examples +* :ghpull:`23282`: Backport PR #22865 on branch v3.5.x (Fix issue with colorbar extend and drawedges) +* :ghpull:`23231`: Add pytest-xvfb as test dependency +* :ghpull:`23318`: No need to return OrderedDict from _gen_axes_spines. +* :ghpull:`23295`: Replace re.sub by the faster str.translate. +* :ghpull:`23300`: Modify example of "Fig Axes Customize Simple" +* :ghpull:`23014`: Improve consistency in LogLocator and LogFormatter API +* :ghpull:`23286`: Refactor URL handling in PDF backend +* :ghpull:`23065`: Fix test_image_comparison_expect_rms +* :ghpull:`23294`: Simplify binary data handling in ps backend. +* :ghpull:`23284`: DOC: Switch to HTML5 and cleanup CSS +* :ghpull:`23276`: Add get/set methods for DPI in SubFigure +* :ghpull:`23207`: Update build environment and improve test +* :ghpull:`23213`: DEV: Add name-tests-test to pre-commit hooks +* :ghpull:`23289`: Properly make Name.hexify go through a deprecation cycle. +* :ghpull:`23177`: Deprecate positional passing of most Artist constructor parameters +* :ghpull:`23287`: Minor tweaks to pdf Name. +* :ghpull:`23285`: In mathtext, replace manual caching (via ``glyphd``) by lru_cache. +* :ghpull:`23034`: Correctly read the 'style' argument while processing 'genfrac'. +* :ghpull:`23247`: Support inverted parentheses in mathtext. +* :ghpull:`23190`: Deprecate unused methods in axis.py +* :ghpull:`23219`: MNT: Rename example files with 'test' in name +* :ghpull:`23277`: MNT: Remove dead code in SVG backend +* :ghpull:`23261`: Bump actions/setup-python from 3 to 4 +* :ghpull:`23264`: Changing environment.yml for it to work on Windows +* :ghpull:`23269`: MNT: Remove dead code in Colorbar +* :ghpull:`23262`: Simplify qt_compat, in particular post-removal of qt4 support. +* :ghpull:`23263`: Private helper to get requested backend without triggering resolution. +* :ghpull:`23243`: Fix spacing after mathtext operators with sub/superscripts +* :ghpull:`22839`: Fix spacing after mathtext operators with sub/superscripts +* :ghpull:`23256`: DOC: Add note about Inkscape install on Windows +* :ghpull:`23258`: DOC: remove Blue Book url +* :ghpull:`23255`: Add a helper to generate mathtext error strings. +* :ghpull:`23246`: Fix argument checking for set_interpolation_stage +* :ghpull:`22881`: Support not embedding glyphs in svg mathtests. +* :ghpull:`23198`: Rename ncol parameter in legend to ncols +* :ghpull:`23251`: Small simplifications to mathtext tests. +* :ghpull:`23249`: Don't allow ``r"$\left\\|\right.$"``, as in TeX. +* :ghpull:`23248`: Rename test markers +* :ghpull:`22507`: Remove *math* parameter of various mathtext internal APIs. +* :ghpull:`23192`: Add tests, improve error messages in axis/_base, and code cleanup +* :ghpull:`23241`: Fix invalid value in radio buttons example +* :ghpull:`23187`: Correct docs and use keyword arguments in _mathtext.py +* :ghpull:`23045`: MNT: Merge locally defined test marks +* :ghpull:`22289`: ENH: compressed layout +* :ghpull:`23237`: Expire BoxStyle._Base deprecation. +* :ghpull:`23225`: DOC: Fix version switcher links to documentation +* :ghpull:`23221`: DOC: recommend numpy random number generator class +* :ghpull:`23223`: Changed offset reference, add small doc +* :ghpull:`23215`: DOC: link the transforms tutorial from the module +* :ghpull:`23201`: Rework tricontour and tricontourf documentation +* :ghpull:`23013`: Add tests for date module +* :ghpull:`23188`: Mnt new default dates +* :ghpull:`22745`: MNT: Don't require renderer for window_extent and tightbbox +* :ghpull:`23077`: MNT: Remove keyword arguments to gca() +* :ghpull:`23182`: Simplify webagg blitting. +* :ghpull:`23181`: Init FigureCanvasAgg._lastKey in ``__init__``. +* :ghpull:`23175`: Point the version switcher to a name listed in switcher.json +* :ghpull:`22669`: Cleanup documentation generation for pyplot +* :ghpull:`22519`: fix markevery plot option with nans in data +* :ghpull:`21584`: Move towards having get_shared_{x,y}_axes return immutable views. +* :ghpull:`23170`: ENH: update ticks when requesting labels +* :ghpull:`23169`: DOC: Migrate to sphinx-design +* :ghpull:`23180`: Improve docstring of triplot() and PatchCollection +* :ghpull:`23153`: Restore accidentally removed pytest.ini and tests.py. +* :ghpull:`23166`: Deprecate passing most Legend arguments positionally +* :ghpull:`23165`: DOCS Fix a few typos +* :ghpull:`23167`: DOCS fix typo +* :ghpull:`23062`: Add stackplot to plot types listing +* :ghpull:`23161`: Added my (open access) book +* :ghpull:`23141`: Minor fix for astropy units support broken in earlier PR +* :ghpull:`23156`: No longer call draw_if_interactive in parasite_axes. +* :ghpull:`23150`: DOC fix typo +* :ghpull:`23149`: DOCS remove duplicate text +* :ghpull:`23145`: Fix format error in switcher.json +* :ghpull:`21755`: MNT: Clean up macosx backend set_message +* :ghpull:`23128`: DOCS Fix typos +* :ghpull:`23130`: Drop pytest warning config in nightly tests +* :ghpull:`23135`: Unpin coverage again +* :ghpull:`23133`: Make module deprecation messages consistent +* :ghpull:`23134`: Remove newline from start of deprecation warnings +* :ghpull:`22964`: Fix spelling errors +* :ghpull:`22929`: Handle NaN in bar labels and error bars +* :ghpull:`23093`: MNT: Removing 3.4 deprecations +* :ghpull:`23090`: Derive new_figure_manager from FigureCanvas.new_manager. +* :ghpull:`23099`: Remove unneeded cutout for webagg in show(). +* :ghpull:`23097`: Tweak check for IPython pylab mode. +* :ghpull:`23088`: Improve error for invalid format strings / misspelled data keys. +* :ghpull:`23092`: Ensure updated monkey-patching of sphinx-gallery EXAMPLE_HEADER +* :ghpull:`23087`: Fix width/height inversion in dviread debug helper. +* :ghpull:`23089`: Normalize tk load failures to ImportErrors. +* :ghpull:`23091`: Move test that fig.add_axes() needs parameters +* :ghpull:`23067`: more explicit in windows doc build instructions +* :ghpull:`23081`: MNT: Deprecate date_ticker_factory +* :ghpull:`23079`: MNT: Remove key_press and button_press from FigureManager +* :ghpull:`23076`: MNT: Remove positional argument handling in LineCollection +* :ghpull:`23078`: MNT: Remove deprecated axis.cla() +* :ghpull:`23054`: Slightly simplify tcl/tk load in extension. +* :ghpull:`23073`: MNT: Remove dummy_threading because threading is always available +* :ghpull:`22405`: DOC: put the gallery keywords in the meta tag +* :ghpull:`23071`: Fix installing contourpy on CI +* :ghpull:`23068`: Slight refactor of _c_internal_utils to linewrap it better. +* :ghpull:`23070`: Pathlibify autotools invocation in build. +* :ghpull:`22755`: Maybe run autogen as part of freetype install +* :ghpull:`23063`: doc: mathtext example: use axhspan() instead of fill_between() for backdrop rectangle shading +* :ghpull:`23055`: Cleanup Annotation.update_position. +* :ghpull:`22567`: Use contourpy for quad contour calculations +* :ghpull:`22801`: TST: fully parameterize test_lazy_linux_headless +* :ghpull:`22180`: ENH: Use rcParams savefig.directory on macosx backend +* :ghpull:`23048`: Add rrulewrapper to docs +* :ghpull:`23047`: Fix issue with hist and float16 data +* :ghpull:`23044`: Fix missing section header for nightly builds +* :ghpull:`23029`: Demonstrate both usetex and non-usetex in demo_text_path.py. +* :ghpull:`23038`: Factor out errorevery parsing for 2D and 3D errorbars. +* :ghpull:`23036`: Suppress traceback chaining for tex subprocess failures. +* :ghpull:`23037`: Suppress exception chaining in FontProperties. +* :ghpull:`23020`: Add test to close legend issue +* :ghpull:`23031`: Specify that style files are utf-8. +* :ghpull:`22991`: Enable ``plt.sca`` on subfigure's axes +* :ghpull:`23030`: DOC: Fix charset declaration in redirects +* :ghpull:`23022`: Fix some possible encoding issues for non-utf8 systems. +* :ghpull:`23023`: Bump docker/setup-qemu-action from 1 to 2 +* :ghpull:`23024`: DOC: do not suggest to sudo pip install Matplotlib +* :ghpull:`23018`: Fix typo in font family +* :ghpull:`22627`: ENH: rect for constrained_layout +* :ghpull:`22891`: Font example monospace +* :ghpull:`23006`: docs: add subplot-mosaic string compact notation +* :ghpull:`23009`: Fixed installation guide command typo +* :ghpull:`22926`: Fix RangeSlider for same init values #22686 +* :ghpull:`22989`: Merge v3.5.x back into main +* :ghpull:`22993`: STY: Fix typos in colormap +* :ghpull:`22777`: DEV: Add codespell to pre-commit hooks +* :ghpull:`22940`: Fixed dpi bug in rainbow text example +* :ghpull:`22298`: MNT: Remove cmap_d colormap access +* :ghpull:`22387`: Add a registry for color sequences +* :ghpull:`21594`: Document text alignment +* :ghpull:`22967`: TST: Add some tests for QuadMesh contains function +* :ghpull:`22936`: ENH: Add full-screen toggle to the macosx backend +* :ghpull:`22886`: MNT: remove mpl_toolkits.axes_grid +* :ghpull:`22952`: Make MarkerStyle immutable +* :ghpull:`22953`: MNT: Move set_cursor to the FigureCanvas +* :ghpull:`18854`: Standardize creation of FigureManager from a given FigureCanvas class. +* :ghpull:`22925`: Standardize creation of FigureManager from a given FigureCanvas class. +* :ghpull:`22875`: Remove Forward definitions where possible. +* :ghpull:`22928`: ENH: Add option to disable raising the window for macosx +* :ghpull:`22912`: DOC: Better doc of colors +* :ghpull:`22931`: BUG: Fix regression with ls=(0, ()) +* :ghpull:`22909`: FIX: skip sub directories when finding fonts on windows +* :ghpull:`22911`: Clarify docstring of [un]install_repl_displayhook() +* :ghpull:`22919`: CI: Add concurrency skips for GH Actions +* :ghpull:`22899`: Fix documentation markup issues +* :ghpull:`22906`: Clarify logic for repl displayhook. +* :ghpull:`22892`: Remove support for IPython<4. +* :ghpull:`22896`: Remove python-dateutil as test requirement +* :ghpull:`22885`: Deprecate two-layered backend_pdf.Op enum. +* :ghpull:`22883`: Tweak argument checking in tripcolor(). +* :ghpull:`22884`: Missing ``f`` prefix on f-strings fix +* :ghpull:`22877`: Small cleanups to mathtext. +* :ghpull:`21374`: Snap selectors +* :ghpull:`22824`: Remove some unnecessary extra boundaries for colorbars with extensions. +* :ghpull:`21448`: Use named groups in mathtext parser. +* :ghpull:`22609`: Improve usability of dviread.Text by third parties. +* :ghpull:`22809`: STY: Apply pre-commit hooks to codebase +* :ghpull:`22730`: Fix removed cross-references +* :ghpull:`22857`: Slightly simplify twin axes detection in MEP22 zoom. +* :ghpull:`22813`: MNT: Deprecate figure callbacks +* :ghpull:`22802`: MNT: make Axes.cla an alias for Axes.clear in all cases +* :ghpull:`22855`: Remove non-needed remove_text=False. +* :ghpull:`22854`: TST: Avoid floating point errors in asinh ticker +* :ghpull:`22850`: Simplify tick creation +* :ghpull:`22841`: Fix Tk error when updating toolbar checkbutton images +* :ghpull:`22707`: Proposed ENH: Allow user to turn off breaking of streamlines in streamplot (rebased) +* :ghpull:`22826`: Bump actions/upload-artifact from 2 to 3 +* :ghpull:`22825`: Bump codecov/codecov-action from 2 to 3 +* :ghpull:`22821`: Use bool for bool keyword arguments +* :ghpull:`22815`: Fix pickling of globally available, dynamically generated norm classes. +* :ghpull:`22702`: Doc tweak transform tutorial +* :ghpull:`22613`: DOC: Add links to explicit vs implicit API everywhere "OO" is used +* :ghpull:`22712`: Use repr in error messages +* :ghpull:`22794`: Fix ps export of colored hatches with no linewidth +* :ghpull:`22797`: Deprecate functions in backends +* :ghpull:`22608`: Axes.inset_axes: enable Axes subclass creation +* :ghpull:`22795`: Replace "marker simplification" by "marker subsampling" in docs. +* :ghpull:`22768`: Fix inkscape tests +* :ghpull:`22791`: Tweak _ConverterError reporting. +* :ghpull:`22447`: Improve bar_label annotation +* :ghpull:`22710`: Fix the error- TypeError: 'float' object is not iterable +* :ghpull:`22444`: Revert "CI: skip test to work around gs bug" +* :ghpull:`22785`: CI: Update weekly dependency test job +* :ghpull:`22784`: Fix 'misspelled' transform variable +* :ghpull:`22778`: Fix LaTeX formatting in examples +* :ghpull:`22779`: Improve mlab documentation (and example) +* :ghpull:`22759`: MNT: Skip existing wheels during nightly wheel upload +* :ghpull:`22751`: BLD: do not put an upper bound on pyparsing +* :ghpull:`22752`: DOC: Correct nightly wheels pip install command +* :ghpull:`22742`: Fix deprecation of backend_tools.ToolBase.destroy +* :ghpull:`22725`: Move towards making texmanager stateless. +* :ghpull:`22734`: Added clim support to tripcolor +* :ghpull:`22733`: CI: Add GHA workflow to upload nightly wheels +* :ghpull:`21637`: Also upload a subset of nightly wheels +* :ghpull:`22698`: Correct cross-references in documentation +* :ghpull:`22263`: DOC: condense version switcher +* :ghpull:`22361`: Revert datetime usetex ticklabels to use default tex font. +* :ghpull:`22721`: Small style fixes. +* :ghpull:`22356`: Cleanup tripcolor() +* :ghpull:`22360`: Let TeX handle multiline strings itself. +* :ghpull:`22418`: Deprecate auto-removal of overlapping Axes by plt.subplot{,2grid}. +* :ghpull:`22722`: Rename confusingly-named cm_fallback. +* :ghpull:`22697`: Deprecate in testing.decorators +* :ghpull:`22556`: Add text.parse_math rcParams +* :ghpull:`22163`: Change colour of Tk toolbar icons on dark backgrounds +* :ghpull:`22704`: Small simplification to textpath. +* :ghpull:`22498`: TST: increase coverage on tk tests +* :ghpull:`21425`: Make Axis3D constructor signature closer to the one of 2D axis. +* :ghpull:`22665`: Improve error message for incorrect color string +* :ghpull:`22685`: Rewrite plot format detection from sphinx build target +* :ghpull:`22670`: Update deprecated vmImage 'vs2017-win2016' in azure pipelines +* :ghpull:`22503`: Deprecate backend_qt.qApp. +* :ghpull:`22683`: Add missing space before : for parameters +* :ghpull:`22591`: Fix Path/str-discrepancy in FontManager.addpath and improve documentation +* :ghpull:`22680`: Bump actions/cache from 2 to 3 +* :ghpull:`22659`: Add description on quiver head parameters +* :ghpull:`22668`: Raise on missing closing quotes in matplotlibrc +* :ghpull:`22675`: Tweak colorbar_placement example. +* :ghpull:`22276`: Merge "Scatter Symbol" and "Scatter Custom Symbol" examples +* :ghpull:`22658`: Remove reference to now-deleted reminder note. +* :ghpull:`22652`: Update documentation example and fix See also +* :ghpull:`22587`: Refactor handling of tick and ticklabel visibility in Axis.clear() +* :ghpull:`22148`: MNT: Deprecate ``docstring`` +* :ghpull:`22170`: Add example to polygon selector docstring showing how to set vertices programmatically +* :ghpull:`22650`: Fix new leak in ft2font introduced in #22604 +* :ghpull:`22644`: FIX: Flush events after closing figures in macosx backend +* :ghpull:`22643`: Suppress exception chaining in colormap lookup. +* :ghpull:`22639`: ENH: MacOSX backend to use sRGB instead of GenericRGB colorspace +* :ghpull:`22509`: Simplifications to ToolManager.{add,remove}_tool. +* :ghpull:`22633`: DOC: remove space in directive. +* :ghpull:`22631`: Add space between individual transform components in svg output. +* :ghpull:`22523`: MNT: Use a context manager to change the norm in colorbar code +* :ghpull:`22615`: FIX: Change get_axis_map to axis_map now +* :ghpull:`22508`: Move tracking of autoscale status to Axis. +* :ghpull:`22547`: Small cleanups around TexManager usage. +* :ghpull:`22511`: Remove redundant rcParam-lookup in patches +* :ghpull:`22516`: Expire deprecations in backends +* :ghpull:`22612`: Updated grammar to reflect more common usage of output vs outputted in animation.py +* :ghpull:`22589`: Support quoted strings in matplotlibrc +* :ghpull:`22604`: MNT: Fix types in C-code to reduce warnings +* :ghpull:`22610`: Fix alternative suggestion in epoch2num() deprecation +* :ghpull:`22554`: Prepare for making create_dummy_axis not necessary. +* :ghpull:`22607`: ENH: Add dark/light mode theme to the buttons +* :ghpull:`21790`: FIX: Update blitting and drawing on the macosx backend +* :ghpull:`22175`: FIX: Update macosx animation handling +* :ghpull:`22569`: Require non-zero dash value +* :ghpull:`22544`: Correct paper sizes +* :ghpull:`20470`: Issues warnings for legend handles without handlers +* :ghpull:`22558`: MNT: Simplify imports +* :ghpull:`22580`: fix doc for annotation_clip parameter +* :ghpull:`22581`: DOC: fix various typos +* :ghpull:`22573`: Bump actions/setup-python from 2 to 3 +* :ghpull:`22568`: Rename qhull source to _qhull_wrapper.cpp. +* :ghpull:`22561`: FIX: Handle stopped animation figure resize +* :ghpull:`22562`: TST: Add a frame test for animations +* :ghpull:`22514`: Expire deprecations in cbook.deprecation +* :ghpull:`22555`: Use picklable callbacks for DraggableBase. +* :ghpull:`22552`: Tweak dependency checking in doc/conf.py. +* :ghpull:`22550`: Require sphinx>=3 & numpydoc>=1.0 for building docs. +* :ghpull:`22539`: Deprecate toplevel mpl.text.get_rotation; normalize rotations early. +* :ghpull:`22502`: Cleanup unused imports and variables in backends +* :ghpull:`20071`: Document, test, and simplify impl. of auto_adjustable_area. +* :ghpull:`22366`: Deprecation removal/updates in axes3d +* :ghpull:`22484`: Simplify the internal API to connect picklable callbacks. +* :ghpull:`22417`: Support passing rgbaFace as an array to agg's draw_path. +* :ghpull:`22412`: Turn _get_axis_map() into a property and remove _get_axis_list() +* :ghpull:`22486`: Expire deprecations in lines and patches +* :ghpull:`22512`: Increase coverage +* :ghpull:`22504`: Simplify FontProperties init. +* :ghpull:`22497`: Remove entries of MathTextParser._backend_mapping deprecated in 3.4. +* :ghpull:`22487`: Don't key MathTextParser cache off a mutable FontProperties. +* :ghpull:`22468`: Turn _mathtext.ship into a plain function. +* :ghpull:`22490`: Deprecate unused, untested Affine2D.identity(). +* :ghpull:`22491`: Linewrap setupext to 79 character lines. +* :ghpull:`22488`: Some more maintenance for mathtext internal implementation. +* :ghpull:`22485`: Change string representation of AxesImage +* :ghpull:`22240`: Add minimum macosx version +* :ghpull:`22480`: Remove _point_size_reduction. +* :ghpull:`22204`: Cleanup _mathtext internal API +* :ghpull:`22469`: Improve readability of mathtext internal structures. +* :ghpull:`22477`: Un-pyplot some examples which were already explicitly referencing axes. +* :ghpull:`22467`: Small cleanup to font handling in agg. +* :ghpull:`21178`: Add asinh axis scaling (*smooth* symmetric logscale) +* :ghpull:`22411`: Move cbook._define_aliases() to _api.define_aliases() +* :ghpull:`22465`: Deprecate unused AddList. +* :ghpull:`22451`: Clarify error message for bad keyword arguments. +* :ghpull:`21267`: Cleanup AnnotationBbox. +* :ghpull:`22464`: Small improvements related to radar_chart example. +* :ghpull:`22421`: Make most params to figure()/Figure() kwonly. +* :ghpull:`22457`: Copy arrowprops argument to FancyAnnotationBbox. +* :ghpull:`22454`: move ``_toolbar_2`` from webagg_core to webagg +* :ghpull:`22413`: Remove some trivial private getters/setters in axisartist +* :ghpull:`21634`: TST: Add future dependency tests as a weekly CI job +* :ghpull:`22079`: Share FigureManager class between gtk3 and gtk4. +* :ghpull:`22440`: Clarify warning about labels with leading underscores. +* :ghpull:`17488`: Make error message explicit in legend.py +* :ghpull:`22453`: Simplify impl. of polar limits setting API. +* :ghpull:`22449`: Small cleanup to quiver. +* :ghpull:`22415`: Make emit and auto args of set_{x,y,z}lim keyword only. +* :ghpull:`22422`: Deprecate backend_ps.convert_psfrags. +* :ghpull:`22194`: Drop support for Python 3.7 +* :ghpull:`22234`: Partial fix for grid alpha +* :ghpull:`22433`: Fix ambiguous link targets in docs. +* :ghpull:`22420`: Update plt.figure() docstring. +* :ghpull:`22388`: Make signature of Axes.annotate() more explicit. +* :ghpull:`22419`: Remove "Matplotlib version" from docs issue template +* :ghpull:`22423`: Avoid indiscriminate glob-remove in xpdf_distill. +* :ghpull:`22406`: [DOC]: Removed a redundant 'The' +* :ghpull:`21442`: Factor out common limits handling for x/y/z axes. +* :ghpull:`22397`: Axes capitalization in widgets and axes3d +* :ghpull:`22394`: Tweak Axes3D docstrings that refer to 2D plotting methods. +* :ghpull:`22383`: TST: fix doc build +* :ghpull:`21877`: DOC: attempt to explain the main different APIs +* :ghpull:`21238`: Raise when unknown signals are connected to CallbackRegistries. +* :ghpull:`22345`: MNT: make layout deprecations pending +* :ghpull:`21597`: FIX: Remove the deepcopy override from transforms +* :ghpull:`22370`: Replace tabs with spaces in C code. +* :ghpull:`22371`: Corrected a mistake in comments (Issue #22369) +* :ghpull:`21352`: Refactor hexbin(). +* :ghpull:`19214`: Improve autoscaling for high order Bezier curves +* :ghpull:`22268`: Deprecated is_decade and is_close_to_int +* :ghpull:`22359`: Slightly refactor TeX source generation. +* :ghpull:`22365`: Remove deprecated ``MovieWriter.cleanup`` +* :ghpull:`22363`: Properly capitalize "Unicode". +* :ghpull:`22025`: Deprecate various custom FigureFrameWx attributes/methods. +* :ghpull:`21391`: Reuse imsave()'s background-blending code in FigureCanvasAgg.print_jpeg. +* :ghpull:`22026`: Simplify wxframe deletion. +* :ghpull:`22351`: Fix "trailing" whitespace in C docstrings. +* :ghpull:`22342`: Docstrings for _qhull. +* :ghpull:`21836`: Slightly shorten ft2font init. +* :ghpull:`21962`: Privatize various internal APIs of backend_pgf. +* :ghpull:`22114`: Rewrite AxesStack independently of cbook.Stack. +* :ghpull:`22332`: Let TransformedPatchPath inherit most functionality from TransformedPath. +* :ghpull:`22292`: Cleanup Axis._translate_tick_kw +* :ghpull:`22339`: wx.App() should be init'ed in new_figure_manager_given_figure +* :ghpull:`22315`: More standardization of floating point slop in mpl_toolkits. +* :ghpull:`22337`: DOC: More cleanup axes -> Axes +* :ghpull:`22323`: Replace sole use of maxdict by lru_cache. +* :ghpull:`22229`: FIX: make safe to add / remove artists during ArtistList iteration +* :ghpull:`22196`: ``dates`` classes and functions support ``tz`` both as string and ``tzinfo`` +* :ghpull:`22161`: Add box when setting ``PolygonSelector.verts`` +* :ghpull:`19368`: Raise warning and downsample if data given to _image.resample is too large +* :ghpull:`22250`: Unify toolbar init across backends. +* :ghpull:`22304`: Added tests for ContourSet.legend_elements +* :ghpull:`21583`: Add pre-commit config and dev instructions +* :ghpull:`21547`: Custom cap widths in box and whisker plots in bxp() and boxplot() +* :ghpull:`20887`: Implement a consistent behavior in TkAgg backend for bad blit bbox +* :ghpull:`22317`: Rename outdated seaborn styles. +* :ghpull:`22271`: Rework/fix Text layout cache. +* :ghpull:`22097`: In mpl_toolkits, use the same floating point slop as for standard ticks. +* :ghpull:`22295`: Display bad format string in error message. +* :ghpull:`22287`: Removed unused code and variables +* :ghpull:`22244`: MNT: colorbar locators properties +* :ghpull:`22270`: Expanded documentation of Axis.set_ticks as per discussion in issue #22262 +* :ghpull:`22280`: Simplify FontProperties.copy(). +* :ghpull:`22174`: Give the Tk toolbar buttons a flat look +* :ghpull:`22046`: Add the ability to change the focal length of the camera for 3D plots +* :ghpull:`22251`: Colorbar docstring reorg +* :ghpull:`21933`: MNT: privatize colorbar attr +* :ghpull:`22258`: DOC: fix version switcher +* :ghpull:`22261`: DOC: fix switcher json +* :ghpull:`22154`: Add some tests for minspan{x,y} in RectangleSelector +* :ghpull:`22246`: DOC: add dropdown +* :ghpull:`22133`: Deprecated ``afm``, ``fontconfig_pattern``, and ``type1font`` +* :ghpull:`22249`: DOC: More capitalization of Axes +* :ghpull:`22021`: Ensure that all toolbar (old/new) subclasses can be init'ed consistently +* :ghpull:`22213`: Improve ft2font error reporting. +* :ghpull:`22245`: Deprecate cleared kwarg to get_renderer. +* :ghpull:`22239`: Fix typos +* :ghpull:`22216`: turn off the grid after creating colorbar axes +* :ghpull:`22055`: FIX: Return value instead of enum in get_capstyle/_joinstyle +* :ghpull:`22228`: Remove some unnecessary getattrs. +* :ghpull:`20426`: ENH: Layout engine +* :ghpull:`22224`: Trivial doc fix to annotations tutorial. +* :ghpull:`21894`: Jointly track x and y in PolygonSelector. +* :ghpull:`22205`: Bump minimum NumPy to 1.19 +* :ghpull:`22203`: Factor out underline-thickness lookups in mathtext. +* :ghpull:`22189`: DOC: Add hatch API to reference +* :ghpull:`22084`: Clean up 3d plot box_aspect zooming +* :ghpull:`22098`: Expire axes_grid1/axisartist deprecations. +* :ghpull:`22013`: Use standard toolbar in wx. +* :ghpull:`22160`: Removed unused variables etc. +* :ghpull:`22179`: FIX: macosx check case-insensitive app name +* :ghpull:`22157`: Improved coverage of mathtext and removed unused code +* :ghpull:`21781`: Use a fixture to get widget testing axes +* :ghpull:`22140`: Ensure log formatters use Unicode minus +* :ghpull:`21342`: Fix drawing animated artists changed in selector callback +* :ghpull:`22134`: Deprecated ``tight_bbox`` and ``tight_layout`` modules +* :ghpull:`21965`: Switch transOffset to offset_transform. +* :ghpull:`22145`: Make Tk windows use the same icon as other backends +* :ghpull:`22107`: Expire mathttext-related deprecations +* :ghpull:`22139`: FIX: width/height were reversed in macosx rectangle creation +* :ghpull:`22123`: Deprecate accepting arbitrary parameters in some get_window_extent() methods +* :ghpull:`22122`: Hint at draw_without_rendering() in Text.get_window_extent +* :ghpull:`22120`: Drop dependency on scipy in the docs. +* :ghpull:`22063`: FIX: Autoposition title when yaxis has offset +* :ghpull:`22119`: Micro-optimize skew(). +* :ghpull:`22109`: Remove unnecessary null checks in macosx.m, and some more maintenance +* :ghpull:`21977`: Add corner coordinate helper methods to Ellipse/Rectangle +* :ghpull:`21830`: Add option of bounding box for PolygonSelector +* :ghpull:`22115`: Turn _localaxes into a plain list. +* :ghpull:`22108`: Micro-optimize rotation transform. +* :ghpull:`22043`: Cleanup differential equations examples. +* :ghpull:`22080`: Simple style(ish) fixes. +* :ghpull:`22110`: Right-aligned status text in backends +* :ghpull:`21873`: DOC: Update and consolidate Custom Tick Formatter for Time Series example +* :ghpull:`22112`: Fix a small typo +* :ghpull:`20117`: Very soft-deprecate AxesDivider.new_{horizontal,vertical}. +* :ghpull:`22034`: Update lines_with_ticks_demo.py +* :ghpull:`22102`: DOC: rename usage tutorial to quick_start +* :ghpull:`19228`: Validate text rotation in setter +* :ghpull:`22081`: Expire colorbar-related deprecations. +* :ghpull:`22008`: Added color keyword argument to math_to_image +* :ghpull:`22058`: Remove exprired mplot3d deprecations for 3.6 +* :ghpull:`22073`: DOC: Add new tutorial to external resources. +* :ghpull:`22054`: MNT: Set CapStyle member names automatically +* :ghpull:`22061`: De-duplicate mplot3D API docs +* :ghpull:`22075`: Remove unnecessary ``.figure`` qualifier in docs. +* :ghpull:`22051`: Make required_interactive_framework required on FigureCanvas. +* :ghpull:`22050`: Deprecate the noop, unused FigureCanvasBase.resize. +* :ghpull:`22030`: Add explanatory comments to "broken" horizontal bar plot example +* :ghpull:`22001`: Fix: [Bug]: triplot with 'ls' argument yields TypeError #21995 +* :ghpull:`22045`: Fill in missing Axes3D box_aspect argument docstring +* :ghpull:`22042`: Keep FontEntry helpers private. +* :ghpull:`21042`: Make rcParams.copy() return a new RcParams instance. +* :ghpull:`22032`: flipy only affects the drawing of texts, not of images. +* :ghpull:`21993`: Added docstring to rrulewrapper class +* :ghpull:`21935`: Significantly improve tight layout performance for cartopy axes +* :ghpull:`22000`: Some gtk cleanups. +* :ghpull:`21983`: Simplify canvas class control in FigureFrameWx. +* :ghpull:`21985`: Slightly tighten the _get_layout_cache_key API. +* :ghpull:`22020`: Simplify wx _print_image. +* :ghpull:`22010`: Fix syntax highlighting in contrib guide. +* :ghpull:`22003`: Initialize RendererCairo.{width,height} in constructor. +* :ghpull:`21992`: Use _make_classic_style_pseudo_toolbar more. +* :ghpull:`21916`: Fix picklability of make_norm_from_scale norms. +* :ghpull:`21981`: FigureCanvasCairo can init RendererCairo; kill RendererCairo subclasses. +* :ghpull:`21986`: InvLogTransform should only return masked arrays for masked inputs. +* :ghpull:`21991`: PEP8ify wx callback names. +* :ghpull:`21975`: DOC: remove experimental tag from CL +* :ghpull:`21989`: Autoinfer norm bounds. +* :ghpull:`21980`: Removed loaded modules logging +* :ghpull:`21982`: Deprecate duplicated FigureManagerGTK{3,4}Agg classes. +* :ghpull:`21963`: Clarify current behavior of draw_path_collection. +* :ghpull:`21974`: Reword inset axes example. +* :ghpull:`21835`: Small improvements to interactive examples +* :ghpull:`21050`: Store dash_pattern as single attribute, not two. +* :ghpull:`21557`: Fix transparency when exporting to png via pgf backend. +* :ghpull:`21904`: Added _repr_html_ for fonts +* :ghpull:`21696`: Use cycling iterators in RendererBase. +* :ghpull:`21955`: Refactor common parts of ImageMagick{,File}Writer. +* :ghpull:`21952`: Clarify coordinates for RectangleSelector properties +* :ghpull:`21964`: Fix some more missing references. +* :ghpull:`21516`: Make _request_autoscale_view more generalizable to 3D. +* :ghpull:`21947`: Slightly cleanup RendererBase docs. +* :ghpull:`21961`: Privatize various internal APIs of backend_pgf. +* :ghpull:`21956`: Remove tests for avconv animation writers. +* :ghpull:`21954`: DOC: Move Animation and MovieWriter inheritance diagrams ... +* :ghpull:`21780`: Add a click_and_move widget test helper +* :ghpull:`21941`: Merge branch v3.5.x into main +* :ghpull:`21936`: Small ``__getstate__`` cleanups. +* :ghpull:`21939`: Update comment re: register_at_fork. +* :ghpull:`21910`: Fold _rgbacache into _imcache. +* :ghpull:`21921`: Clean up RectangleSelector move code +* :ghpull:`21925`: Drop labelling from PR welcome action +* :ghpull:`14930`: Set Dock icon on the macosx backend +* :ghpull:`21920`: Improve square state calculation in RectangleSelector +* :ghpull:`21919`: Fix use_data_coordinates docstring +* :ghpull:`21881`: Add a PolygonSelector.verts setter +* :ghpull:`20839`: Fix centre and square state and add rotation for rectangle selector +* :ghpull:`21874`: DOC: Add Date Tick Locators and Formatters example +* :ghpull:`21799`: Added get_font_names() to fontManager +* :ghpull:`21871`: DOC: Code from markevery_prop_cycle moved to test. +* :ghpull:`21395`: Expire _check_savefig_extra_args-related deprecations. +* :ghpull:`21867`: Remove unused bbox arg to _convert_agg_to_wx_bitmap. +* :ghpull:`21868`: Use partialmethod for better signatures in backend_ps. +* :ghpull:`21520`: Shorten some inset_locator docstrings. +* :ghpull:`21737`: Update the "Rotating a 3D plot" gallery example to show all 3 rotation axes +* :ghpull:`21851`: Re-order a widget test function +* :ghpull:`10762`: Normalization of elevation and azimuth angles for surface plots +* :ghpull:`21426`: Add ability to roll the camera in 3D plots +* :ghpull:`21822`: Replace NSDictionary by switch-case. +* :ghpull:`21512`: MNT: Add modifier key press handling to macosx backend +* :ghpull:`21784`: Set macOS icon when using Qt backend +* :ghpull:`21748`: Shorten PyObjectType defs in macosx.m. +* :ghpull:`21809`: MNT: Turn all macosx warnings into errors while building +* :ghpull:`21792`: Fix missing return value in closeButtonPressed. +* :ghpull:`21767`: Inherit many macos backend docstrings. +* :ghpull:`21766`: Don't hide build log on GHA. +* :ghpull:`21728`: Factor out some macosx gil handling for py-method calls from callbacks. +* :ghpull:`21754`: Update gitattributes so that objc diffs are correctly contextualized. +* :ghpull:`21752`: Add a helper for directly output pdf streams. +* :ghpull:`21750`: Don't sort pdf dicts. +* :ghpull:`21745`: DOC: Clarify Coords Report Example +* :ghpull:`21746`: Fix/add docstring signatures to many C++ methods. +* :ghpull:`21631`: DOC: change gridspec tutorial to arranging_axes tutorial +* :ghpull:`21318`: FIX: better error message for shared axes and axis('equal') +* :ghpull:`21519`: mark_inset should manually unstale axes limits before drawing itself. +* :ghpull:`21724`: Fix copyright date with SOURCE_DATE_EPOCH set +* :ghpull:`21398`: FIX: logic of title repositioning +* :ghpull:`21717`: Simplify macosx toolbar init. +* :ghpull:`21690`: Whitespace/braces/#defines cleanup to macosx. +* :ghpull:`21695`: Use _api.check_shape more. +* :ghpull:`21698`: Small code cleanups and style fixes. +* :ghpull:`21529`: Delay-load keymaps in toolmanager. +* :ghpull:`21525`: Fix support for clim in scatter. +* :ghpull:`21697`: Drop non-significant zeros from ps output. +* :ghpull:`21692`: CI: Remove CI test runs from forks of matplotlib +* :ghpull:`21591`: Make ToolFullScreen a Tool, not a ToolToggle. +* :ghpull:`21677`: Simplify test for negative xerr/yerr. +* :ghpull:`21657`: Replace some image_comparisons by return-value-tests/check_figures_e… +* :ghpull:`21664`: Merge 3.5.x into main +* :ghpull:`21490`: Make Line2D copy its inputs +* :ghpull:`21639`: Skip some uses of packaging's PEP440 version for non-Python versions. +* :ghpull:`21604`: Fix centre square rectangle selector part 1 +* :ghpull:`21593`: Check for images added-and-modified in a same PR +* :ghpull:`20750`: Shorten issue templates +* :ghpull:`21590`: Make gtk3 full_screen_toggle more robust against external changes. +* :ghpull:`21582`: Organize checklist in PR template +* :ghpull:`21580`: Rename/remove _lastCursor, as needed. +* :ghpull:`21567`: Removed the range parameter from the validate_whiskers function's err… +* :ghpull:`21565`: Further remove remnants of offset_position. +* :ghpull:`21542`: [ENH]: Use new style format strings for colorbar ticks +* :ghpull:`21564`: Skip invisible artists when doing 3d projection. +* :ghpull:`21558`: Various small fixes for streamplot(). +* :ghpull:`21544`: Return minorticks as array, not as list. +* :ghpull:`21546`: Added links to the mosaic docs in figure and pyplot module docstrings +* :ghpull:`21545`: Turn mouseover into a mpl-style getset_property. +* :ghpull:`21537`: Remove unnecessary False arg when constructing wx.App. +* :ghpull:`21536`: Reword margins docstrings, and fix bounds on zmargin values. +* :ghpull:`21535`: typo-correction-on-line-185 +* :ghpull:`21534`: Do not use space in directive calling. +* :ghpull:`21494`: Adding tutorial links for blitting in widgets.py +* :ghpull:`21407`: Stash exceptions when FT2Font closes the underlying stream. +* :ghpull:`21431`: set_ticks([single_tick]) should also expand view limits. +* :ghpull:`21444`: Make pipong example self-contained. +* :ghpull:`21392`: Add label about workflow to new contributor PRs +* :ghpull:`21440`: Install sphinx-panels along with development setup +* :ghpull:`21434`: Remove coords_flat variable +* :ghpull:`21415`: Move gui_support.macosx option to packages section. +* :ghpull:`21412`: Privatize some SVG internal APIs. +* :ghpull:`21401`: Uncamelcase some internal variables in axis.py; rename _get_tick_bboxes. +* :ghpull:`21417`: Use Bbox.unit() more. +* :ghpull:`20253`: Simplify parameter handling in FloatingAxesBase. +* :ghpull:`21379`: Simplify filename tracking in FT2Font. +* :ghpull:`21278`: Clear findfont cache when calling addfont(). +* :ghpull:`21400`: Use bbox.{size,bounds,width,height,p0,...} where appropriate. +* :ghpull:`21408`: Reword annotations tutorial section titles. +* :ghpull:`21371`: Rename default branch +* :ghpull:`21389`: Log pixel coordinates in event_handling coords_demo example on terminal/console +* :ghpull:`21376`: Factor common parts of saving to different formats using pillow. +* :ghpull:`21377`: Enable tests for text path based markers +* :ghpull:`21283`: Demonstrate inset_axes in scatter_hist example. +* :ghpull:`21356`: Raise an exception when find_tex_file fails to find a file. +* :ghpull:`21362`: Simplify wording of allowed errorbar() error values +* :ghpull:`21274`: ENH: Add support to save images in WebP format +* :ghpull:`21289`: Simplify _init_legend_box. +* :ghpull:`21256`: Make image_comparison work even without the autoclose fixture. +* :ghpull:`21343`: Fix type1font docstring markup/punctuation. +* :ghpull:`21341`: Fix trivial docstring typo. +* :ghpull:`21301`: Simplify ``Colormap.__call__`` a bit. +* :ghpull:`21280`: Make ``Path.__deepcopy__`` interact better with subclasses, e.g. TextPath. +* :ghpull:`21266`: Fix #21101 Add validator to errorbar method +* :ghpull:`20921`: Fix problem with (deep)copy of TextPath +* :ghpull:`20914`: 19195 rotated markers +* :ghpull:`21276`: Add language about not assigning issues +* :ghpull:`20715`: Improve Type-1 font parsing +* :ghpull:`21218`: Parametrize/simplify test_missing_psfont. +* :ghpull:`21213`: Compress comments in make_image. +* :ghpull:`21187`: Deprecate error_msg_foo helpers. +* :ghpull:`21190`: Deprecate mlab.stride_windows. +* :ghpull:`21152`: Rename ``**kw`` to ``**kwargs``. +* :ghpull:`21087`: Move colormap examples from userdemo to images_contours_and_fields. +* :ghpull:`21074`: Deprecate MarkerStyle(None). +* :ghpull:`20990`: Explicit registration of canvas-specific tool subclasses. +* :ghpull:`21049`: Simplify setting Legend attributes +* :ghpull:`21056`: Deprecate support for no-args MarkerStyle(). +* :ghpull:`21059`: Remove dummy test command from setup.py +* :ghpull:`21015`: Prepare for rcParams.copy() returning a new RcParams instance in the future +* :ghpull:`21021`: Factor out for_layout_only backcompat support in get_tightlayout. +* :ghpull:`21023`: Inline ToolManager._trigger_tool to its sole call site. +* :ghpull:`21005`: Test the rcParams deprecation machinery. +* :ghpull:`21010`: Avoid TransformedBbox where unneeded. +* :ghpull:`21019`: Reword custom_ticker1 example. +* :ghpull:`20995`: Deprecate some backend_gtk3 helper globals. +* :ghpull:`21004`: Remove now-unused rcParams _deprecated entries. +* :ghpull:`20986`: Make HandlerLine2D{,Compound} inherit constructors from HandlerNpoints. +* :ghpull:`20974`: Rename symbol_name to glyph_name where appropriate. +* :ghpull:`20961`: Small cleanups to math_to_image. +* :ghpull:`20957`: legend_handler_map cleanups. +* :ghpull:`20955`: Remove unused HostAxes._get_legend_handles. +* :ghpull:`20851`: Try to install the Noto Sans CJK font + +Issues (202): + +* :ghissue:`23827`: backend_gtk3agg.py calls set_device_scale +* :ghissue:`23560`: [Doc]: mpl_toolkits.axes_grid still mentioned as maintained +* :ghissue:`23794`: [Doc]: Version switcher broken in devdocs +* :ghissue:`23806`: [Bug]: possible regression in axis ticks handling in matplotlib 3.6.0rc2 +* :ghissue:`22965`: [Bug]: triplot duplicates label legend +* :ghissue:`23807`: streamplot raises ValueError when the input is zeros +* :ghissue:`23761`: [Bug]: False positive legend handler warnings in 3.6.0.rc1 +* :ghissue:`23398`: [Bug]: Newer versions of matplotlib ignore xlabel on colorbar axis +* :ghissue:`23699`: [Bug]: Bug with toolbar instantiation in notebook +* :ghissue:`23745`: [Doc]: Minor rcParams/matplotlibrc doc issues +* :ghissue:`23717`: [Bug]: AxesSubplot.get_yticks not returning the actual printed ticks +* :ghissue:`21508`: [Doc]: Create diagram to show rotation directions for 3D plots +* :ghissue:`23709`: [Bug]: colorbar with unattached mappables can't steal space +* :ghissue:`23701`: [Bug]: plt.figure(), plt.close() leaks memory +* :ghissue:`22409`: [Bug]: AttributeError: 'QResizeEvent' object has no attribute 'pos' +* :ghissue:`19609`: DeprecationWarning when changing color maps +* :ghissue:`23716`: MatplotlibDeprecationWarning removal hard-breaks seaborn in 3.6rc1 +* :ghissue:`23719`: [Bug]: register_cmap deprecation message seems wrong +* :ghissue:`23707`: test_Normalize fails on aarch64/ppc64le/s390x +* :ghissue:`21107`: [MNT]: Should plt.xticks() get a minor keyword argument +* :ghissue:`23679`: [Doc]: Deprecated modules not in docs +* :ghissue:`19550`: Arc and pathpatch_2d_to_3d plots full ellipse +* :ghissue:`23329`: [Bug]: ``plt.autoscale()`` fails for partial ``Arc`` +* :ghissue:`11266`: Arc patch ignoring theta1/theta2 when added to Axes via PatchCollection +* :ghissue:`4067`: 'Poly3DCollection' object has no attribute '_facecolors2d' +* :ghissue:`23622`: [MNT]: make.bat not parsing sphinxopt +* :ghissue:`23459`: [Bug]: 'Line3D' object has no attribute '_verts3d' +* :ghissue:`23653`: [Bug]: macosx subplot tool causes segfault when window closed +* :ghissue:`23660`: [Bug]: Test test_figure.py::test_subfigure_ss[png] FAILED on ppc64le +* :ghissue:`23645`: [MNT]: Python 3.11 manylinux wheels +* :ghissue:`23650`: TTF fonts loaded from file are not embedded/displayed properly when saved to pdf +* :ghissue:`23583`: [Doc]: Document the position parameter in apply_aspect() +* :ghissue:`23386`: setuptools_scm-git-archive is obsolete +* :ghissue:`23220`: [Doc]: Clarify ``offset`` parameter in linestyle +* :ghissue:`22746`: [Doc]: Document that rcParams['font.family'] can be a list +* :ghissue:`8187`: Axes doesn't have ````legends```` attribute? +* :ghissue:`23580`: [Bug]: TypeError when plotting against list of datetime.date where 0th element of list is None +* :ghissue:`15514`: Relevant methods are only documented in base classes and thus not easily discoverable +* :ghissue:`21611`: DOC: Add conda environment instructions to developers guide +* :ghissue:`23487`: [Bug]: scatter plot color settings discarded unless c given +* :ghissue:`22977`: [Bug]: offset dash linestyle has no effect in patch objects +* :ghissue:`18883`: Matplotlib would not try to apply all the font in font list to draw all characters in the given string. +* :ghissue:`22570`: [ENH]: Provide ``axis('equal')`` for ``Axes3D``. +* :ghissue:`23433`: [Bug]: array-like linewidth raises an error for scatter3D +* :ghissue:`12388`: Legend Title Left Alignment +* :ghissue:`23375`: [Bug]: markerfacecoloralt not supported when drawing errorbars +* :ghissue:`17973`: DOC: matplotlib.__doc__ not included in online docs ? +* :ghissue:`23474`: [Bug]: ``\,`` and ``\mathrm{\,}`` are not identical in Mathtext when using CM and STIX +* :ghissue:`8715`: event handlers have different signatures across backends +* :ghissue:`18271`: PGF uses the minimal document class +* :ghissue:`23324`: [Bug]: Exception not handled in widgetlock() +* :ghissue:`15710`: doc for type of tz parameter is inconsistent throughout dates.py +* :ghissue:`21165`: Hexbin marginals need a test for linear scaling +* :ghissue:`23105`: [MNT]: Deprecate per-backend customization of draw_if_interactive +* :ghissue:`23147`: [Bug]: with setuptools>=60, cannot find msbuild +* :ghissue:`23379`: [Bug]: Offset notation on y-axis can overlap with a long title +* :ghissue:`22819`: [Doc]: Make rect argument consistent in the docstrings +* :ghissue:`23172`: [Bug]: Calling matplotlib.pyplot.show() outside of matplotlib.pyplot.rc_context no longer works +* :ghissue:`23019`: [Bug]: ``UnicodeDecodeError`` when using some special and accented characters in TeX +* :ghissue:`23334`: [Doc]: Tk embedding example crashes Spyder +* :ghissue:`23298`: [Bug]: get_backend() clears figures from Gcf.figs if they were created under rc_context +* :ghissue:`21942`: [ENH]: add width/height_ratios to subplots and friends +* :ghissue:`23028`: [ENH]: contour kwarg for negative_linestyle +* :ghissue:`19223`: Certain non-hashable parameters to text() give cryptic error messages +* :ghissue:`18351`: Add the ability to plot striped lines +* :ghissue:`23205`: [Bug]: URL-area not rotated in PDFs +* :ghissue:`23268`: [Bug]: hyphen renders different length depending on presence of MathText +* :ghissue:`23308`: [Bug]: set_visible() not working for 3d projection +* :ghissue:`23296`: Set_color method for line2d object in latest document not work +* :ghissue:`22992`: [Bug]: test_image_comparison_expect_rms nondeterministic failure +* :ghissue:`23008`: [ENH]: Use ``\genfrac`` in display style? +* :ghissue:`23214`: [MNT]: Rename examples with "test" in the name +* :ghissue:`17852`: Thin space missing after mathtext operators +* :ghissue:`12078`: Inconsistency in keyword-arguments ncol/ncols, nrow/nrows +* :ghissue:`23239`: [Doc]: steps is not implemented in line styles. +* :ghissue:`23151`: [MNT]: default date limits... +* :ghissue:`9462`: Misaligned bottoms of subplots for png output with bbox_inches='tight' +* :ghissue:`21369`: [Bug]: ax.invert_xaxis() and ax.invert_yaxis() both flip the X axis +* :ghissue:`20797`: ``macosx`` cursors break with images +* :ghissue:`23084`: [TST] Upcoming dependency test failures +* :ghissue:`22910`: [Bug]: bar_label fails with nan errorbar values +* :ghissue:`23074`: [Bug]: matplotlib crashes if ``_tkinter`` doesn't have ``__file__`` +* :ghissue:`23083`: [Bug]: Confusing error messages +* :ghissue:`22391`: [Doc]: Remove "keywords" line at the bottom of all examples +* :ghissue:`20202`: Daylocator causes frozen computer when used with FuncAnimation +* :ghissue:`22529`: Replace C++ quad contouring code with use of ContourPy +* :ghissue:`21710`: [ENH]: macosx backend does not respect rcParams["savefig.directory"] +* :ghissue:`21880`: [Doc]: rrulewrapper not included in API docs +* :ghissue:`22622`: [Bug]: Gaps and overlapping areas between bins when using float16 +* :ghissue:`23043`: [TST] Upcoming dependency test failures +* :ghissue:`17960`: Line2D object markers are lost when retrieved from legend.get_lines() when linestyle='None' +* :ghissue:`23026`: [MNT]: Require that matplotlibrc/style files use utf-8 (or have an encoding cookie) +* :ghissue:`22947`: [Bug]: Can't use ``plt.sca()`` on axes created using subfigures +* :ghissue:`22623`: [ENH]: support rect with constrained_layout ("layout only to part of the figure") +* :ghissue:`22917`: "ab;cd" missing in subplot_mosaic tutorial +* :ghissue:`22686`: [Bug]: can not give init value for RangeSlider widget +* :ghissue:`22740`: [MNT]: Add codespell to pre-commit hooks +* :ghissue:`22893`: rainbow text example is broken +* :ghissue:`21571`: [Doc]: Clarify text positioning +* :ghissue:`22092`: [Bug]: Configure subplots dialog freezes for TkAgg with toolmanager +* :ghissue:`22760`: [Bug]: Macosx legend picker doesn't work anymore +* :ghissue:`16369`: Call to input blocks slider input on osx with the default agg 'MacOSX'. It works fine on when TkAgg is used. +* :ghissue:`22915`: [Bug]: figure.raise_window rcParam does not work on MacOSX backend +* :ghissue:`22930`: [Bug]: Regression in dashes due to #22569 +* :ghissue:`22859`: [Bug]: findSystemFonts should not look in subdirectories of C:\Windows\Fonts\ +* :ghissue:`22882`: Missing ``f`` prefix on f-strings +* :ghissue:`22738`: [MNT]: make Axes.cla an alias for Axes.clear in all cases +* :ghissue:`22708`: [TST] Upcoming dependency test failures +* :ghissue:`8388`: Proposed ENH: Allow user to turn off breaking of streamlines in streamplot +* :ghissue:`20755`: [Bug]: make_norm_from_scale should create picklable classes even when used in-line. +* :ghissue:`18249`: Expand the explanation of the Object-Oriented interface +* :ghissue:`22792`: [Bug]: .eps greyscale hatching of patches when lw=0 +* :ghissue:`22630`: [ENH]: enable passing of projection keyword to Axes.inset_axes +* :ghissue:`22414`: [Bug]: bar_label overlaps bars when y-axis is inverted +* :ghissue:`22726`: [Bug]: tripcolor ignores clim +* :ghissue:`21635`: [ENH]: Add a nightly wheel build +* :ghissue:`9994`: document where nightly wheels are published +* :ghissue:`22350`: [Bug]: text.usetex Vs. DateFormatter +* :ghissue:`4976`: missing imshow() subplots when using tight_layout() +* :ghissue:`22150`: [ENH]: Tool icons are hardly visible in Tk when using a dark theme +* :ghissue:`22662`: Leave color parameter empty should be fine[ENH]: +* :ghissue:`22671`: [Doc]: plot_format adaption invalidates sphinx cache +* :ghissue:`22582`: [Bug]: FontManager.addfont doesn't accept pathlib.Path of TTF font +* :ghissue:`22657`: [ENH]: vector map +* :ghissue:`16181`: The great API cleanup +* :ghissue:`22636`: [Bug]: Infinite loop when there is single double quote in matplotlibrc +* :ghissue:`22266`: [Doc]: Improve examples in documentation +* :ghissue:`11861`: Figure does not close until script finishes execution +* :ghissue:`19288`: Escape # character in matplotlibrc +* :ghissue:`22579`: [Bug]: Replacement for epoch2num behaves differently (does not accept arrays) +* :ghissue:`22605`: [Bug]: Tool contrast low with dark theme on macosx backend +* :ghissue:`17642`: bring osx backend flush_events to feature parity with other backend +* :ghissue:`19268`: Drawing the canvas does not populate ticklabels on MacOSX backend +* :ghissue:`17445`: MacOSX does not render frames in which new artists are added when blitting +* :ghissue:`10980`: Current versions cannot reproduce rotate_axes_3d_demo.py +* :ghissue:`18451`: MacOSX backend fails with animation in certain scripts +* :ghissue:`22603`: [MNT]: Replace str(n)cpy etc with safe versions (C++) +* :ghissue:`19121`: Handle and label not created for Text with label +* :ghissue:`22563`: [Doc]: annotation_clip=None not correctly documented +* :ghissue:`12528`: Empty axes on draw after blitted animation finishes +* :ghissue:`20991`: [Bug]: Error when using path effect with a PolyCollection +* :ghissue:`19563`: path_effects kwarg triggers exception on 3D scatterplot +* :ghissue:`8650`: System Error in backend_agg. (with a fix!) +* :ghissue:`20294`: ``AxesImage.__str__`` is wrong if the image does not span the full Axes. +* :ghissue:`18066`: Document minimum supported OSX version for macos backend +* :ghissue:`17018`: Add documentation about transparency of frame +* :ghissue:`22403`: [MNT]: Confusing prompt in docs issue template +* :ghissue:`8839`: mpl_connect silently does nothing when passed an invalid event type string +* :ghissue:`22343`: [MNT]: Delay (or make pending) the deprecation of set_constrained_layout/set_tight_layout +* :ghissue:`21554`: [Bug]: ``ValueError`` upon deepcopy of a ``Figure`` object +* :ghissue:`22369`: [Doc]: Incorrect comment in example code for creating adjacent subplots +* :ghissue:`19174`: connectionstyle arc3 with high rad value pushes up data interval of x-axis and y-axis. +* :ghissue:`8351`: seaborn styles make "+", "x" markers invisible; proposed workaround for shipped styles +* :ghissue:`22278`: Deprecate/remove maxdict +* :ghissue:`19276`: imshow with very large arrays not working as expected +* :ghissue:`22035`: [ENH]: Specify a custom focal length / FOV for the 3d camera +* :ghissue:`22264`: [Bug]: new constrained_layout causes axes to go invisible(?) +* :ghissue:`21774`: [MNT]: Improvements to widget tests +* :ghissue:`18722`: Consider removing AFM+mathtext support +* :ghissue:`21540`: [Bug]: cm fontset in log scale does not use Unicode minus +* :ghissue:`22062`: [Bug]: Autopositioned title overlaps with offset text +* :ghissue:`22093`: [Bug]: AttributeError: 'AxesSubplot' object has no attribute 'add_text' +* :ghissue:`22012`: [Bug]: Mouseover coordinate/value text should be right aligned +* :ghissue:`21995`: [Bug]: triplot with 'ls' argument yields TypeError +* :ghissue:`20249`: MatplotlibDeprecationWarning when updating rcparams +* :ghissue:`15781`: MatplotlibDeprecationWarning examples.directory is deprecated +* :ghissue:`13118`: No MatplotlibDeprecationWarning for default rcParams +* :ghissue:`21978`: Remove logging debug of loaded modules +* :ghissue:`11738`: pgf backend doesn't make background transparent +* :ghissue:`18039`: Add ``_repr_html_`` for fonts +* :ghissue:`21970`: [Bug]: tight layout breaks with toolbar.push_current() +* :ghissue:`14850`: No icon showing up with macosx backend +* :ghissue:`17283`: Create Date Formatter/Locator Reference +* :ghissue:`21761`: [Doc]: add how to know available fonts... +* :ghissue:`21863`: [Doc]: Remove example "prop_cycle property markevery in rcParams" +* :ghissue:`10241`: Axes3D.view_init elevation issue between 270 and 360 degrees +* :ghissue:`14453`: add third angle to view_init() +* :ghissue:`20486`: Modifier key press events not recognized on MacOSX backend +* :ghissue:`9837`: MacOS: Key modifiers deprecated +* :ghissue:`11416`: RuntimeError: adjustable='datalim' is not allowed when both axes are shared. +* :ghissue:`17711`: inset_locator.mark_inset() misplaces box connectors +* :ghissue:`20854`: [Doc]: Incorrect copyright start year at the bottom of devdocs page +* :ghissue:`21394`: [Bug]: Subplot title does not obey padding +* :ghissue:`20998`: [Bug]: ToolManager does not respect rcParams["keymap."] set after import time +* :ghissue:`7075`: Superscripts in axis label cut when saving .eps with bbox_inches="tight" +* :ghissue:`21514`: [Doc]: Error message of validate_whiskers is not updated +* :ghissue:`21532`: [Doc]: subplot_mosaic docstring should link to the tutorial +* :ghissue:`16550`: Docs: performance discussion of tight_layout +* :ghissue:`21378`: [ENH]: use new style format strings for colorbar ticks +* :ghissue:`19323`: Streamplot color mapping fails on (near-)empty array. +* :ghissue:`19559`: Axes.get_xticks() returns a numpy array but Axes.get_xticks(minor=True) returns a plain list +* :ghissue:`21526`: [Doc]: Little Typo on Introductory Tutorial +* :ghissue:`19195`: Rotate Markers in functions like plot, scatter, etcetera +* :ghissue:`21364`: [Bug]: double free when FT2Font constructor is interrupted by KeyboardInterrupt +* :ghissue:`16581`: Can't not refresh new font in running interpreter +* :ghissue:`21162`: [ENH]: saving images in webp format +* :ghissue:`18168`: The example of the testing decorator does not work. +* :ghissue:`20943`: [Bug]: Deepcopy of TextPath fails +* :ghissue:`21101`: [Bug]: Errorbars separated from markers with negative errors +* :ghissue:`17986`: MEP22 per-backend tool registration +* :ghissue:`4938`: Feature request: add option to disable mathtext parsing +* :ghissue:`11435`: plt.subplot eats my subplots From b92cccc19122a84c7fa340751ae5cd8003be4c1d Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 8 Oct 2022 03:41:02 -0400 Subject: [PATCH 044/194] Update release notes for 3.6.1 --- doc/_static/switcher.json | 2 +- .../next_api_changes/deprecations/24088-JMK.rst | 9 --------- doc/api/prev_api_changes/api_changes_3.6.1.rst | 15 +++++++++++++++ doc/users/release_notes.rst | 2 ++ 4 files changed, 18 insertions(+), 10 deletions(-) delete mode 100644 doc/api/next_api_changes/deprecations/24088-JMK.rst create mode 100644 doc/api/prev_api_changes/api_changes_3.6.1.rst diff --git a/doc/_static/switcher.json b/doc/_static/switcher.json index c72cbac2b27a..00dd1ffa6c68 100644 --- a/doc/_static/switcher.json +++ b/doc/_static/switcher.json @@ -1,6 +1,6 @@ [ { - "name": "3.6 (stable)", + "name": "3.6.1 (stable)", "version": "stable", "url": "https://matplotlib.org/stable/" }, diff --git a/doc/api/next_api_changes/deprecations/24088-JMK.rst b/doc/api/next_api_changes/deprecations/24088-JMK.rst deleted file mode 100644 index caa7e93a05b4..000000000000 --- a/doc/api/next_api_changes/deprecations/24088-JMK.rst +++ /dev/null @@ -1,9 +0,0 @@ -Colorbars for orphaned mappables are deprecated, but no longer raise -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Before 3.6.0, Colorbars for mappables that do not have a parent axes would -steal space from the current Axes. 3.6.0 raised an error on this, but without -a deprecation cycle. For 3.6.1 this is reverted, the current axes is used, -but a deprecation warning is shown instead. In this undetermined case users -and libraries should explicitly specify what axes they want space to be stolen -from: ``fig.colorbar(mappable, ax=plt.gca())``. diff --git a/doc/api/prev_api_changes/api_changes_3.6.1.rst b/doc/api/prev_api_changes/api_changes_3.6.1.rst new file mode 100644 index 000000000000..ad929d426885 --- /dev/null +++ b/doc/api/prev_api_changes/api_changes_3.6.1.rst @@ -0,0 +1,15 @@ +API Changes for 3.6.1 +===================== + +Deprecations +------------ + +Colorbars for orphaned mappables are deprecated, but no longer raise +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Before 3.6.0, Colorbars for mappables that do not have a parent Axes would +steal space from the current Axes. 3.6.0 raised an error on this, but without a +deprecation cycle. For 3.6.1 this is reverted; the current Axes is used, but a +deprecation warning is shown instead. In this undetermined case, users and +libraries should explicitly specify what Axes they want space to be stolen +from: ``fig.colorbar(mappable, ax=plt.gca())``. diff --git a/doc/users/release_notes.rst b/doc/users/release_notes.rst index 40c286e06a84..5ec5d471142f 100644 --- a/doc/users/release_notes.rst +++ b/doc/users/release_notes.rst @@ -15,8 +15,10 @@ Version 3.6 :maxdepth: 1 prev_whats_new/whats_new_3.6.0.rst + ../api/prev_api_changes/api_changes_3.6.1.rst ../api/prev_api_changes/api_changes_3.6.0.rst github_stats.rst + prev_whats_new/github_stats_3.6.0.rst Version 3.5 =========== From 318b2348f7127efc3e28aadebf762aae32b6343c Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 8 Oct 2022 03:41:19 -0400 Subject: [PATCH 045/194] REL: v3.6.1 This is the first bugfix release of the 3.6.x series. This release contains several bug-fixes and adjustments: * A warning is no longer raised when constrained layout explicitly disabled and tight layout is applied * Add missing `get_cmap` method to `ColormapRegistry` * Adding a colorbar on a `ScalarMappable` that is not attached to an `Axes` is now deprecated instead of raising a hard error * Fix `barplot` being empty when first element is NaN * Fix `FigureManager.resize` on GTK4 * Fix `fill_between` compatibility with NumPy 1.24 development version * Fix `hexbin` with empty arrays and log scaling * Fix `resize_event` deprecation warnings when creating figure on macOS * Fix build in mingw * Fix compatibility with PyCharm's interagg backend * Fix crash on empty `Text` in PostScript backend * Fix generic font families in SVG exports * Fix horizontal colorbars with hatches * Fix misplaced mathtext using `eqnarray` * `stackplot` no longer changes the Axes cycler From f4ecfa82d131f3da7818e3bc41e03651b594f0e9 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 8 Oct 2022 04:02:24 -0400 Subject: [PATCH 046/194] BLD: bump branch away from tag So the tarballs from GitHub are stable. From 5a2f8bab8346585e3f2349d04c16f35d1bc9e74c Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 8 Oct 2022 05:52:09 -0400 Subject: [PATCH 047/194] DOC: Add Zenodo DOI for 3.6.1 --- doc/_static/zenodo_cache/7162185.svg | 35 ++++++++++++++++++++++++++++ doc/users/project/citing.rst | 3 +++ tools/cache_zenodo_svg.py | 1 + 3 files changed, 39 insertions(+) create mode 100644 doc/_static/zenodo_cache/7162185.svg diff --git a/doc/_static/zenodo_cache/7162185.svg b/doc/_static/zenodo_cache/7162185.svg new file mode 100644 index 000000000000..ea0966377194 --- /dev/null +++ b/doc/_static/zenodo_cache/7162185.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + DOI + + + DOI + + + 10.5281/zenodo.7162185 + + + 10.5281/zenodo.7162185 + + + \ No newline at end of file diff --git a/doc/users/project/citing.rst b/doc/users/project/citing.rst index 53c2591ebfbd..5dd7488e50b6 100644 --- a/doc/users/project/citing.rst +++ b/doc/users/project/citing.rst @@ -29,6 +29,9 @@ By version .. START OF AUTOGENERATED +v3.6.1 + .. image:: ../../_static/zenodo_cache/7162185.svg + :target: https://doi.org/10.5281/zenodo.7162185 v3.6.0 .. image:: ../../_static/zenodo_cache/7084615.svg :target: https://doi.org/10.5281/zenodo.7084615 diff --git a/tools/cache_zenodo_svg.py b/tools/cache_zenodo_svg.py index 1a3d0493ed6d..f70c14e06c95 100644 --- a/tools/cache_zenodo_svg.py +++ b/tools/cache_zenodo_svg.py @@ -63,6 +63,7 @@ def _get_xdg_cache_dir(): if __name__ == "__main__": data = { + "v3.6.1": "7162185", "v3.6.0": "7084615", "v3.5.3": "6982547", "v3.5.2": "6513224", From a6bcc0a555570bfebbe29934caaef32795f1d881 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sun, 9 Oct 2022 18:42:20 +0200 Subject: [PATCH 048/194] Backport PR #24130: DOC: align contour parameter doc with implementation --- lib/matplotlib/contour.py | 2 +- lib/matplotlib/tri/tricontour.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index 6aab5222b783..2f8c934e70b9 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -1600,7 +1600,7 @@ def _initialize_x_y(self, z): If an int *n*, use `~matplotlib.ticker.MaxNLocator`, which tries to automatically choose no more than *n+1* "nice" contour levels - between *vmin* and *vmax*. + between minimum and maximum numeric values of *Z*. If array-like, draw contour lines at the specified levels. The values must be in increasing order. diff --git a/lib/matplotlib/tri/tricontour.py b/lib/matplotlib/tri/tricontour.py index df3b44d941ef..ee9d85030c21 100644 --- a/lib/matplotlib/tri/tricontour.py +++ b/lib/matplotlib/tri/tricontour.py @@ -114,7 +114,7 @@ def _contour_args(self, args, kwargs): If an int *n*, use `~matplotlib.ticker.MaxNLocator`, which tries to automatically choose no more than *n+1* "nice" contour levels between - *vmin* and *vmax*. + between minimum and maximum numeric values of *Z*. If array-like, draw contour lines at the specified levels. The values must be in increasing order. From 3d2bbe3d677420f305fb5389703a0a29afad2030 Mon Sep 17 00:00:00 2001 From: MeeseeksMachine <39504233+meeseeksmachine@users.noreply.github.com> Date: Wed, 12 Oct 2022 19:47:38 +0200 Subject: [PATCH 049/194] Backport PR #24137: Add note about blitting and zorder in animations (#24146) Co-authored-by: Oscar Gustafsson --- doc/api/animation_api.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/api/animation_api.rst b/doc/api/animation_api.rst index 5a3d53442fde..132590456763 100644 --- a/doc/api/animation_api.rst +++ b/doc/api/animation_api.rst @@ -97,6 +97,11 @@ this hopefully minimalist example gives a sense of how ``init_func`` and ``func`` are used inside of `FuncAnimation` and the theory of how 'blitting' works. +.. note:: + + The zorder of artists is not taken into account when 'blitting' + because the 'blitted' artists are always drawn on top. + The expected signature on ``func`` and ``init_func`` is very simple to keep `FuncAnimation` out of your book keeping and plotting logic, but this means that the callable objects you pass in must know what From e6dd37b15d7c19a5c18dbc0678d4e79486a24966 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Thu, 13 Oct 2022 12:40:51 +0200 Subject: [PATCH 050/194] Backport PR #24149: FIX: handle input to ax.bar that is all nan --- lib/matplotlib/axes/_axes.py | 8 ++++++++ lib/matplotlib/tests/test_axes.py | 13 +++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index e5e34c91257d..d8ac2bb829f3 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2182,11 +2182,19 @@ def _convert_dx(dx, x0, xconv, convert): x0 = cbook._safe_first_finite(x0) except (TypeError, IndexError, KeyError): pass + except StopIteration: + # this means we found no finite element, fall back to first + # element unconditionally + x0 = cbook.safe_first_element(x0) try: x = cbook._safe_first_finite(xconv) except (TypeError, IndexError, KeyError): x = xconv + except StopIteration: + # this means we found no finite element, fall back to first + # element unconditionally + x = cbook.safe_first_element(xconv) delist = False if not np.iterable(dx): diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index d6d44bcdb283..c238009b0be1 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -8144,3 +8144,16 @@ def test_bar_leading_nan(): for b in rest: assert np.isfinite(b.xy).all() assert np.isfinite(b.get_width()) + + +@check_figures_equal(extensions=["png"]) +def test_bar_all_nan(fig_test, fig_ref): + mpl.style.use("mpl20") + ax_test = fig_test.subplots() + ax_ref = fig_ref.subplots() + + ax_test.bar([np.nan], [np.nan]) + ax_test.bar([1], [1]) + + ax_ref.bar([1], [1]).remove() + ax_ref.bar([1], [1]) From 2a1958b9fa71437de308a63f2badd05d2f7f7f44 Mon Sep 17 00:00:00 2001 From: hannah Date: Fri, 14 Oct 2022 09:48:16 -0400 Subject: [PATCH 051/194] Backport PR #24164: Fix argument order in hist() docstring. --- lib/matplotlib/axes/_axes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index d8ac2bb829f3..a3acc5175b30 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -6432,7 +6432,7 @@ def hist(self, x, bins=None, range=None, density=False, weights=None, `~.stairs` to plot the distribution:: counts, bins = np.histogram(x) - plt.stairs(bins, counts) + plt.stairs(counts, bins) Alternatively, plot pre-computed bins and counts using ``hist()`` by treating each bin as a single point with a weight equal to its count:: From 4bac9112ad18cf74728fcbe6c8a42386e2b9364e Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 15 Oct 2022 02:31:22 -0400 Subject: [PATCH 052/194] Backport PR #24158: Fix Qt with PySide6 6.4.0 --- .github/workflows/tests.yml | 9 ++++++--- lib/matplotlib/backends/qt_compat.py | 18 +++++++++++++----- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0c5b7a08ced5..08766f006f5b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -37,6 +37,9 @@ jobs: python-version: 3.8 extra-requirements: '-c requirements/testing/minver.txt' pyqt5-ver: '==5.11.2 sip==5.0.0' # oldest versions with a Py3.8 wheel. + pyqt6-ver: '==6.1.0 PyQt6-Qt6==6.1.0' + pyside2-ver: '==5.14.0' # oldest version with working Py3.8 wheel. + pyside6-ver: '==6.0.0' delete-font-cache: true - os: ubuntu-20.04 python-version: 3.8 @@ -189,17 +192,17 @@ jobs: echo 'PyQt5 is available' || echo 'PyQt5 is not available' if [[ "${{ runner.os }}" != 'macOS' ]]; then - python -mpip install --upgrade pyside2 && + python -mpip install --upgrade pyside2${{ matrix.pyside2-ver }} && python -c 'import PySide2.QtCore' && echo 'PySide2 is available' || echo 'PySide2 is not available' fi if [[ "${{ matrix.os }}" = ubuntu-20.04 ]]; then - python -mpip install --upgrade pyqt6 && + python -mpip install --upgrade pyqt6${{ matrix.pyqt6-ver }} && python -c 'import PyQt6.QtCore' && echo 'PyQt6 is available' || echo 'PyQt6 is not available' - python -mpip install --upgrade pyside6 && + python -mpip install --upgrade pyside6${{ matrix.pyside6-ver }} && python -c 'import PySide6.QtCore' && echo 'PySide6 is available' || echo 'PySide6 is not available' diff --git a/lib/matplotlib/backends/qt_compat.py b/lib/matplotlib/backends/qt_compat.py index 6d1fc2f9ad2c..06db924feea3 100644 --- a/lib/matplotlib/backends/qt_compat.py +++ b/lib/matplotlib/backends/qt_compat.py @@ -69,7 +69,8 @@ def _setup_pyqt5plus(): - global QtCore, QtGui, QtWidgets, __version__, _isdeleted, _getSaveFileName + global QtCore, QtGui, QtWidgets, __version__ + global _getSaveFileName, _isdeleted, _to_int if QT_API == QT_API_PYQT6: from PyQt6 import QtCore, QtGui, QtWidgets, sip @@ -78,10 +79,15 @@ def _setup_pyqt5plus(): QtCore.Slot = QtCore.pyqtSlot QtCore.Property = QtCore.pyqtProperty _isdeleted = sip.isdeleted + _to_int = operator.attrgetter('value') elif QT_API == QT_API_PYSIDE6: from PySide6 import QtCore, QtGui, QtWidgets, __version__ import shiboken6 def _isdeleted(obj): return not shiboken6.isValid(obj) + if parse_version(__version__) >= parse_version('6.4'): + _to_int = operator.attrgetter('value') + else: + _to_int = int elif QT_API == QT_API_PYQT5: from PyQt5 import QtCore, QtGui, QtWidgets import sip @@ -90,11 +96,16 @@ def _isdeleted(obj): return not shiboken6.isValid(obj) QtCore.Slot = QtCore.pyqtSlot QtCore.Property = QtCore.pyqtProperty _isdeleted = sip.isdeleted + _to_int = int elif QT_API == QT_API_PYSIDE2: from PySide2 import QtCore, QtGui, QtWidgets, __version__ - import shiboken2 + try: + from PySide2 import shiboken2 + except ImportError: + import shiboken2 def _isdeleted(obj): return not shiboken2.isValid(obj) + _to_int = int else: raise AssertionError(f"Unexpected QT_API: {QT_API}") _getSaveFileName = QtWidgets.QFileDialog.getSaveFileName @@ -141,9 +152,6 @@ def _isdeleted(obj): # PyQt6 enum compat helpers. -_to_int = operator.attrgetter("value") if QT_API == "PyQt6" else int - - @functools.lru_cache(None) def _enum(name): # foo.bar.Enum.Entry (PyQt6) <=> foo.bar.Entry (non-PyQt6). From 90ce3ab8a63e251ca611cca12a02f4e3efe05600 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Sat, 15 Oct 2022 11:19:48 +0200 Subject: [PATCH 053/194] Backport PR #24171: Fix example where wrong variable was used --- examples/subplots_axes_and_figures/subplots_demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/subplots_axes_and_figures/subplots_demo.py b/examples/subplots_axes_and_figures/subplots_demo.py index bbc8afa469fa..41b14dadd620 100644 --- a/examples/subplots_axes_and_figures/subplots_demo.py +++ b/examples/subplots_axes_and_figures/subplots_demo.py @@ -176,7 +176,7 @@ ax3.plot(x + 1, -y, 'tab:green') ax4.plot(x + 2, -y**2, 'tab:red') -for ax in axs.flat: +for ax in fig.get_axes(): ax.label_outer() ############################################################################### From cb372288fe2e4060cf1d1a0080039915bb149d80 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Sat, 15 Oct 2022 11:52:17 +0200 Subject: [PATCH 054/194] Backport PR #24167: FIX: turn off layout engine tightbbox --- lib/matplotlib/backend_bases.py | 2 +- .../test_bbox_tight/bbox_inches_fixed_aspect.png | Bin 0 -> 5293 bytes lib/matplotlib/tests/test_bbox_tight.py | 10 ++++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_bbox_tight/bbox_inches_fixed_aspect.png diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index bb17950b03f7..6e603cafbef0 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -2330,7 +2330,7 @@ def print_figure( _bbox_inches_restore = None # we have already done layout above, so turn it off: - stack.enter_context(self.figure._cm_set(layout_engine=None)) + stack.enter_context(self.figure._cm_set(layout_engine='none')) try: # _get_renderer may change the figure dpi (as vector formats # force the figure dpi to 72), so we need to set it again here. diff --git a/lib/matplotlib/tests/baseline_images/test_bbox_tight/bbox_inches_fixed_aspect.png b/lib/matplotlib/tests/baseline_images/test_bbox_tight/bbox_inches_fixed_aspect.png new file mode 100644 index 0000000000000000000000000000000000000000..0fd7a35e3303ba3de632aec6a5a6bb65ca9d86bb GIT binary patch literal 5293 zcma)=c~lc;_s1vEC}~6q;7D-`Yfv0OMcg$;Rz;;&DJJh*aRePTDk@cL!A6|YKvdA8 zB5sLwK`BbwakQ@SZCvU)wl$_jEn-y^_k98VeJAnvp5LE8&*6AJ^W1yC_ul8ZPm(E0 z8=d6+QQ$`eL3pPm$B!ilsb2i^YK14iAOBmSjn?0*{RNttWsI2Vyy<_`EPL0dz8J9h&cc1J@QCYoWdiClV(=)b*ipkB* znKvLhdggz4fn71oYm>1 z(|EC}>j?jz7o}z0!#V`nZQm{7eq&C5&I8!zv<@#M+e zi>2I+`uhJ2@v~jXyBFJa;QiX!NAta_-#16submkD?%lxf=0m63{Uaepzq-HA^#0w; z8BFu-p-(rpM=?n~~IQs4fFmt zcG6Cv*awa;%i4GxN8Rx}P=2C@ExNMT&Gx$Kh3PE1*D8IW`*}=dA8n)-oou0t^gJl< zGu-oF!Uqcz^})i`-EC2NWsR5=VRZ0q-D07av`m7DB2?CNkL9nNzfMUjh~%vvRgEv@ zQT1i|xI+j(uknabu7`F;Ags=YbKBu$2X+CbhI6+>4AnLcLRW-eYI7Cfbp!bD*;a0s$kGkKiwD5 z3n&+MA(Gv~ItL(9n`EXs37E+`4~Q7gREw)B))^~&0OsaJ+koi)72uW(lTNC zQkT@ovgre16dJ<)70eSVrS+1Sd5Twc9CVU3%-)f3z0IcA!YDVD*^9uM9c+465tEtc z!+}%T^ob(IGtWgGHJiR!L=E#?^u58R{|$^yWuA+^-?Qm$kwsuA_XI@?0oK)KWKrl< zohKS;nVYy7ED~*GG_vUEr~4UMxJrf7Vm*nhGXO>g4YM4w_S3901NcKSvs^5G1nVpp z5vz@_H=MbA`SKk6duZ5KdwkZu$N~ODRxtO5|NG(OqksQB@ZiCN>zkT>`sI2~zc22* zcoDaI_wM>zx5A^Mqi>Iq6H9${{m)Gc*`t(Le60x>J7ag2e2+~@D;MgMko`x#x~5bV z6Qnht!~jKTn8*IeS0SfXDD^~*QK%Pjs;@3Jh$rgWXw5s3+1XI8T+AEzGcYxj>-Q}} z%USX^Lgy3+v>Z-JUep@kqn6eLIh48taS_;l`xurCLn~e_5w^s_>b;Nd4;8kHC7(mT zP|a1Q7$h;V)`Xd~!Z=AzIk6b9N}ws=buY?^rUn!Xw0qTy;>A_yMPl_COX{JwHJo!* zxTGq|nxH^(-Q<)GsV65f7kzCqO?R!?37y}3bR2H)(gI=2c(^`*Q8-UDR0vzX0M3$A zix9YBm9V9QxavhM!ij1q7Pj;iSAoc)0luFBZ^0P8415;=r^u;ZI1aHX%*tsqwZ8H1!ELnywFVrx@`orlfAo6&X$PD`uX!6meVK%UsKr1qHw2Hgf zrxt#?G(-w06AHdCQAUZJ$|wOY0~S%nC077Yh7CdikH9PB6obGGkR1Y_ zwsNWgXSV^eM}RB5s0L)w0NEihZVQAj1K%USLKwrBfo~^dv6LnMd7O9tW@BUHe*9a2 z&q#V-ZTrq2WoBs=fBpFX8BkoPiZ?MkmLE!N$v|@hqP9R(^e!%(Q}wmUYJ#k?*N|TB zMFrrJa~Xw#ImmOhoC-ikGgb-(k441lcfciBh4E>YTsF!e85hbCHd$JcAjRjeroC42 z3bjO}GLoTai%d?{O{EnUAFFIoqCw)X;*2{G=^K{JS%yd&Mj~QwIhFa5O_tNjDoaID zQ+##yPS`@=SztJ@zk{^5)GGQRbiZMYWF(wIShA+fC0$q`NJn54N_=#hZnUCKtyM%| zwwn-o8lho$jZ%*B}HI+oUj(8A`o92N(`a0Ae); zC<8)IuheT6X%((jF6mf5o!#jmOVv7~_1w}x=WH6}{c-YVlz=QOC|5GKR5 z+E=f638P*%S?(yHpI);M*a8UI!#;Y=0-zrdvWKD57l`T2h3{ebJ_X{tU@UwO!}lka zEM4M~R)liK9u89IWR+zF^TzF7l&T|)hBK0niztg+t2i~nAX$%Ur_c&lnIQcU^-N*O z7^zKW&@z(mee`yWb`0*SA4ULC{B$5bF@F$OA^U|^5wOlB-G$yaILNf+f)tsCX%%&m zHkrSgBaR@KPk=*!Aso>KE=u4WT9JXRAB1yZ_M(h89Ar+MRhEOB@_aByY=;i+fy@Cm z*;(K%AkJ_mVx$7khw#SlSknF)PDnWeeH`PfBhD02bx^XjvB?IhIN~&%1_OK8WO)!i zjXdI^q;rs1#5d%aepXr9T35jmIc0p~Alsn4ABG!_84-99FcCP?a7+UfS5d72s|0Yq zgA7Gsd>F6lX_eIsw#iZuBF;o5Co>XmxM5f?s8Y1TSE(cJEA^$UAZ5OD6|`hY&B09< ze$K;J=MEh@ygWbu;J@$9Ke%PM-pjXNOC*TsSFSj2-n`k=ZAo{?$KB#qUN#BctTLgsP1YHOH~Z*?kAWS4&}>%f1za|Q8t4P` z)e9(9!1Q|i0sZs>Zp+f8u7Xz39poTmQR+Xzyd_AhP<6G*mcyri5ycn<=_xee1k#>G zE8;M`PyF;XN~0NY)w5 z2dn^&qRm#gIbIg! zX1Oca8>(gp*$u9`Fuq|EjIwF-Zs_RLd;?@Ht!Z-8CEdc{UOfXRuIQpmJ4Hx~P7e||?z^9k5J{EUI>1r1}52>DY zkn53ZmYR1hLp?2N^C%c42JsmifuXc{JOU?%@EI8G%y^)<8pcTNV-=74WK$~ZasOC*xP}*yvK=^&!3d3uOvh|6(o{GP{um7>FwzhWvfdj?s*RS7y=+K6t zVdrqfYOZXEdlEQDg@l}HzEu!MWOk%y5I{bJUxo8jL)liBBm4VB)mxDXH_Q-*p|W(Q zBQdLKWaV>=QgtqJwpt9B8X4No@Mr+XC#Oi!l#R?sq_q)h+%wp zR2vg#8^2PJ5{`6y7!W2Oy?AcwCel@6+nbUN?NPgNb5XSx@gD`)#^bsnHU;w}dT#GY z&yc`sLok0{wCd(?ehjOa)vgMB5)$)F)oxtts=$Ry-1gD?iJ|{RH@1XRk05>pDzJ~G z8}aEzL<}t+Uush*nkljv&q z!tYWTEu){iF*$v?8>j4bqbc39x@(cU+N|;J5Z_mkVhGDv@u6`~@kvqq)o#X(Z;Rcv zFT{H(arGqS&h!zNAm&7@7&wq;)8D^%+w2TUEA_lXx>J50wXR;;E-&;FQ;Fp(f@waxaVm7)q@Mps9O-p|1`gS`S`{C z+V2;HA9voqu=&O>-?n>v_fplu$Mp#|iG*16?B Date: Sat, 15 Oct 2022 13:59:54 +0200 Subject: [PATCH 055/194] Backport PR #24173: TST: convert nose-style tests --- lib/matplotlib/tests/test_cbook.py | 4 ++-- lib/matplotlib/tests/test_mlab.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/tests/test_cbook.py b/lib/matplotlib/tests/test_cbook.py index 26748d1a5798..b18f4fdf113a 100644 --- a/lib/matplotlib/tests/test_cbook.py +++ b/lib/matplotlib/tests/test_cbook.py @@ -51,7 +51,7 @@ def test_rgba(self): class Test_boxplot_stats: - def setup(self): + def setup_method(self): np.random.seed(937) self.nrows = 37 self.ncols = 4 @@ -177,7 +177,7 @@ def test_boxplot_stats_autorange_false(self): class Test_callback_registry: - def setup(self): + def setup_method(self): self.signal = 'test' self.callbacks = cbook.CallbackRegistry() diff --git a/lib/matplotlib/tests/test_mlab.py b/lib/matplotlib/tests/test_mlab.py index 75ca0648a4e1..86beb5c8c803 100644 --- a/lib/matplotlib/tests/test_mlab.py +++ b/lib/matplotlib/tests/test_mlab.py @@ -97,7 +97,7 @@ def test_window(): class TestDetrend: - def setup(self): + def setup_method(self): np.random.seed(0) n = 1000 x = np.linspace(0., 100, n) From 9696aebb9da65ca5a3c23407bbab0b91c6753935 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Sat, 15 Oct 2022 15:17:30 +0200 Subject: [PATCH 056/194] Backport PR #24177: Don't simplify paths used for autoscaling --- lib/matplotlib/axes/_base.py | 2 +- lib/matplotlib/tests/test_axes.py | 52 +++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 4f805e017741..056ff7ea2ced 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -2434,7 +2434,7 @@ def _update_patch_limits(self, patch): # Get all vertices on the path # Loop through each segment to get extrema for Bezier curve sections vertices = [] - for curve, code in p.iter_bezier(): + for curve, code in p.iter_bezier(simplify=False): # Get distance along the curve of any extrema _, dzeros = curve.axis_aligned_extrema() # Calculate vertices of start, end and any extrema in between diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index c238009b0be1..573ea9863b58 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -8114,6 +8114,58 @@ def test_bezier_autoscale(): assert ax.get_ylim()[0] == -0.5 +def test_small_autoscale(): + # Check that paths with small values autoscale correctly #24097. + verts = np.array([ + [-5.45, 0.00], [-5.45, 0.00], [-5.29, 0.00], [-5.29, 0.00], + [-5.13, 0.00], [-5.13, 0.00], [-4.97, 0.00], [-4.97, 0.00], + [-4.81, 0.00], [-4.81, 0.00], [-4.65, 0.00], [-4.65, 0.00], + [-4.49, 0.00], [-4.49, 0.00], [-4.33, 0.00], [-4.33, 0.00], + [-4.17, 0.00], [-4.17, 0.00], [-4.01, 0.00], [-4.01, 0.00], + [-3.85, 0.00], [-3.85, 0.00], [-3.69, 0.00], [-3.69, 0.00], + [-3.53, 0.00], [-3.53, 0.00], [-3.37, 0.00], [-3.37, 0.00], + [-3.21, 0.00], [-3.21, 0.01], [-3.05, 0.01], [-3.05, 0.01], + [-2.89, 0.01], [-2.89, 0.01], [-2.73, 0.01], [-2.73, 0.02], + [-2.57, 0.02], [-2.57, 0.04], [-2.41, 0.04], [-2.41, 0.04], + [-2.25, 0.04], [-2.25, 0.06], [-2.09, 0.06], [-2.09, 0.08], + [-1.93, 0.08], [-1.93, 0.10], [-1.77, 0.10], [-1.77, 0.12], + [-1.61, 0.12], [-1.61, 0.14], [-1.45, 0.14], [-1.45, 0.17], + [-1.30, 0.17], [-1.30, 0.19], [-1.14, 0.19], [-1.14, 0.22], + [-0.98, 0.22], [-0.98, 0.25], [-0.82, 0.25], [-0.82, 0.27], + [-0.66, 0.27], [-0.66, 0.29], [-0.50, 0.29], [-0.50, 0.30], + [-0.34, 0.30], [-0.34, 0.32], [-0.18, 0.32], [-0.18, 0.33], + [-0.02, 0.33], [-0.02, 0.32], [0.13, 0.32], [0.13, 0.33], [0.29, 0.33], + [0.29, 0.31], [0.45, 0.31], [0.45, 0.30], [0.61, 0.30], [0.61, 0.28], + [0.77, 0.28], [0.77, 0.25], [0.93, 0.25], [0.93, 0.22], [1.09, 0.22], + [1.09, 0.19], [1.25, 0.19], [1.25, 0.17], [1.41, 0.17], [1.41, 0.15], + [1.57, 0.15], [1.57, 0.12], [1.73, 0.12], [1.73, 0.10], [1.89, 0.10], + [1.89, 0.08], [2.05, 0.08], [2.05, 0.07], [2.21, 0.07], [2.21, 0.05], + [2.37, 0.05], [2.37, 0.04], [2.53, 0.04], [2.53, 0.02], [2.69, 0.02], + [2.69, 0.02], [2.85, 0.02], [2.85, 0.01], [3.01, 0.01], [3.01, 0.01], + [3.17, 0.01], [3.17, 0.00], [3.33, 0.00], [3.33, 0.00], [3.49, 0.00], + [3.49, 0.00], [3.65, 0.00], [3.65, 0.00], [3.81, 0.00], [3.81, 0.00], + [3.97, 0.00], [3.97, 0.00], [4.13, 0.00], [4.13, 0.00], [4.29, 0.00], + [4.29, 0.00], [4.45, 0.00], [4.45, 0.00], [4.61, 0.00], [4.61, 0.00], + [4.77, 0.00], [4.77, 0.00], [4.93, 0.00], [4.93, 0.00], + ]) + + minx = np.min(verts[:, 0]) + miny = np.min(verts[:, 1]) + maxx = np.max(verts[:, 0]) + maxy = np.max(verts[:, 1]) + + p = mpath.Path(verts) + + fig, ax = plt.subplots() + ax.add_patch(mpatches.PathPatch(p)) + ax.autoscale() + + assert ax.get_xlim()[0] <= minx + assert ax.get_xlim()[1] >= maxx + assert ax.get_ylim()[0] <= miny + assert ax.get_ylim()[1] >= maxy + + def test_get_xticklabel(): fig, ax = plt.subplots() ax.plot(np.arange(10)) From 7ac315eac1f23cd991f13e3a4173c6f467e1b041 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Sat, 15 Oct 2022 16:35:24 +0200 Subject: [PATCH 057/194] Backport PR #24178: Fall back to Python-level Thread for GUI warning --- lib/matplotlib/pyplot.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index e5ae9a0cc11c..6f757ae031ef 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -332,11 +332,21 @@ def draw_if_interactive(): def _warn_if_gui_out_of_main_thread(): - # This compares native thread ids because even if python-level Thread - # objects match, the underlying OS thread (which is what really matters) - # may be different on Python implementations with green threads. - if (_get_required_interactive_framework(_get_backend_mod()) and - threading.get_native_id() != threading.main_thread().native_id): + warn = False + if _get_required_interactive_framework(_get_backend_mod()): + if hasattr(threading, 'get_native_id'): + # This compares native thread ids because even if Python-level + # Thread objects match, the underlying OS thread (which is what + # really matters) may be different on Python implementations with + # green threads. + if threading.get_native_id() != threading.main_thread().native_id: + warn = True + else: + # Fall back to Python-level Thread if native IDs are unavailable, + # mainly for PyPy. + if threading.current_thread() is not threading.main_thread(): + warn = True + if warn: _api.warn_external( "Starting a Matplotlib GUI outside of the main thread will likely " "fail.") From 8a8bde3f5411a69f3aab425bee973ef95315b583 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sun, 16 Oct 2022 13:44:14 +0200 Subject: [PATCH 058/194] Backport PR #24157: test only PR milestoning guidance --- doc/devel/coding_guide.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index cddb13539444..b30e1dd95bab 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -136,11 +136,11 @@ Milestones * *New features and API changes* are milestoned for the next minor release ``v3.N.0``. - * *Bugfixes and docstring changes* are milestoned for the next patch - release ``v3.N.M`` + * *Bugfixes, tests for released code, and docstring changes* are milestoned + for the next patch release ``v3.N.M``. * *Documentation changes* (all .rst files and examples) are milestoned - ``v3.N-doc`` + ``v3.N-doc``. If multiple rules apply, choose the first matching from the above list. From eaec5f5e5a1ffc7c6ed33f14368e19847fb1240a Mon Sep 17 00:00:00 2001 From: hannah Date: Sun, 16 Oct 2022 15:00:44 -0400 Subject: [PATCH 059/194] Update coding_guide.rst fix doc build --- doc/devel/coding_guide.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index b30e1dd95bab..33062aa445f5 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -137,7 +137,7 @@ Milestones ``v3.N.0``. * *Bugfixes, tests for released code, and docstring changes* are milestoned - for the next patch release ``v3.N.M``. + for the next patch release ``v3.N.M``. * *Documentation changes* (all .rst files and examples) are milestoned ``v3.N-doc``. From 8ec9e27288aabd61d6ab1333621add658cbdfc2a Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sun, 16 Oct 2022 22:36:46 +0200 Subject: [PATCH 060/194] Backport PR #24187: DOC: Fix toc structure in explain/interactive --- doc/users/explain/interactive.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/doc/users/explain/interactive.rst b/doc/users/explain/interactive.rst index 0fb0a0cdac51..3488580a75a6 100644 --- a/doc/users/explain/interactive.rst +++ b/doc/users/explain/interactive.rst @@ -8,9 +8,6 @@ Interactive figures =================== -.. toctree:: - - When working with data, interactivity can be invaluable. The pan/zoom and mouse-location tools built into the Matplotlib GUI windows are often sufficient, but you can also use the event system to build customized data exploration tools. From 5aed3769ba0a54630f131cb3ad4aa702b19985f4 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Mon, 17 Oct 2022 17:00:11 +0200 Subject: [PATCH 061/194] Backport PR #24193: DOC: Explain gridsize in hexbin() --- lib/matplotlib/axes/_axes.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index a3acc5175b30..dad927831790 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -4681,7 +4681,31 @@ def hexbin(self, x, y, C=None, gridsize=100, bins=None, the hexagons are approximately regular. Alternatively, if a tuple (*nx*, *ny*), the number of hexagons - in the *x*-direction and the *y*-direction. + in the *x*-direction and the *y*-direction. In the + *y*-direction, counting is done along vertically aligned + hexagons, not along the zig-zag chains of hexagons; see the + following illustration. + + .. plot:: + + import numpy + import matplotlib.pyplot as plt + + np.random.seed(19680801) + n= 300 + x = np.random.standard_normal(n) + y = np.random.standard_normal(n) + + fig, ax = plt.subplots(figsize=(4, 4)) + h = ax.hexbin(x, y, gridsize=(5, 3)) + hx, hy = h.get_offsets().T + ax.plot(hx[24::3], hy[24::3], 'ro-') + ax.plot(hx[-3:], hy[-3:], 'ro-') + ax.set_title('gridsize=(5, 3)') + ax.axis('off') + + To get approximately regular hexagons, choose + :math:`n_x = \\sqrt{3}\\,n_y`. bins : 'log' or int or sequence, default: None Discretization of the hexagon values. From 5c09db2c8507ffd9df9f3590b62865082eb03bfa Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Mon, 17 Oct 2022 17:09:23 +0200 Subject: [PATCH 062/194] Backport PR #24194: DOC: Improve plot_directive documentation --- lib/matplotlib/sphinxext/plot_directive.py | 38 ++++++++++++---------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/lib/matplotlib/sphinxext/plot_directive.py b/lib/matplotlib/sphinxext/plot_directive.py index c646f7a63e99..9973e37ef28f 100644 --- a/lib/matplotlib/sphinxext/plot_directive.py +++ b/lib/matplotlib/sphinxext/plot_directive.py @@ -2,10 +2,13 @@ A directive for including a Matplotlib plot in a Sphinx document ================================================================ -By default, in HTML output, `plot` will include a .png file with a link to a -high-res .png and .pdf. In LaTeX output, it will include a .pdf. +This is a Sphinx extension providing a reStructuredText directive +``.. plot::`` for including a plot in a Sphinx document. -The source code for the plot may be included in one of three ways: +In HTML output, ``.. plot::`` will include a .png file with a link +to a high-res .png and .pdf. In LaTeX output, it will include a .pdf. + +The plot content may be defined in one of three ways: 1. **A path to a source file** as the argument to the directive:: @@ -28,10 +31,8 @@ .. plot:: import matplotlib.pyplot as plt - import matplotlib.image as mpimg - import numpy as np - img = mpimg.imread('_static/stinkbug.png') - imgplot = plt.imshow(img) + plt.plot([1, 2, 3], [4, 5, 6]) + plt.title("A plotting exammple") 3. Using **doctest** syntax:: @@ -44,22 +45,22 @@ Options ------- -The ``plot`` directive supports the following options: +The ``.. plot::`` directive supports the following options: - format : {'python', 'doctest'} + ``:format:`` : {'python', 'doctest'} The format of the input. If unset, the format is auto-detected. - include-source : bool + ``:include-source:`` : bool Whether to display the source code. The default can be changed using - the `plot_include_source` variable in :file:`conf.py` (which itself + the ``plot_include_source`` variable in :file:`conf.py` (which itself defaults to False). - encoding : str + ``:encoding:`` : str If this source file is in a non-UTF8 or non-ASCII encoding, the encoding must be specified using the ``:encoding:`` option. The encoding will not be inferred using the ``-*- coding -*-`` metacomment. - context : bool or str + ``:context:`` : bool or str If provided, the code will be run in the context of all previous plot directives for which the ``:context:`` option was specified. This only applies to inline code plot directives, not those run from files. If @@ -68,18 +69,19 @@ running the code. ``:context: close-figs`` keeps the context but closes previous figures before running the code. - nofigs : bool + ``:nofigs:`` : bool If specified, the code block will be run, but no figures will be inserted. This is usually useful with the ``:context:`` option. - caption : str + ``:caption:`` : str If specified, the option's argument will be used as a caption for the figure. This overwrites the caption given in the content, when the plot is generated from a file. -Additionally, this directive supports all of the options of the `image` -directive, except for *target* (since plot will add its own target). These -include *alt*, *height*, *width*, *scale*, *align* and *class*. +Additionally, this directive supports all the options of the `image directive +`_, +except for ``:target:`` (since plot will add its own target). These include +``:alt:``, ``:height:``, ``:width:``, ``:scale:``, ``:align:`` and ``:class:``. Configuration options --------------------- From de5022d829dc5f80fef1f4e0ce80272ba36fbc39 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 4 Oct 2022 02:15:59 -0400 Subject: [PATCH 063/194] Backport PR #24081: TST: force test with shared test image to run in serial --- lib/matplotlib/tests/test_axes.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index c238009b0be1..4e7d5103e6ad 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -896,18 +896,14 @@ def test_hexbin_extent(): ax.hexbin("x", "y", extent=[.1, .3, .6, .7], data=data) -@image_comparison(['hexbin_empty.png'], remove_text=True) +@image_comparison(['hexbin_empty.png', 'hexbin_empty.png'], remove_text=True) def test_hexbin_empty(): # From #3886: creating hexbin from empty dataset raises ValueError - ax = plt.gca() + fig, ax = plt.subplots() ax.hexbin([], []) - - -@image_comparison(['hexbin_empty.png'], remove_text=True) -def test_hexbin_log_empty(): + fig, ax = plt.subplots() # From #23922: creating hexbin with log scaling from empty # dataset raises ValueError - ax = plt.gca() ax.hexbin([], [], bins='log') From a4dd6fd4fcb7a4c53812ce8252c06a6d2da8d2ff Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Tue, 18 Oct 2022 14:53:29 +0200 Subject: [PATCH 064/194] Backport PR #24202: Bump pypa/cibuildwheel from 2.10.2 to 2.11.1 --- .github/workflows/cibuildwheel.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/cibuildwheel.yml b/.github/workflows/cibuildwheel.yml index 32d3e10fdd3b..503984768512 100644 --- a/.github/workflows/cibuildwheel.yml +++ b/.github/workflows/cibuildwheel.yml @@ -53,7 +53,7 @@ jobs: fetch-depth: 0 - name: Build wheels for CPython 3.11 - uses: pypa/cibuildwheel@v2.10.2 + uses: pypa/cibuildwheel@v2.11.1 env: CIBW_BUILD: "cp311-*" CIBW_SKIP: "*-musllinux*" @@ -66,7 +66,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.10 - uses: pypa/cibuildwheel@v2.10.2 + uses: pypa/cibuildwheel@v2.11.1 env: CIBW_BUILD: "cp310-*" CIBW_SKIP: "*-musllinux*" @@ -79,7 +79,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.9 - uses: pypa/cibuildwheel@v2.10.2 + uses: pypa/cibuildwheel@v2.11.1 env: CIBW_BUILD: "cp39-*" CIBW_SKIP: "*-musllinux*" @@ -92,7 +92,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.8 - uses: pypa/cibuildwheel@v2.10.2 + uses: pypa/cibuildwheel@v2.11.1 env: CIBW_BUILD: "cp38-*" CIBW_SKIP: "*-musllinux*" @@ -105,7 +105,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for PyPy - uses: pypa/cibuildwheel@v2.10.2 + uses: pypa/cibuildwheel@v2.11.1 env: CIBW_BUILD: "pp38-* pp39-*" CIBW_SKIP: "*-musllinux*" From 907ba56048b495c053cd450c00f1bb281621b09f Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Tue, 18 Oct 2022 16:03:06 +0200 Subject: [PATCH 065/194] Backport PR #24169: [DOC]: added parent link for `FuncAnimation` and `ArtistAnimation` --- lib/matplotlib/animation.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/animation.py b/lib/matplotlib/animation.py index b2eca10aae6f..428e00904277 100644 --- a/lib/matplotlib/animation.py +++ b/lib/matplotlib/animation.py @@ -1426,7 +1426,8 @@ def _step(self, *args): class ArtistAnimation(TimedAnimation): """ - Animation using a fixed set of `.Artist` objects. + `TimedAnimation` subclass that creates an animation by using a fixed + set of `.Artist` objects. Before creating an instance, all plotting should have taken place and the relevant artists saved. @@ -1502,7 +1503,8 @@ def _draw_frame(self, artists): class FuncAnimation(TimedAnimation): """ - Makes an animation by repeatedly calling a function *func*. + `TimedAnimation` subclass that makes an animation by repeatedly calling + a function *func*. .. note:: From dd6309a2d79ad9ceef09ae163d57d34736b491ac Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Wed, 19 Oct 2022 10:16:22 +0200 Subject: [PATCH 066/194] Backport PR #23995: DOC: Lowercase some parameter names --- lib/matplotlib/tests/test_triangulation.py | 18 +++++----- lib/matplotlib/tri/tricontour.py | 24 ++++++------- lib/matplotlib/tri/tripcolor.py | 42 +++++++++++----------- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/lib/matplotlib/tests/test_triangulation.py b/lib/matplotlib/tests/test_triangulation.py index 75b2a51dfaf9..4738b53c5358 100644 --- a/lib/matplotlib/tests/test_triangulation.py +++ b/lib/matplotlib/tests/test_triangulation.py @@ -243,7 +243,7 @@ def test_tripcolor_color(): fig, ax = plt.subplots() with pytest.raises(TypeError, match=r"tripcolor\(\) missing 1 required "): ax.tripcolor(x, y) - with pytest.raises(ValueError, match="The length of C must match either"): + with pytest.raises(ValueError, match="The length of c must match either"): ax.tripcolor(x, y, [1, 2, 3]) with pytest.raises(ValueError, match="length of facecolors must match .* triangles"): @@ -255,7 +255,7 @@ def test_tripcolor_color(): match="'gouraud' .* at the points.* not at the faces"): ax.tripcolor(x, y, [1, 2], shading='gouraud') # faces with pytest.raises(TypeError, - match="positional.*'C'.*keyword-only.*'facecolors'"): + match="positional.*'c'.*keyword-only.*'facecolors'"): ax.tripcolor(x, y, C=[1, 2, 3, 4]) # smoke test for valid color specifications (via C or facecolors) @@ -278,16 +278,16 @@ def test_tripcolor_clim(): def test_tripcolor_warnings(): x = [-1, 0, 1, 0] y = [0, -1, 0, 1] - C = [0.4, 0.5] + c = [0.4, 0.5] fig, ax = plt.subplots() # additional parameters with pytest.warns(DeprecationWarning, match="Additional positional param"): - ax.tripcolor(x, y, C, 'unused_positional') - # facecolors takes precedence over C - with pytest.warns(UserWarning, match="Positional parameter C .*no effect"): - ax.tripcolor(x, y, C, facecolors=C) - with pytest.warns(UserWarning, match="Positional parameter C .*no effect"): - ax.tripcolor(x, y, 'interpreted as C', facecolors=C) + ax.tripcolor(x, y, c, 'unused_positional') + # facecolors takes precedence over c + with pytest.warns(UserWarning, match="Positional parameter c .*no effect"): + ax.tripcolor(x, y, c, facecolors=c) + with pytest.warns(UserWarning, match="Positional parameter c .*no effect"): + ax.tripcolor(x, y, 'interpreted as c', facecolors=c) def test_no_modify(): diff --git a/lib/matplotlib/tri/tricontour.py b/lib/matplotlib/tri/tricontour.py index ee9d85030c21..666626157517 100644 --- a/lib/matplotlib/tri/tricontour.py +++ b/lib/matplotlib/tri/tricontour.py @@ -83,8 +83,8 @@ def _contour_args(self, args, kwargs): Call signatures:: - %%(func)s(triangulation, Z, [levels], ...) - %%(func)s(x, y, Z, [levels], *, [triangles=triangles], [mask=mask], ...) + %%(func)s(triangulation, z, [levels], ...) + %%(func)s(x, y, z, [levels], *, [triangles=triangles], [mask=mask], ...) The triangular grid can be specified either by passing a `.Triangulation` object as the first parameter, or by passing the points *x*, *y* and @@ -93,7 +93,7 @@ def _contour_args(self, args, kwargs): *triangles* are given, the triangulation is calculated on the fly. It is possible to pass *triangles* positionally, i.e. -``%%(func)s(x, y, triangles, Z, ...)``. However, this is discouraged. For more +``%%(func)s(x, y, triangles, z, ...)``. However, this is discouraged. For more clarity, pass *triangles* via keyword argument. Parameters @@ -105,7 +105,7 @@ def _contour_args(self, args, kwargs): Parameters defining the triangular grid. See `.Triangulation`. This is mutually exclusive with specifying *triangulation*. -Z : array-like +z : array-like The height values over which the contour is drawn. Color-mapping is controlled by *cmap*, *norm*, *vmin*, and *vmax*. @@ -157,20 +157,20 @@ def _contour_args(self, args, kwargs): This parameter is ignored if *colors* is set. origin : {*None*, 'upper', 'lower', 'image'}, default: None - Determines the orientation and exact position of *Z* by specifying the - position of ``Z[0, 0]``. This is only relevant, if *X*, *Y* are not given. + Determines the orientation and exact position of *z* by specifying the + position of ``z[0, 0]``. This is only relevant, if *X*, *Y* are not given. - - *None*: ``Z[0, 0]`` is at X=0, Y=0 in the lower left corner. - - 'lower': ``Z[0, 0]`` is at X=0.5, Y=0.5 in the lower left corner. - - 'upper': ``Z[0, 0]`` is at X=N+0.5, Y=0.5 in the upper left corner. + - *None*: ``z[0, 0]`` is at X=0, Y=0 in the lower left corner. + - 'lower': ``z[0, 0]`` is at X=0.5, Y=0.5 in the lower left corner. + - 'upper': ``z[0, 0]`` is at X=N+0.5, Y=0.5 in the upper left corner. - 'image': Use the value from :rc:`image.origin`. extent : (x0, x1, y0, y1), optional If *origin* is not *None*, then *extent* is interpreted as in `.imshow`: it - gives the outer pixel boundaries. In this case, the position of Z[0, 0] is + gives the outer pixel boundaries. In this case, the position of z[0, 0] is the center of the pixel, not a corner. If *origin* is *None*, then - (*x0*, *y0*) is the position of Z[0, 0], and (*x1*, *y1*) is the position - of Z[-1, -1]. + (*x0*, *y0*) is the position of z[0, 0], and (*x1*, *y1*) is the position + of z[-1, -1]. This argument is ignored if *X* and *Y* are specified in the call to contour. diff --git a/lib/matplotlib/tri/tripcolor.py b/lib/matplotlib/tri/tripcolor.py index f0155d2a29e8..c4865a393f99 100644 --- a/lib/matplotlib/tri/tripcolor.py +++ b/lib/matplotlib/tri/tripcolor.py @@ -13,8 +13,8 @@ def tripcolor(ax, *args, alpha=1.0, norm=None, cmap=None, vmin=None, Call signatures:: - tripcolor(triangulation, C, *, ...) - tripcolor(x, y, C, *, [triangles=triangles], [mask=mask], ...) + tripcolor(triangulation, c, *, ...) + tripcolor(x, y, c, *, [triangles=triangles], [mask=mask], ...) The triangular grid can be specified either by passing a `.Triangulation` object as the first parameter, or by passing the points *x*, *y* and @@ -22,12 +22,12 @@ def tripcolor(ax, *args, alpha=1.0, norm=None, cmap=None, vmin=None, explanation of these parameters. It is possible to pass the triangles positionally, i.e. - ``tripcolor(x, y, triangles, C, ...)``. However, this is discouraged. + ``tripcolor(x, y, triangles, c, ...)``. However, this is discouraged. For more clarity, pass *triangles* via keyword argument. If neither of *triangulation* or *triangles* are given, the triangulation is calculated on the fly. In this case, it does not make sense to provide - colors at the triangle faces via *C* or *facecolors* because there are + colors at the triangle faces via *c* or *facecolors* because there are multiple possible triangulations for a group of points and you don't know which triangles will be constructed. @@ -38,21 +38,21 @@ def tripcolor(ax, *args, alpha=1.0, norm=None, cmap=None, vmin=None, x, y, triangles, mask Parameters defining the triangular grid. See `.Triangulation`. This is mutually exclusive with specifying *triangulation*. - C : array-like + c : array-like The color values, either for the points or for the triangles. Which one - is automatically inferred from the length of *C*, i.e. does it match + is automatically inferred from the length of *c*, i.e. does it match the number of points or the number of triangles. If there are the same number of points and triangles in the triangulation it is assumed that color values are defined at points; to force the use of color values at - triangles use the keyword argument ``facecolors=C`` instead of just - ``C``. + triangles use the keyword argument ``facecolors=c`` instead of just + ``c``. This parameter is position-only. facecolors : array-like, optional - Can be used alternatively to *C* to specify colors at the triangle - faces. This parameter takes precedence over *C*. + Can be used alternatively to *c* to specify colors at the triangle + faces. This parameter takes precedence over *c*. shading : {'flat', 'gouraud'}, default: 'flat' - If 'flat' and the color values *C* are defined at points, the color - values used for each triangle are from the mean C of the triangle's + If 'flat' and the color values *c* are defined at points, the color + values used for each triangle are from the mean c of the triangle's three points. If *shading* is 'gouraud' then color values must be defined at points. other_parameters @@ -68,34 +68,34 @@ def tripcolor(ax, *args, alpha=1.0, norm=None, cmap=None, vmin=None, if facecolors is not None: if args: _api.warn_external( - "Positional parameter C has no effect when the keyword " + "Positional parameter c has no effect when the keyword " "facecolors is given") point_colors = None if len(facecolors) != len(tri.triangles): raise ValueError("The length of facecolors must match the number " "of triangles") else: - # Color from positional parameter C + # Color from positional parameter c if not args: raise TypeError( - "tripcolor() missing 1 required positional argument: 'C'; or " + "tripcolor() missing 1 required positional argument: 'c'; or " "1 required keyword-only argument: 'facecolors'") elif len(args) > 1: _api.warn_deprecated( "3.6", message=f"Additional positional parameters " f"{args[1:]!r} are ignored; support for them is deprecated " f"since %(since)s and will be removed %(removal)s") - C = np.asarray(args[0]) - if len(C) == len(tri.x): + c = np.asarray(args[0]) + if len(c) == len(tri.x): # having this before the len(tri.triangles) comparison gives # precedence to nodes if there are as many nodes as triangles - point_colors = C + point_colors = c facecolors = None - elif len(C) == len(tri.triangles): + elif len(c) == len(tri.triangles): point_colors = None - facecolors = C + facecolors = c else: - raise ValueError('The length of C must match either the number ' + raise ValueError('The length of c must match either the number ' 'of points or the number of triangles') # Handling of linewidths, shading, edgecolors and antialiased as From cddc06669d6fbe2f12a43444457f68238dd42839 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 19 Oct 2022 03:54:52 -0400 Subject: [PATCH 067/194] Backport PR #24184: Add tests for ToolManager --- lib/matplotlib/backend_managers.py | 5 +- lib/matplotlib/tests/test_backend_bases.py | 54 ++++++++++++++++++++-- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/backend_managers.py b/lib/matplotlib/backend_managers.py index 7c3f7b92106f..e7dd748325e5 100644 --- a/lib/matplotlib/backend_managers.py +++ b/lib/matplotlib/backend_managers.py @@ -185,7 +185,7 @@ def update_keymap(self, name, key): Keys to associate with the tool. """ if name not in self._tools: - raise KeyError(f'{name} not in Tools') + raise KeyError(f'{name!r} not in Tools') self._remove_keys(name) if isinstance(key, str): key = [key] @@ -404,6 +404,7 @@ def get_tool(self, name, warn=True): return name if name not in self._tools: if warn: - _api.warn_external(f"ToolManager does not control tool {name}") + _api.warn_external( + f"ToolManager does not control tool {name!r}") return None return self._tools[name] diff --git a/lib/matplotlib/tests/test_backend_bases.py b/lib/matplotlib/tests/test_backend_bases.py index 231a3e044705..96d2f3afcd55 100644 --- a/lib/matplotlib/tests/test_backend_bases.py +++ b/lib/matplotlib/tests/test_backend_bases.py @@ -4,6 +4,7 @@ from matplotlib.backend_bases import ( FigureCanvasBase, LocationEvent, MouseButton, MouseEvent, NavigationToolbar2, RendererBase) +from matplotlib.backend_tools import RubberbandBase from matplotlib.figure import Figure from matplotlib.testing._markers import needs_pgf_xelatex import matplotlib.pyplot as plt @@ -12,6 +13,12 @@ import pytest +_EXPECTED_WARNING_TOOLMANAGER = ( + r"Treat the new Tool classes introduced in " + r"v[0-9]*.[0-9]* as experimental for now; " + "the API and rcParam may change in future versions.") + + def test_uses_per_path(): id = transforms.Affine2D() paths = [path.Path.unit_regular_polygon(i) for i in range(3, 7)] @@ -247,11 +254,7 @@ def test_interactive_colorbar(plot_func, orientation, tool, button, expected): def test_toolbar_zoompan(): - expected_warning_regex = ( - r"Treat the new Tool classes introduced in " - r"v[0-9]*.[0-9]* as experimental for now; " - "the API and rcParam may change in future versions.") - with pytest.warns(UserWarning, match=expected_warning_regex): + with pytest.warns(UserWarning, match=_EXPECTED_WARNING_TOOLMANAGER): plt.rcParams['toolbar'] = 'toolmanager' ax = plt.gca() assert ax.get_navigate_mode() is None @@ -349,3 +352,44 @@ def test_interactive_pan(key, mouseend, expectedxlim, expectedylim): # Should be close, but won't be exact due to screen integer resolution assert tuple(ax.get_xlim()) == pytest.approx(expectedxlim, abs=0.02) assert tuple(ax.get_ylim()) == pytest.approx(expectedylim, abs=0.02) + + +def test_toolmanager_remove(): + with pytest.warns(UserWarning, match=_EXPECTED_WARNING_TOOLMANAGER): + plt.rcParams['toolbar'] = 'toolmanager' + fig = plt.gcf() + initial_len = len(fig.canvas.manager.toolmanager.tools) + assert 'forward' in fig.canvas.manager.toolmanager.tools + fig.canvas.manager.toolmanager.remove_tool('forward') + assert len(fig.canvas.manager.toolmanager.tools) == initial_len - 1 + assert 'forward' not in fig.canvas.manager.toolmanager.tools + + +def test_toolmanager_get_tool(): + with pytest.warns(UserWarning, match=_EXPECTED_WARNING_TOOLMANAGER): + plt.rcParams['toolbar'] = 'toolmanager' + fig = plt.gcf() + rubberband = fig.canvas.manager.toolmanager.get_tool('rubberband') + assert isinstance(rubberband, RubberbandBase) + assert fig.canvas.manager.toolmanager.get_tool(rubberband) is rubberband + with pytest.warns(UserWarning, + match="ToolManager does not control tool 'foo'"): + assert fig.canvas.manager.toolmanager.get_tool('foo') is None + assert fig.canvas.manager.toolmanager.get_tool('foo', warn=False) is None + + with pytest.warns(UserWarning, + match="ToolManager does not control tool 'foo'"): + assert fig.canvas.manager.toolmanager.trigger_tool('foo') is None + + +def test_toolmanager_update_keymap(): + with pytest.warns(UserWarning, match=_EXPECTED_WARNING_TOOLMANAGER): + plt.rcParams['toolbar'] = 'toolmanager' + fig = plt.gcf() + assert 'v' in fig.canvas.manager.toolmanager.get_tool_keymap('forward') + with pytest.warns(UserWarning, + match="Key c changed from back to forward"): + fig.canvas.manager.toolmanager.update_keymap('forward', 'c') + assert fig.canvas.manager.toolmanager.get_tool_keymap('forward') == ['c'] + with pytest.raises(KeyError, match="'foo' not in Tools"): + fig.canvas.manager.toolmanager.update_keymap('foo', 'c') From db433b536760a007c2d9a45a2a929b2e346a9531 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Thu, 20 Oct 2022 22:51:23 +0200 Subject: [PATCH 068/194] Backport PR #24229: FIX: do not mutate dictionaries passed in by user --- lib/matplotlib/figure.py | 5 ++--- lib/matplotlib/tests/test_figure.py | 8 ++++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 1636e201019b..92377bd690ed 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -878,8 +878,7 @@ def subplots(self, nrows=1, ncols=1, *, sharex=False, sharey=False, # Note that this is the same as fig.subplots(2, 2, sharex=True, sharey=True) """ - if gridspec_kw is None: - gridspec_kw = {} + gridspec_kw = dict(gridspec_kw or {}) if height_ratios is not None: if 'height_ratios' in gridspec_kw: raise ValueError("'height_ratios' must not be defined both as " @@ -1869,7 +1868,7 @@ def subplot_mosaic(self, mosaic, *, sharex=False, sharey=False, """ subplot_kw = subplot_kw or {} - gridspec_kw = gridspec_kw or {} + gridspec_kw = dict(gridspec_kw or {}) if height_ratios is not None: if 'height_ratios' in gridspec_kw: raise ValueError("'height_ratios' must not be defined both as " diff --git a/lib/matplotlib/tests/test_figure.py b/lib/matplotlib/tests/test_figure.py index 48b4a880e089..cc5a3b9ae2ff 100644 --- a/lib/matplotlib/tests/test_figure.py +++ b/lib/matplotlib/tests/test_figure.py @@ -1412,3 +1412,11 @@ def test_unpickle_with_device_pixel_ratio(): assert fig.dpi == 42*7 fig2 = pickle.loads(pickle.dumps(fig)) assert fig2.dpi == 42 + + +def test_gridspec_no_mutate_input(): + gs = {'left': .1} + gs_orig = dict(gs) + plt.subplots(1, 2, width_ratios=[1, 2], gridspec_kw=gs) + assert gs == gs_orig + plt.subplot_mosaic('AB', width_ratios=[1, 2], gridspec_kw=gs) From 0b05b1fa3a3d0fc6d5f9bea43dd708540f5afee1 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Thu, 20 Oct 2022 17:51:04 -0400 Subject: [PATCH 069/194] Backport PR #24009: Fix evaluating colormaps on non-numpy arrays --- lib/matplotlib/colors.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 5441b0d617b5..f8a18443c9e0 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -706,8 +706,12 @@ def __call__(self, X, alpha=None, bytes=False): if not self._isinit: self._init() - mask_bad = X.mask if np.ma.is_masked(X) else np.isnan(X) # Mask nan's. + # Take the bad mask from a masked array, or in all other cases defer + # np.isnan() to after we have converted to an array. + mask_bad = X.mask if np.ma.is_masked(X) else None xa = np.array(X, copy=True) + if mask_bad is None: + mask_bad = np.isnan(xa) if not xa.dtype.isnative: xa = xa.byteswap().newbyteorder() # Native byteorder is faster. if xa.dtype.kind == "f": From 1ae9f8cb6fc5224400a54a18b522185de95116b9 Mon Sep 17 00:00:00 2001 From: Kostya Farber <73378227+kostyafarber@users.noreply.github.com> Date: Thu, 20 Oct 2022 22:55:28 +0100 Subject: [PATCH 070/194] Backport PR #24096: [DOC]: Add simple animation scatter plot to the example documentation --- examples/animation/simple_scatter.py | 31 ++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 examples/animation/simple_scatter.py diff --git a/examples/animation/simple_scatter.py b/examples/animation/simple_scatter.py new file mode 100644 index 000000000000..1d18039dcf11 --- /dev/null +++ b/examples/animation/simple_scatter.py @@ -0,0 +1,31 @@ +""" +============================= +Animated scatter saved as GIF +============================= + +""" +import numpy as np +import matplotlib.pyplot as plt +import matplotlib.animation as animation + +fig, ax = plt.subplots() +ax.set_xlim([0, 10]) + +scat = ax.scatter(1, 0) +x = np.linspace(0, 10) + + +def animate(i): + scat.set_offsets((x[i], 0)) + return scat, + +ani = animation.FuncAnimation(fig, animate, repeat=True, + frames=len(x) - 1, interval=50) + +# To save the animation using Pillow as a gif +# writer = animation.PillowWriter(fps=15, +# metadata=dict(artist='Me'), +# bitrate=1800) +# ani.save('scatter.gif', writer=writer) + +plt.show() From abe4054a4f64a300231432e91f4057be286312b4 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Thu, 20 Oct 2022 17:56:04 -0400 Subject: [PATCH 071/194] Backport PR #23985: Improve rubberband rendering in wx and tk --- lib/matplotlib/backends/_backend_tk.py | 30 +++++++++++++++++--------- lib/matplotlib/backends/backend_wx.py | 12 ++++++----- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/lib/matplotlib/backends/_backend_tk.py b/lib/matplotlib/backends/_backend_tk.py index 5d92e35469c2..7617d76e2591 100644 --- a/lib/matplotlib/backends/_backend_tk.py +++ b/lib/matplotlib/backends/_backend_tk.py @@ -212,7 +212,8 @@ def filter_destroy(event): self._tkcanvas.focus_set() - self._rubberband_rect = None + self._rubberband_rect_black = None + self._rubberband_rect_white = None def _update_device_pixel_ratio(self, event=None): # Tk gives scaling with respect to 72 DPI, but Windows screens are @@ -667,21 +668,30 @@ def set_message(self, s): def draw_rubberband(self, event, x0, y0, x1, y1): # Block copied from remove_rubberband for backend_tools convenience. - if self.canvas._rubberband_rect: - self.canvas._tkcanvas.delete(self.canvas._rubberband_rect) + if self.canvas._rubberband_rect_white: + self.canvas._tkcanvas.delete(self.canvas._rubberband_rect_white) + if self.canvas._rubberband_rect_black: + self.canvas._tkcanvas.delete(self.canvas._rubberband_rect_black) height = self.canvas.figure.bbox.height y0 = height - y0 y1 = height - y1 - self.canvas._rubberband_rect = self.canvas._tkcanvas.create_rectangle( - x0, y0, x1, y1) + self.canvas._rubberband_rect_black = ( + self.canvas._tkcanvas.create_rectangle( + x0, y0, x1, y1)) + self.canvas._rubberband_rect_white = ( + self.canvas._tkcanvas.create_rectangle( + x0, y0, x1, y1, outline='white', dash=(3, 3))) def remove_rubberband(self): - if self.canvas._rubberband_rect: - self.canvas._tkcanvas.delete(self.canvas._rubberband_rect) - self.canvas._rubberband_rect = None + if self.canvas._rubberband_rect_white: + self.canvas._tkcanvas.delete(self.canvas._rubberband_rect_white) + self.canvas._rubberband_rect_white = None + if self.canvas._rubberband_rect_black: + self.canvas._tkcanvas.delete(self.canvas._rubberband_rect_black) + self.canvas._rubberband_rect_black = None lastrect = _api.deprecated("3.6")( - property(lambda self: self.canvas._rubberband_rect)) + property(lambda self: self.canvas._rubberband_rect_black)) def _set_image_for_button(self, button): """ @@ -907,7 +917,7 @@ def remove_rubberband(self): self._make_classic_style_pseudo_toolbar()) lastrect = _api.deprecated("3.6")( - property(lambda self: self.figure.canvas._rubberband_rect)) + property(lambda self: self.figure.canvas._rubberband_rect_black)) @_api.deprecated("3.5", alternative="ToolSetCursor") diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index 952dd27a3903..4d88547b865d 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -508,6 +508,8 @@ def __init__(self, parent, id, figure=None): _log.debug("%s - __init__() - bitmap w:%d h:%d", type(self), w, h) self._isDrawn = False self._rubberband_rect = None + self._rubberband_pen_black = wx.Pen('BLACK', 1, wx.PENSTYLE_SHORT_DASH) + self._rubberband_pen_white = wx.Pen('WHITE', 1, wx.PENSTYLE_SOLID) self.Bind(wx.EVT_SIZE, self._on_size) self.Bind(wx.EVT_PAINT, self._on_paint) @@ -625,11 +627,11 @@ def gui_repaint(self, drawDC=None): drawDC.DrawBitmap(bmp, 0, 0) if self._rubberband_rect is not None: # Some versions of wx+python don't support numpy.float64 here. - x0, y0, x1, y1 = map(int, self._rubberband_rect) - drawDC.DrawLineList( - [(x0, y0, x1, y0), (x1, y0, x1, y1), - (x0, y0, x0, y1), (x0, y1, x1, y1)], - wx.Pen('BLACK', 1, wx.PENSTYLE_SHORT_DASH)) + x0, y0, x1, y1 = map(round, self._rubberband_rect) + rect = [(x0, y0, x1, y0), (x1, y0, x1, y1), + (x0, y0, x0, y1), (x0, y1, x1, y1)] + drawDC.DrawLineList(rect, self._rubberband_pen_white) + drawDC.DrawLineList(rect, self._rubberband_pen_black) filetypes = { **FigureCanvasBase.filetypes, From 1ad20273a320378f825adc2fd93a5497aa9bd341 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Thu, 20 Oct 2022 18:44:37 -0400 Subject: [PATCH 072/194] Backport PR #23607: DOC: document that appearance is part of our stable API --- doc/devel/color_changes.rst | 3 ++- doc/devel/contributing.rst | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/devel/color_changes.rst b/doc/devel/color_changes.rst index 24aa15f29abf..f7646ded7c14 100644 --- a/doc/devel/color_changes.rst +++ b/doc/devel/color_changes.rst @@ -4,7 +4,8 @@ Default color changes ********************* -As discussed at length elsewhere [insert links], ``jet`` is an +As discussed at length `elsewhere `__ , +``jet`` is an empirically bad colormap and should not be the default colormap. Due to the position that changing the appearance of the plot breaks backward compatibility, this change has been put off for far longer diff --git a/doc/devel/contributing.rst b/doc/devel/contributing.rst index 2743424423d3..362cf09c5f7e 100644 --- a/doc/devel/contributing.rst +++ b/doc/devel/contributing.rst @@ -331,6 +331,12 @@ API consistency and stability are of great value. Therefore, API changes (e.g. signature changes, behavior changes, removals) will only be conducted if the added benefit is worth the user effort for adapting. +Because we are a visualization library our primary output is the final +visualization the user sees. Thus it is our :ref:`long standing +` policy that the appearance of the figure is part of the API +and any changes, either semantic or esthetic, will be treated as a +backwards-incompatible API change. + API changes in Matplotlib have to be performed following the deprecation process below, except in very rare circumstances as deemed necessary by the development team. This ensures that users are notified before the change will take effect and thus From 4b7d84aaacf25ceab897556aa23527224a6fdb86 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Fri, 21 Oct 2022 02:40:34 -0400 Subject: [PATCH 073/194] Backport PR #24197: Properly set and inherit backend_version. --- lib/matplotlib/backends/_backend_gtk.py | 13 +++++++------ lib/matplotlib/backends/_backend_tk.py | 4 +--- lib/matplotlib/backends/backend_agg.py | 4 +--- lib/matplotlib/backends/backend_cairo.py | 4 +--- lib/matplotlib/backends/backend_gtk3.py | 1 - lib/matplotlib/backends/backend_gtk4.py | 1 - lib/matplotlib/backends/backend_ps.py | 4 ++-- lib/matplotlib/backends/backend_qt.py | 3 +-- lib/matplotlib/backends/backend_qt5.py | 2 +- lib/matplotlib/backends/backend_qt5agg.py | 3 +-- lib/matplotlib/backends/backend_qtagg.py | 2 +- lib/matplotlib/backends/backend_svg.py | 3 ++- 12 files changed, 18 insertions(+), 26 deletions(-) diff --git a/lib/matplotlib/backends/_backend_gtk.py b/lib/matplotlib/backends/_backend_gtk.py index db5ca34cbf80..7eda5b924268 100644 --- a/lib/matplotlib/backends/_backend_gtk.py +++ b/lib/matplotlib/backends/_backend_gtk.py @@ -24,12 +24,7 @@ raise ImportError("Gtk-based backends require cairo") from e _log = logging.getLogger(__name__) - -backend_version = "%s.%s.%s" % ( - Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version()) - -# Placeholder -_application = None +_application = None # Placeholder def _shutdown_application(app): @@ -305,6 +300,12 @@ def trigger(self, *args): class _BackendGTK(_Backend): + backend_version = "%s.%s.%s" % ( + Gtk.get_major_version(), + Gtk.get_minor_version(), + Gtk.get_micro_version(), + ) + @staticmethod def mainloop(): global _application diff --git a/lib/matplotlib/backends/_backend_tk.py b/lib/matplotlib/backends/_backend_tk.py index 7617d76e2591..2aec1440f6c6 100644 --- a/lib/matplotlib/backends/_backend_tk.py +++ b/lib/matplotlib/backends/_backend_tk.py @@ -24,9 +24,6 @@ _log = logging.getLogger(__name__) - -backend_version = tk.TkVersion - cursord = { cursors.MOVE: "fleur", cursors.HAND: "hand2", @@ -1027,6 +1024,7 @@ def trigger(self, *args): @_Backend.export class _BackendTk(_Backend): + backend_version = tk.TkVersion FigureManager = FigureManagerTk @staticmethod diff --git a/lib/matplotlib/backends/backend_agg.py b/lib/matplotlib/backends/backend_agg.py index 0d8a127dba8c..8fda2606b472 100644 --- a/lib/matplotlib/backends/backend_agg.py +++ b/lib/matplotlib/backends/backend_agg.py @@ -40,9 +40,6 @@ from matplotlib.backends._backend_agg import RendererAgg as _RendererAgg -backend_version = 'v2.2' - - def get_hinting_flag(): mapping = { 'default': LOAD_DEFAULT, @@ -563,5 +560,6 @@ def print_webp(self, filename_or_obj, *, pil_kwargs=None): @_Backend.export class _BackendAgg(_Backend): + backend_version = 'v2.2' FigureCanvas = FigureCanvasAgg FigureManager = FigureManagerBase diff --git a/lib/matplotlib/backends/backend_cairo.py b/lib/matplotlib/backends/backend_cairo.py index 3a0c96c92fba..3d6cec641884 100644 --- a/lib/matplotlib/backends/backend_cairo.py +++ b/lib/matplotlib/backends/backend_cairo.py @@ -34,9 +34,6 @@ from matplotlib.transforms import Affine2D -backend_version = cairo.version - - def _append_path(ctx, path, transform, clip=None): for points, code in path.iter_segments( transform, remove_nans=True, clip=clip): @@ -548,5 +545,6 @@ def set_context(self, ctx): @_Backend.export class _BackendCairo(_Backend): + backend_version = cairo.version FigureCanvas = FigureCanvasCairo FigureManager = FigureManagerBase diff --git a/lib/matplotlib/backends/backend_gtk3.py b/lib/matplotlib/backends/backend_gtk3.py index 89e92690c7eb..cb1062cf157c 100644 --- a/lib/matplotlib/backends/backend_gtk3.py +++ b/lib/matplotlib/backends/backend_gtk3.py @@ -31,7 +31,6 @@ _BackendGTK, _FigureManagerGTK, _NavigationToolbar2GTK, TimerGTK as TimerGTK3, ) -from ._backend_gtk import backend_version # noqa: F401 # pylint: disable=W0611 _log = logging.getLogger(__name__) diff --git a/lib/matplotlib/backends/backend_gtk4.py b/lib/matplotlib/backends/backend_gtk4.py index 41b028e6620a..923787150a8d 100644 --- a/lib/matplotlib/backends/backend_gtk4.py +++ b/lib/matplotlib/backends/backend_gtk4.py @@ -28,7 +28,6 @@ _BackendGTK, _FigureManagerGTK, _NavigationToolbar2GTK, TimerGTK as TimerGTK4, ) -from ._backend_gtk import backend_version # noqa: F401 # pylint: disable=W0611 class FigureCanvasGTK4(FigureCanvasBase, Gtk.DrawingArea): diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index 67829c216f9a..629f0133ed52 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -33,9 +33,8 @@ from matplotlib.backends.backend_mixed import MixedModeRenderer from . import _backend_pdf_ps -_log = logging.getLogger(__name__) -backend_version = 'Level II' +_log = logging.getLogger(__name__) debugPS = False @@ -1364,4 +1363,5 @@ def pstoeps(tmpfile, bbox=None, rotated=False): @_Backend.export class _BackendPS(_Backend): + backend_version = 'Level II' FigureCanvas = FigureCanvasPS diff --git a/lib/matplotlib/backends/backend_qt.py b/lib/matplotlib/backends/backend_qt.py index b91446c4e632..2afff892ad2e 100644 --- a/lib/matplotlib/backends/backend_qt.py +++ b/lib/matplotlib/backends/backend_qt.py @@ -20,8 +20,6 @@ ) -backend_version = __version__ - # SPECIAL_KEYS are Qt::Key that do *not* return their Unicode name # instead they have manually specified names. SPECIAL_KEYS = { @@ -1013,6 +1011,7 @@ def trigger(self, *args, **kwargs): @_Backend.export class _BackendQT(_Backend): + backend_version = __version__ FigureCanvas = FigureCanvasQT FigureManager = FigureManagerQT diff --git a/lib/matplotlib/backends/backend_qt5.py b/lib/matplotlib/backends/backend_qt5.py index 3c6b2c66a845..b6f643a34aa9 100644 --- a/lib/matplotlib/backends/backend_qt5.py +++ b/lib/matplotlib/backends/backend_qt5.py @@ -4,7 +4,7 @@ from .backend_qt import ( # noqa - backend_version, SPECIAL_KEYS, + SPECIAL_KEYS, # Public API cursord, _create_qApp, _BackendQT, TimerQT, MainWindow, FigureCanvasQT, FigureManagerQT, ToolbarQt, NavigationToolbar2QT, SubplotToolQt, diff --git a/lib/matplotlib/backends/backend_qt5agg.py b/lib/matplotlib/backends/backend_qt5agg.py index c81fa6f6ccb3..8a92fd5135d5 100644 --- a/lib/matplotlib/backends/backend_qt5agg.py +++ b/lib/matplotlib/backends/backend_qt5agg.py @@ -6,8 +6,7 @@ backends._QT_FORCE_QT5_BINDING = True from .backend_qtagg import ( # noqa: F401, E402 # pylint: disable=W0611 _BackendQTAgg, FigureCanvasQTAgg, FigureManagerQT, NavigationToolbar2QT, - backend_version, FigureCanvasAgg, FigureCanvasQT -) + FigureCanvasAgg, FigureCanvasQT) @_BackendQTAgg.export diff --git a/lib/matplotlib/backends/backend_qtagg.py b/lib/matplotlib/backends/backend_qtagg.py index 7860c2b3e5ac..dde185107e98 100644 --- a/lib/matplotlib/backends/backend_qtagg.py +++ b/lib/matplotlib/backends/backend_qtagg.py @@ -11,7 +11,7 @@ from .backend_agg import FigureCanvasAgg from .backend_qt import QtCore, QtGui, _BackendQT, FigureCanvasQT from .backend_qt import ( # noqa: F401 # pylint: disable=W0611 - FigureManagerQT, NavigationToolbar2QT, backend_version) + FigureManagerQT, NavigationToolbar2QT) class FigureCanvasQTAgg(FigureCanvasAgg, FigureCanvasQT): diff --git a/lib/matplotlib/backends/backend_svg.py b/lib/matplotlib/backends/backend_svg.py index 738fe44c6f81..9a472899c193 100644 --- a/lib/matplotlib/backends/backend_svg.py +++ b/lib/matplotlib/backends/backend_svg.py @@ -24,9 +24,9 @@ from matplotlib import _path from matplotlib.transforms import Affine2D, Affine2DBase + _log = logging.getLogger(__name__) -backend_version = mpl.__version__ # ---------------------------------------------------------------------- # SimpleXMLWriter class @@ -1426,4 +1426,5 @@ def draw(self): @_Backend.export class _BackendSVG(_Backend): + backend_version = mpl.__version__ FigureCanvas = FigureCanvasSVG From 5c661e3691e53a572e576f08890ad19477e7014b Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sat, 22 Oct 2022 16:13:17 +0200 Subject: [PATCH 074/194] Backport PR #24250: Fix key reporting in pick events --- lib/matplotlib/figure.py | 6 ++---- lib/matplotlib/tests/test_backend_bases.py | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 92377bd690ed..e879549167cd 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -2443,10 +2443,6 @@ def __init__(self, # pickling. self._canvas_callbacks = cbook.CallbackRegistry( signals=FigureCanvasBase.events) - self._button_pick_id = self._canvas_callbacks._connect_picklable( - 'button_press_event', self.pick) - self._scroll_pick_id = self._canvas_callbacks._connect_picklable( - 'scroll_event', self.pick) connect = self._canvas_callbacks._connect_picklable self._mouse_key_ids = [ connect('key_press_event', backend_bases._key_handler), @@ -2457,6 +2453,8 @@ def __init__(self, connect('scroll_event', backend_bases._mouse_handler), connect('motion_notify_event', backend_bases._mouse_handler), ] + self._button_pick_id = connect('button_press_event', self.pick) + self._scroll_pick_id = connect('scroll_event', self.pick) if figsize is None: figsize = mpl.rcParams['figure.figsize'] diff --git a/lib/matplotlib/tests/test_backend_bases.py b/lib/matplotlib/tests/test_backend_bases.py index 96d2f3afcd55..4cbd1bc98b67 100644 --- a/lib/matplotlib/tests/test_backend_bases.py +++ b/lib/matplotlib/tests/test_backend_bases.py @@ -2,7 +2,7 @@ from matplotlib import path, transforms from matplotlib.backend_bases import ( - FigureCanvasBase, LocationEvent, MouseButton, MouseEvent, + FigureCanvasBase, KeyEvent, LocationEvent, MouseButton, MouseEvent, NavigationToolbar2, RendererBase) from matplotlib.backend_tools import RubberbandBase from matplotlib.figure import Figure @@ -124,12 +124,18 @@ def test_pick(): fig = plt.figure() fig.text(.5, .5, "hello", ha="center", va="center", picker=True) fig.canvas.draw() + picks = [] - fig.canvas.mpl_connect("pick_event", lambda event: picks.append(event)) - start_event = MouseEvent( - "button_press_event", fig.canvas, *fig.transFigure.transform((.5, .5)), - MouseButton.LEFT) - fig.canvas.callbacks.process(start_event.name, start_event) + def handle_pick(event): + assert event.mouseevent.key == "a" + picks.append(event) + fig.canvas.mpl_connect("pick_event", handle_pick) + + KeyEvent("key_press_event", fig.canvas, "a")._process() + MouseEvent("button_press_event", fig.canvas, + *fig.transFigure.transform((.5, .5)), + MouseButton.LEFT)._process() + KeyEvent("key_release_event", fig.canvas, "a")._process() assert len(picks) == 1 From 69cd562658f188b6f4861cb3c32f326055b641e7 Mon Sep 17 00:00:00 2001 From: hannah Date: Sun, 23 Oct 2022 13:35:57 -0400 Subject: [PATCH 075/194] Backport PR #24108: Add 3D plots to plot_types doc page --- doc/sphinxext/gallery_order.py | 1 + plot_types/3D/README.rst | 6 ++++++ plot_types/3D/scatter3d_simple.py | 29 ++++++++++++++++++++++++++ plot_types/3D/surface3d_simple.py | 29 ++++++++++++++++++++++++++ plot_types/3D/trisurf3d_simple.py | 34 +++++++++++++++++++++++++++++++ plot_types/3D/voxels_simple.py | 31 ++++++++++++++++++++++++++++ plot_types/3D/wire3d_simple.py | 24 ++++++++++++++++++++++ 7 files changed, 154 insertions(+) create mode 100644 plot_types/3D/README.rst create mode 100644 plot_types/3D/scatter3d_simple.py create mode 100644 plot_types/3D/surface3d_simple.py create mode 100644 plot_types/3D/trisurf3d_simple.py create mode 100644 plot_types/3D/voxels_simple.py create mode 100644 plot_types/3D/wire3d_simple.py diff --git a/doc/sphinxext/gallery_order.py b/doc/sphinxext/gallery_order.py index 62b7803d0f8b..3632666d336e 100644 --- a/doc/sphinxext/gallery_order.py +++ b/doc/sphinxext/gallery_order.py @@ -28,6 +28,7 @@ '../plot_types/arrays', '../plot_types/stats', '../plot_types/unstructured', + '../plot_types/3D', ] diff --git a/plot_types/3D/README.rst b/plot_types/3D/README.rst new file mode 100644 index 000000000000..e7157d4ba628 --- /dev/null +++ b/plot_types/3D/README.rst @@ -0,0 +1,6 @@ +.. _3D_plots: + +3D +-- + +3D plots using the `mpl_toolkits.mplot3d` library. diff --git a/plot_types/3D/scatter3d_simple.py b/plot_types/3D/scatter3d_simple.py new file mode 100644 index 000000000000..023a46448ccf --- /dev/null +++ b/plot_types/3D/scatter3d_simple.py @@ -0,0 +1,29 @@ +""" +============== +3D scatterplot +============== + +See `~mpl_toolkits.mplot3d.axes3d.Axes3D.scatter`. +""" +import matplotlib.pyplot as plt +import numpy as np + +plt.style.use('_mpl-gallery') + +# Make data +np.random.seed(19680801) +n = 100 +rng = np.random.default_rng() +xs = rng.uniform(23, 32, n) +ys = rng.uniform(0, 100, n) +zs = rng.uniform(-50, -25, n) + +# Plot +fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) +ax.scatter(xs, ys, zs) + +ax.set(xticklabels=[], + yticklabels=[], + zticklabels=[]) + +plt.show() diff --git a/plot_types/3D/surface3d_simple.py b/plot_types/3D/surface3d_simple.py new file mode 100644 index 000000000000..b1aff7d23b12 --- /dev/null +++ b/plot_types/3D/surface3d_simple.py @@ -0,0 +1,29 @@ +""" +===================== +3D surface +===================== + +See `~mpl_toolkits.mplot3d.axes3d.Axes3D.plot_surface`. +""" +import matplotlib.pyplot as plt +from matplotlib import cm +import numpy as np + +plt.style.use('_mpl-gallery') + +# Make data +X = np.arange(-5, 5, 0.25) +Y = np.arange(-5, 5, 0.25) +X, Y = np.meshgrid(X, Y) +R = np.sqrt(X**2 + Y**2) +Z = np.sin(R) + +# Plot the surface +fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) +ax.plot_surface(X, Y, Z, vmin=Z.min() * 2, cmap=cm.Blues) + +ax.set(xticklabels=[], + yticklabels=[], + zticklabels=[]) + +plt.show() diff --git a/plot_types/3D/trisurf3d_simple.py b/plot_types/3D/trisurf3d_simple.py new file mode 100644 index 000000000000..92832c1b5b3a --- /dev/null +++ b/plot_types/3D/trisurf3d_simple.py @@ -0,0 +1,34 @@ +""" +====================== +Triangular 3D surfaces +====================== + +See `~mpl_toolkits.mplot3d.axes3d.Axes3D.plot_trisurf`. +""" +import matplotlib.pyplot as plt +from matplotlib import cm +import numpy as np + +plt.style.use('_mpl-gallery') + +n_radii = 8 +n_angles = 36 + +# Make radii and angles spaces +radii = np.linspace(0.125, 1.0, n_radii) +angles = np.linspace(0, 2*np.pi, n_angles, endpoint=False)[..., np.newaxis] + +# Convert polar (radii, angles) coords to cartesian (x, y) coords. +x = np.append(0, (radii*np.cos(angles)).flatten()) +y = np.append(0, (radii*np.sin(angles)).flatten()) +z = np.sin(-x*y) + +# Plot +fig, ax = plt.subplots(subplot_kw={'projection': '3d'}) +ax.plot_trisurf(x, y, z, vmin=z.min() * 2, cmap=cm.Blues) + +ax.set(xticklabels=[], + yticklabels=[], + zticklabels=[]) + +plt.show() diff --git a/plot_types/3D/voxels_simple.py b/plot_types/3D/voxels_simple.py new file mode 100644 index 000000000000..c3473e108969 --- /dev/null +++ b/plot_types/3D/voxels_simple.py @@ -0,0 +1,31 @@ +""" +========================== +3D voxel / volumetric plot +========================== + +See `~mpl_toolkits.mplot3d.axes3d.Axes3D.voxels`. +""" +import matplotlib.pyplot as plt +import numpy as np + +plt.style.use('_mpl-gallery') + +# Prepare some coordinates +x, y, z = np.indices((8, 8, 8)) + +# Draw cuboids in the top left and bottom right corners +cube1 = (x < 3) & (y < 3) & (z < 3) +cube2 = (x >= 5) & (y >= 5) & (z >= 5) + +# Combine the objects into a single boolean array +voxelarray = cube1 | cube2 + +# Plot +fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) +ax.voxels(voxelarray, edgecolor='k') + +ax.set(xticklabels=[], + yticklabels=[], + zticklabels=[]) + +plt.show() diff --git a/plot_types/3D/wire3d_simple.py b/plot_types/3D/wire3d_simple.py new file mode 100644 index 000000000000..c0eaf40210e8 --- /dev/null +++ b/plot_types/3D/wire3d_simple.py @@ -0,0 +1,24 @@ +""" +================= +3D wireframe plot +================= + +See `~mpl_toolkits.mplot3d.axes3d.Axes3D.plot_wireframe`. +""" +from mpl_toolkits.mplot3d import axes3d +import matplotlib.pyplot as plt + +plt.style.use('_mpl-gallery') + +# Make data +X, Y, Z = axes3d.get_test_data(0.05) + +# Plot +fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) +ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10) + +ax.set(xticklabels=[], + yticklabels=[], + zticklabels=[]) + +plt.show() From f7e47ac7c77c1fe6cbe568b32c345d42bb3a596a Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Tue, 25 Oct 2022 14:57:57 +0900 Subject: [PATCH 076/194] Backport PR #24261: Fix pie chart in demo_agg_filter.py --- examples/misc/demo_agg_filter.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/examples/misc/demo_agg_filter.py b/examples/misc/demo_agg_filter.py index d03b5ae2ae3c..0cdbf81f50b5 100644 --- a/examples/misc/demo_agg_filter.py +++ b/examples/misc/demo_agg_filter.py @@ -99,8 +99,19 @@ def process_image(self, padded_src, dpi): class LightFilter(BaseFilter): - - def __init__(self, sigma, fraction=0.5): + """Apply LightSource filter""" + + def __init__(self, sigma, fraction=1): + """ + Parameters + ---------- + sigma : float + sigma for gaussian filter + fraction: number, default: 1 + Increases or decreases the contrast of the hillshade. + See `matplotlib.colors.LightSource` + + """ self.gauss_filter = GaussianFilter(sigma, alpha=1) self.light_source = LightSource() self.fraction = fraction @@ -114,7 +125,8 @@ def process_image(self, padded_src, dpi): rgb = padded_src[:, :, :3] alpha = padded_src[:, :, 3:] rgb2 = self.light_source.shade_rgb(rgb, elevation, - fraction=self.fraction) + fraction=self.fraction, + blend_mode="overlay") return np.concatenate([rgb2, alpha], -1) @@ -257,7 +269,7 @@ def drop_shadow_patches(ax): def light_filter_pie(ax): fracs = [15, 30, 45, 10] - explode = (0, 0.05, 0, 0) + explode = (0.1, 0.2, 0.1, 0.1) pies = ax.pie(fracs, explode=explode) light_filter = LightFilter(9) @@ -267,7 +279,7 @@ def light_filter_pie(ax): p.set(ec="none", lw=2) - gauss = DropShadowFilter(9, offsets=(3, 4), alpha=0.7) + gauss = DropShadowFilter(9, offsets=(3, -4), alpha=0.7) shadow = FilteredArtistList(pies[0], gauss) ax.add_artist(shadow) shadow.set_zorder(pies[0][0].get_zorder() - 0.1) From 1f5dd1d716ee2d78f224022fe9bf98b52f25fa7c Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Tue, 25 Oct 2022 16:31:20 +0200 Subject: [PATCH 077/194] Backport PR #24265: Restore (and warn on) seaborn styles in style.library --- lib/matplotlib/style/core.py | 69 ++++++++++++++++++------------ lib/matplotlib/tests/test_style.py | 2 + 2 files changed, 43 insertions(+), 28 deletions(-) diff --git a/lib/matplotlib/style/core.py b/lib/matplotlib/style/core.py index fb0a5426e61d..16d8af38f659 100644 --- a/lib/matplotlib/style/core.py +++ b/lib/matplotlib/style/core.py @@ -43,6 +43,32 @@ class __getattr__: 'toolbar', 'timezone', 'figure.max_open_warning', 'figure.raise_window', 'savefig.directory', 'tk.window_focus', 'docstring.hardcopy', 'date.epoch'} +_DEPRECATED_SEABORN_STYLES = { + s: s.replace("seaborn", "seaborn-v0_8") + for s in [ + "seaborn", + "seaborn-bright", + "seaborn-colorblind", + "seaborn-dark", + "seaborn-darkgrid", + "seaborn-dark-palette", + "seaborn-deep", + "seaborn-muted", + "seaborn-notebook", + "seaborn-paper", + "seaborn-pastel", + "seaborn-poster", + "seaborn-talk", + "seaborn-ticks", + "seaborn-white", + "seaborn-whitegrid", + ] +} +_DEPRECATED_SEABORN_MSG = ( + "The seaborn styles shipped by Matplotlib are deprecated since %(since)s, " + "as they no longer correspond to the styles shipped by seaborn. However, " + "they will remain available as 'seaborn-v0_8- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/test_contour.py b/lib/matplotlib/tests/test_contour.py index 8bf77f0d5470..90783990d50a 100644 --- a/lib/matplotlib/tests/test_contour.py +++ b/lib/matplotlib/tests/test_contour.py @@ -8,7 +8,7 @@ assert_array_almost_equal, assert_array_almost_equal_nulp) import matplotlib as mpl from matplotlib.testing.decorators import image_comparison -from matplotlib import pyplot as plt, rc_context +from matplotlib import pyplot as plt, rc_context, ticker from matplotlib.colors import LogNorm, same_color import pytest @@ -155,6 +155,28 @@ def test_given_colors_levels_and_extends(): plt.colorbar(c, ax=ax) +@image_comparison(['contour_log_locator.svg'], style='mpl20', + remove_text=False) +def test_log_locator_levels(): + + fig, ax = plt.subplots() + + N = 100 + x = np.linspace(-3.0, 3.0, N) + y = np.linspace(-2.0, 2.0, N) + + X, Y = np.meshgrid(x, y) + + Z1 = np.exp(-X**2 - Y**2) + Z2 = np.exp(-(X * 10)**2 - (Y * 10)**2) + data = Z1 + 50 * Z2 + + c = ax.contourf(data, locator=ticker.LogLocator()) + assert_array_almost_equal(c.levels, np.power(10.0, np.arange(-6, 3))) + cb = fig.colorbar(c, ax=ax) + assert_array_almost_equal(cb.ax.get_yticks(), c.levels) + + @image_comparison(['contour_datetime_axis.png'], style='mpl20') def test_contour_datetime_axis(): fig = plt.figure() From e45012855f26113068e22a535b68dbf32dddd0be Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 11 Jan 2023 16:02:09 -0500 Subject: [PATCH 189/194] DOC: Update GitHub stats for 3.6.3 --- doc/users/github_stats.rst | 272 +++++++++--------- .../prev_whats_new/github_stats_3.6.2.rst | 151 ++++++++++ 2 files changed, 294 insertions(+), 129 deletions(-) create mode 100644 doc/users/prev_whats_new/github_stats_3.6.2.rst diff --git a/doc/users/github_stats.rst b/doc/users/github_stats.rst index 3aa48834b0f3..d3dc01201d2f 100644 --- a/doc/users/github_stats.rst +++ b/doc/users/github_stats.rst @@ -1,154 +1,168 @@ .. _github-stats: -GitHub statistics for 3.6.2 (Nov 02, 2022) +GitHub statistics for 3.6.3 (Jan 11, 2023) ========================================== -GitHub statistics for 2022/10/08 (tag: v3.6.1) - 2022/11/02 +GitHub statistics for 2022/11/02 (tag: v3.6.2) - 2023/01/11 These lists are automatically generated, and may be incomplete or contain duplicates. -We closed 21 issues and merged 86 pull requests. -The full list can be seen `on GitHub `__ +We closed 16 issues and merged 107 pull requests. +The full list can be seen `on GitHub `__ -The following 22 authors contributed 27 commits. +The following 20 authors contributed 198 commits. * Antony Lee -* Carsten Schnober -* dependabot[bot] +* Chahak Mehta +* David Stansby * Elliott Sales de Andrade +* Eric Larson * hannah -* j1642 -* Jaco Verster -* jacoverster -* Jae-Joon Lee -* Jeffrey Aaron Paul -* jeffreypaul15 +* iofall * Jody Klymak -* Kostya Farber +* Kaidong Hu * Kyle Sunden -* Martok +* matt statham +* Matthias Bussonnier * Muhammad Abdur Rakib * Oscar Gustafsson -* Pavel Grunt +* ramvikrams * Ruth Comer +* Steffen Rehberg * Thomas A Caswell -* Tiger Nie * Tim Hoffmann +* yuanx749 GitHub issues and pull requests: -Pull Requests (86): - -* :ghpull:`24341`: Backport PR #24301 on branch v3.6.x (Restore get_renderer function in deprecated tight_layout) -* :ghpull:`24301`: Restore get_renderer function in deprecated tight_layout -* :ghpull:`24337`: Backport PR #24238 on branch v3.6.x (Update example and docstring to encourage the use of functools.partial in FuncAnimation) -* :ghpull:`24336`: Backport PR #24335 on branch v3.6.x (Fix missing word in ImageMagickWriter docstring.) -* :ghpull:`20358`: Updates example and docstring to encourage the use of functools.partial in FuncAnimation -* :ghpull:`24238`: Update example and docstring to encourage the use of functools.partial in FuncAnimation -* :ghpull:`24335`: Fix missing word in ImageMagickWriter docstring. -* :ghpull:`24330`: Backport PR #24282 on branch v3.6.x (Fix some minor docstring typos) -* :ghpull:`24323`: Backport PR #24320 on branch v3.6.x (DOC: add warning note to imsave) -* :ghpull:`24282`: Fix some minor docstring typos -* :ghpull:`24327`: Backport PR #24310 on branch v3.6.x (show axes changing in animate decay example) -* :ghpull:`24310`: show axes changing in animate decay example -* :ghpull:`24324`: Backport PR #24259 on branch v3.6.x (Move empty hexbin fix to make_norm_from_scale.) -* :ghpull:`24325`: Backport PR #24095 on branch v3.6.x (nb/webagg: Move mouse events to outer canvas div) -* :ghpull:`24326`: Backport PR #24318 on branch v3.6.x (Bump pypa/cibuildwheel from 2.11.1 to 2.11.2) -* :ghpull:`24318`: Bump pypa/cibuildwheel from 2.11.1 to 2.11.2 -* :ghpull:`24095`: nb/webagg: Move mouse events to outer canvas div -* :ghpull:`24259`: Move empty hexbin fix to make_norm_from_scale. -* :ghpull:`24320`: DOC: add warning note to imsave -* :ghpull:`24297`: Backport PR #24294 on branch v3.6.x (Run test if fontconfig is present) -* :ghpull:`24294`: Run test if fontconfig is present -* :ghpull:`24286`: Backport PR #24284 on branch v3.6.x (Remove comment about cmap from voxels docstring) -* :ghpull:`24284`: Remove comment about cmap from voxels docstring -* :ghpull:`24280`: Backport PR #24145 on branch v3.6.x (Updated Angles on Bracket arrow styles example to make angles clear #23176) -* :ghpull:`24145`: Updated Angles on Bracket arrow styles example to make angles clear #23176 -* :ghpull:`24270`: Backport PR #24265 on branch v3.6.x (Restore (and warn on) seaborn styles in style.library) -* :ghpull:`24271`: Backport PR #24266 on branch v3.6.x (TST: Increase fp tolerance on more tests for new NumPy) -* :ghpull:`24266`: TST: Increase fp tolerance on more tests for new NumPy -* :ghpull:`24265`: Restore (and warn on) seaborn styles in style.library -* :ghpull:`24267`: Backport PR #24261 on branch v3.6.x (Fix pie chart in demo_agg_filter.py) -* :ghpull:`24261`: Fix pie chart in demo_agg_filter.py -* :ghpull:`24258`: Backport PR #24108 on branch v3.6.x (Add 3D plots to plot_types doc page) -* :ghpull:`24108`: Add 3D plots to plot_types doc page -* :ghpull:`24255`: Backport PR #24250 on branch v3.6.x (Fix key reporting in pick events) -* :ghpull:`24250`: Fix key reporting in pick events -* :ghpull:`24237`: Backport PR #24197 on branch v3.6.x (Properly set and inherit backend_version.) -* :ghpull:`24197`: Properly set and inherit backend_version. -* :ghpull:`24234`: Backport PR #23607 on branch v3.6.x (DOC: document that appearance is part of our stable API) -* :ghpull:`24233`: Backport PR #23985 on branch v3.6.x (Improve rubberband rendering in wx and tk) -* :ghpull:`24232`: Backport PR #24096 on branch v3.6.x ([DOC]: Add simple animation scatter plot to the example documentation) -* :ghpull:`24231`: Backport PR #24009 on branch v3.6.x (Fix evaluating colormaps on non-numpy arrays) -* :ghpull:`24230`: Backport PR #24229 on branch v3.6.x (FIX: do not mutate dictionaries passed in by user) -* :ghpull:`23607`: DOC: document that appearance is part of our stable API -* :ghpull:`23985`: Improve rubberband rendering in wx and tk -* :ghpull:`24096`: [DOC]: Add simple animation scatter plot to the example documentation -* :ghpull:`24009`: Fix evaluating colormaps on non-numpy arrays -* :ghpull:`24229`: FIX: do not mutate dictionaries passed in by user -* :ghpull:`24223`: Backport PR #24184 on branch v3.6.x (Add tests for ToolManager) -* :ghpull:`24219`: Backport PR #23995 on branch v3.6.x (DOC: Lowercase some parameter names) -* :ghpull:`23995`: DOC: Lowercase some parameter names -* :ghpull:`24184`: Add tests for ToolManager -* :ghpull:`24211`: Backport PR #24202 on branch v3.6.x (Bump pypa/cibuildwheel from 2.10.2 to 2.11.1) -* :ghpull:`24214`: Backport PR #24169 on branch v3.6.x ([DOC]: added parent link for ``FuncAnimation`` and ``ArtistAnimation``) -* :ghpull:`24169`: [DOC]: add parent link for ``FuncAnimation`` and ``ArtistAnimation`` -* :ghpull:`24202`: Bump pypa/cibuildwheel from 2.10.2 to 2.11.1 -* :ghpull:`24206`: Backport PR #24081 on branch v3.6.x (TST: force test with shared test image to run in serial) -* :ghpull:`24181`: Backport PR #24177 on branch v3.6.x (Don't simplify paths used for autoscaling) -* :ghpull:`24200`: Backport PR #24193 on branch v3.6.x (DOC: Explain gridsize in hexbin()) -* :ghpull:`24201`: Backport PR #24194 on branch v3.6.x (DOC: Improve plot_directive documentation) -* :ghpull:`24194`: DOC: Improve plot_directive documentation -* :ghpull:`24193`: DOC: Explain gridsize in hexbin() -* :ghpull:`24192`: Backport PR #24187 on branch v3.6.x (DOC: Fix toc structure in explain/interactive) -* :ghpull:`24186`: Backport PR #24157 on branch v3.6.x (test only PR milestoning guidance) -* :ghpull:`24187`: DOC: Fix toc structure in explain/interactive -* :ghpull:`24190`: DOC: fix markup -* :ghpull:`24157`: test only PR milestoning guidance -* :ghpull:`24183`: Backport PR #24178 on branch v3.6.x (Fall back to Python-level Thread for GUI warning) -* :ghpull:`24180`: Backport PR #24173 on branch v3.6.x (TST: convert nose-style tests) -* :ghpull:`24178`: Fall back to Python-level Thread for GUI warning -* :ghpull:`24177`: Don't simplify paths used for autoscaling -* :ghpull:`24173`: TST: convert nose-style tests -* :ghpull:`24174`: Backport PR #24171 on branch v3.6.x (Fix example where wrong variable was used) -* :ghpull:`24176`: Backport PR #24167 on branch v3.6.x (FIX: turn off layout engine tightbbox) -* :ghpull:`24167`: FIX: turn off layout engine tightbbox -* :ghpull:`24171`: Fix example where wrong variable was used -* :ghpull:`24172`: Backport PR #24158 on branch v3.6.x (Fix Qt with PySide6 6.4.0) -* :ghpull:`24158`: Fix Qt with PySide6 6.4.0 -* :ghpull:`24165`: Backport PR #24164 on branch v3.6.x (Fix argument order in hist() docstring.) -* :ghpull:`24164`: Fix argument order in hist() docstring. -* :ghpull:`24151`: Backport PR #24149 on branch v3.6.x (FIX: handle input to ax.bar that is all nan) -* :ghpull:`24149`: FIX: handle input to ax.bar that is all nan -* :ghpull:`24146`: Backport PR #24137 on branch v3.6.x (Add note about blitting and zorder in animations) -* :ghpull:`24137`: Add note about blitting and zorder in animations -* :ghpull:`24134`: Backport PR #24130 on branch v3.6.x (DOC: align contour parameter doc with implementation) -* :ghpull:`24130`: DOC: align contour parameter doc with implementation -* :ghpull:`24081`: TST: force test with shared test image to run in serial - -Issues (21): - -* :ghissue:`20326`: FuncAnimation Named Arguments -* :ghissue:`24332`: [Bug]: backend bug in matplotlib==3.6.1 with python3.11 and PySide6==6.4.0.1 -* :ghissue:`24296`: [Doc]: Axes limits not updated in animate decay -* :ghissue:`24089`: [Bug]: Resizing does not work in WebAgg backend in Safari -* :ghissue:`3657`: matplotlib.pyplot.imsave colormaps some grayscale images before saving them -* :ghissue:`24060`: [TST] Upcoming dependency test failures -* :ghissue:`24264`: [Bug]: Setting matplotlib.pyplot.style.library['seaborn-colorblind'] result in key error on matplotlib v3.6.1 -* :ghissue:`23900`: [Doc]: Adding some 3D plots to plot gallery -* :ghissue:`24199`: [Bug]: pick events do not forward mouseevent-key on Linux -* :ghissue:`23969`: [ENH]: Make rubber band more visible -* :ghissue:`23132`: [Bug]: call cmap object on torch.tensor will output first element all 0 -* :ghissue:`21349`: [Bug]: Hexbin gridsize interpreted differently for x and y -* :ghissue:`22905`: [Doc]: Duplicated toc entries -* :ghissue:`24094`: [Bug]: macOS: PyPy 3.8 (v7.3.9) threading get_native_id Broken -* :ghissue:`24097`: [Bug]: ax.hist density not auto-scaled when using histtype='step' -* :ghissue:`24148`: remove nose-style test classes -* :ghissue:`24133`: [Bug]: Incorrect crop after constrained layout with equal aspect ratio and bbox_inches = tight -* :ghissue:`24155`: [Bug]: TypeError: int() argument must be a string, a bytes-like object or a number, not 'KeyboardModifier' -* :ghissue:`24127`: [Bug]: ax.bar raises for all-nan data on matplotlib 3.6.1 -* :ghissue:`2959`: artists zorder is ignored during animations -* :ghissue:`24121`: [Doc]: Contour functions: auto-generated levels +Pull Requests (107): + +* :ghpull:`24939`: Backport PR #23390 on branch v3.6.x (FIX: colorbar contour with log norm should default to log locator and formatter...) +* :ghpull:`24936`: Backport PR #24927 on branch v3.6.x (DOC: Remove space after directive name, before double-colon) +* :ghpull:`23390`: FIX: colorbar contour with log norm should default to log locator and formatter... +* :ghpull:`24932`: Backport PR #24783 on branch v3.6.x (inset locator fix with tests added) +* :ghpull:`24783`: inset locator fix with tests added +* :ghpull:`24927`: DOC: Remove space after directive name, before double-colon +* :ghpull:`24881`: Backport PR #24880 on branch v3.6.x (Minor cleanups to named colors example.) +* :ghpull:`24876`: Backport PR #24873 on branch v3.6.x (Copy-edit fonts docs.) +* :ghpull:`24857`: Backport PR #24856 on branch v3.6.x (fix typo) +* :ghpull:`24852`: Backport PR #24843 on branch v3.6.x (Show that fill_between and span_where provide similar functionalities.) +* :ghpull:`24808`: Backport PR #24807 on branch v3.6.x (Axes.stem docstring document orientation as literals) +* :ghpull:`24807`: Axes.stem docstring document orientation as literals +* :ghpull:`24791`: Backport PR #24785 on branch v3.6.x (Fix random generation of single floats) +* :ghpull:`24777`: Backport PR #24772 on branch v3.6.x (Fix Left ventricle bullseye example) +* :ghpull:`24775`: Backport PR #24774 on branch v3.6.x (DOC: fix strip_chart example with numpy 1.24) +* :ghpull:`24765`: Backport PR #24764 on branch v3.6.x (DOC: ``subplot_mosaic`` tutorial - clarify ratios keywords used directly) +* :ghpull:`24739`: Backport PR #24732 on branch v3.6.x (Use masked stack to preserve mask info) +* :ghpull:`24738`: Backport PR #24735 on branch v3.6.x (Correct note about aspect) +* :ghpull:`24732`: Use masked stack to preserve mask info +* :ghpull:`24735`: Correct note about aspect +* :ghpull:`24729`: Backport PR #24715 on branch v3.6.x (Add note that users do not instantiate Axes directly) +* :ghpull:`24715`: Add note that users do not instantiate Axes directly +* :ghpull:`24721`: Backport PR #24607 on branch v3.6.x (DOC: tweak wording on Figure.show warning) +* :ghpull:`24607`: DOC: tweak wording on Figure.show warning +* :ghpull:`24694`: Backport PR #24692 on branch v3.6.x (Avoid rgba8888->argb32 conversion if qt can do it for us.) +* :ghpull:`24692`: Avoid rgba8888->argb32 conversion if qt can do it for us. +* :ghpull:`24684`: Backport PR #24654: Don't manually invalidate cached lines in _update_transScale +* :ghpull:`24687`: Backport PR #24003 on branch v3.6.x (Fix wording and links lifecycle tutorial) +* :ghpull:`24685`: Backport PR #23974 on branch v3.6.x (Fix repeated word typos) +* :ghpull:`24680`: Backport PR #24677 on branch v3.6.x (FIX: do not replace the Axes._children list object) +* :ghpull:`24677`: FIX: do not replace the Axes._children list object +* :ghpull:`24659`: Backport PR #24657 on branch v3.6.x (BUG: Fix bug with mutable input modification) +* :ghpull:`24657`: BUG: Fix bug with mutable input modification +* :ghpull:`24654`: Don't manually invalidate cached lines in _update_transScale. +* :ghpull:`24650`: Backport PR #24645 on branch v3.6.x (Removed 'above' wording from Input hook integration docs (#24632)) +* :ghpull:`24647`: Backport PR #24643 on branch v3.6.x (DOC: annotation coords are not floats) +* :ghpull:`24643`: DOC: annotation coords are not floats +* :ghpull:`24625`: Backport PR #24606: FIX: do not use deprecated API in gtk4 backend +* :ghpull:`24633`: Backport PR #24592 on branch v3.6.x (DOC: Don't try to link paths that are on a different drive) +* :ghpull:`24592`: DOC: Don't try to link paths that are on a different drive +* :ghpull:`24628`: Backport PR #24584 on branch v3.6.x (DOC: add "See Also: draw_idle" reference to pyplot.draw) +* :ghpull:`24584`: DOC: add "See Also: draw_idle" reference to pyplot.draw +* :ghpull:`24601`: Backport PR #24600 on branch v3.6.x (Fix: Gracefully fail the string validator for tuple inputs) +* :ghpull:`24609`: Backport PR #24595 on branch v3.6.x (ci: Stop building wheels on AppVeyor) +* :ghpull:`24616`: Backport PR #24397 on branch v3.6.x (Simplify appveyor to only use conda) +* :ghpull:`24615`: Backport PR #24598 on branch v3.6.x (Check for errors/warnings on failed doc-builds) +* :ghpull:`24606`: FIX: do not use deprecated API in gtk4 backend +* :ghpull:`24612`: Backport PR #23868 on branch v3.6.x (Show errors and warnings in doc CI after build.) +* :ghpull:`24595`: ci: Stop building wheels on AppVeyor +* :ghpull:`24600`: Fix: Gracefully fail the string validator for tuple inputs +* :ghpull:`24593`: Backport PR #24580 on branch v3.6.x (Update the polar transform information in doc #24499) +* :ghpull:`24587`: Backport PR #24579: Add explicit permissions to GitHub Actions +* :ghpull:`24579`: Add explicit permissions to GitHub Actions +* :ghpull:`24561`: Backport PR #24540 on branch v3.6.x (DOC: add note about enabling c++11 support for old gcc) +* :ghpull:`24559`: Backport PR #24299 on branch v3.6.x (Rework style sheet reference example to cycle props) +* :ghpull:`24551`: Backport PR #24548 on branch v3.6.x (DOC: improved the doc for layout_engine.py) +* :ghpull:`24548`: DOC: improved the doc for layout_engine.py +* :ghpull:`24535`: Backport PR #24514 on branch v3.6.x (Fix potential issue in contour) +* :ghpull:`24534`: Backport PR #24521 on branch v3.6.x (Doc: improve spelling and grammar) +* :ghpull:`24533`: Backport PR #24517 on branch v3.6.x (DOC: improve grammar and consistency) +* :ghpull:`24532`: Backport PR #24520 on branch v3.6.x (Doc: Fix grammar and spelling) +* :ghpull:`24514`: Fix potential issue in contour +* :ghpull:`24521`: Doc: improve spelling and grammar +* :ghpull:`24517`: DOC: improve grammar and consistency +* :ghpull:`24520`: Doc: Fix grammar and spelling +* :ghpull:`24515`: Backport PR #24512 on branch v3.6.x (Tweak markup in toolkits tutorials.) +* :ghpull:`24503`: Backport PR #24502 on branch v3.6.x (Remove link from demo_floating_axes title.) +* :ghpull:`24505`: Backport PR #24482 on branch v3.6.x (Use relative frame path in HTMLWriter) +* :ghpull:`24506`: Backport of PR#24488 (Update for pydata-sphinx-theme 0.12.0) +* :ghpull:`24482`: Use relative frame path in HTMLWriter +* :ghpull:`24496`: Backport PR #24495 on branch v3.6.x (Update adding of google analytics key for docs) +* :ghpull:`24495`: Update adding of google analytics key for docs +* :ghpull:`24488`: Update for pydata-sphinx-theme 0.12.0 +* :ghpull:`24485`: Backport PR #24481 on branch v3.6.x (Fix floating-point drift in oscilloscope example) +* :ghpull:`24475`: DOC: Fix examples gallery layout issues +* :ghpull:`24478`: Backport PR #24444 on branch v3.6.x (DOC: AnnotationBbox keyword descriptions) +* :ghpull:`24444`: DOC: AnnotationBbox keyword descriptions +* :ghpull:`24468`: Backport PR #24429 on branch v3.6.x (DOC: Clarify transparency in colors) +* :ghpull:`24466`: Backport PR #24460 on branch v3.6.x (Define autoscale() based on autoscale_None().) +* :ghpull:`24460`: Define autoscale() based on autoscale_None(). +* :ghpull:`24463`: Backport PR #24459 on branch v3.6.x (removed unused variable and fixed text in doc) +* :ghpull:`24459`: removed unused variable and fixed text in doc +* :ghpull:`24458`: Backport PR #24434 on branch v3.6.x (Fix pyplot.figlegend docstring) +* :ghpull:`24434`: Fix pyplot.figlegend docstring +* :ghpull:`24456`: Backport PR #24402 on branch v3.6.x (DOC: Fix title formats in backend api docs) +* :ghpull:`24438`: Backport PR #24435 on branch v3.6.x (Minor improvements to LogLocator docstring) +* :ghpull:`24435`: Minor improvements to LogLocator docstring +* :ghpull:`24426`: Backport PR #24422 on branch v3.6.x (Make QT_API a link in the qt embedding example.) +* :ghpull:`24411`: Backport PR #24407 on branch v3.6.x (Reword "Reordering is not commutative" phrase in tutorial.) +* :ghpull:`24400`: Backport PR #24399 on branch v3.6.x (Fix docstring of Figure.subfigures.) +* :ghpull:`24399`: Fix docstring of Figure.subfigures. +* :ghpull:`24391`: Backport PR #24380 on branch v3.6.x (DOC: Remove the example "Pythonic Matplotlib") +* :ghpull:`24384`: Backport PR #24377 on branch v3.6.x (DOC: Cleanup Spine placement example) +* :ghpull:`24381`: Backport PR #24366 on branch v3.6.x (DOC: Improve Image Slices Viewer example) +* :ghpull:`24382`: Backport PR #24378 on branch v3.6.x (DOC: Cleanup spines usage in examples) +* :ghpull:`24378`: DOC: Cleanup spines usage in examples +* :ghpull:`24366`: DOC: Improve Image Slices Viewer example +* :ghpull:`24370`: Backport PR #24368 on branch v3.6.x (DOC: Install dev dependencies before building matplotlib) +* :ghpull:`24368`: DOC: Install dev dependencies before building matplotlib +* :ghpull:`24365`: Backport PR #24363 on branch v3.6.x (DOC: Fix syntax of suggestion) +* :ghpull:`24358`: Backport PR #24354 on branch v3.6.x (DOC: clarify rc_context resets all rcParams changes) +* :ghpull:`24354`: DOC: clarify rc_context resets all rcParams changes +* :ghpull:`24353`: Backport PR #24343 on branch v3.6.x (Emit "axes not compatible with tight_layout" in a single place.) +* :ghpull:`24343`: Emit "axes not compatible with tight_layout" in a single place. +* :ghpull:`24346`: Backport PR #24344 on branch v3.6.x (Add test for colorbar extend alpha) +* :ghpull:`24344`: Add test for colorbar extend alpha +* :ghpull:`23974`: Fix repeated word typos + +Issues (16): + +* :ghissue:`23389`: [Bug]: Colorbar with log scales wrong format +* :ghissue:`24589`: [Bug]: inset_locator is broken when used with subfigures +* :ghissue:`10160`: Low resolution (dpi problem) with Qt5 backend on new iMac Pro Retina +* :ghissue:`24545`: [Bug]: ``matplotlib.pyplot.scatter`` does not respect mask rules with ``datetime`` +* :ghissue:`24639`: [Bug]: The Axes3D does not work as expected. +* :ghissue:`22169`: [Doc]: figure.show works beyond what is documented +* :ghissue:`23968`: [Bug]: Zoom rubber band lags in larger window +* :ghissue:`24574`: [Bug]: Extension error (sphinx.ext.linkcode) while building docs +* :ghissue:`24602`: ``close_event`` deprecated warning. +* :ghissue:`24518`: [Doc]: ``layout_engine`` description +* :ghissue:`23581`: [BUG]: frame paths relative to the html file when saving an animation to html +* :ghissue:`23976`: [Doc]: Examples Gallery Layout changed to one or two columns +* :ghissue:`24390`: [Doc]: alpha setting for annotation ``TextArea`` +* :ghissue:`24433`: [Doc]: figlegend examples call ``fig.figlegend`` instead of ``plt.figlegend`` or ``fig.legend`` +* :ghissue:`24360`: [ENH]: imshow support for multiple slice image volume +* :ghissue:`24359`: [Bug]: Documentation not so clear that a C/C++-compiler is required to install from source Previous GitHub statistics diff --git a/doc/users/prev_whats_new/github_stats_3.6.2.rst b/doc/users/prev_whats_new/github_stats_3.6.2.rst new file mode 100644 index 000000000000..f633448aeaf1 --- /dev/null +++ b/doc/users/prev_whats_new/github_stats_3.6.2.rst @@ -0,0 +1,151 @@ +.. _github-stats-3-6-2: + +GitHub statistics for 3.6.2 (Nov 02, 2022) +========================================== + +GitHub statistics for 2022/10/08 (tag: v3.6.1) - 2022/11/02 + +These lists are automatically generated, and may be incomplete or contain duplicates. + +We closed 21 issues and merged 86 pull requests. +The full list can be seen `on GitHub `__ + +The following 22 authors contributed 27 commits. + +* Antony Lee +* Carsten Schnober +* dependabot[bot] +* Elliott Sales de Andrade +* hannah +* j1642 +* Jaco Verster +* jacoverster +* Jae-Joon Lee +* Jeffrey Aaron Paul +* jeffreypaul15 +* Jody Klymak +* Kostya Farber +* Kyle Sunden +* Martok +* Muhammad Abdur Rakib +* Oscar Gustafsson +* Pavel Grunt +* Ruth Comer +* Thomas A Caswell +* Tiger Nie +* Tim Hoffmann + +GitHub issues and pull requests: + +Pull Requests (86): + +* :ghpull:`24341`: Backport PR #24301 on branch v3.6.x (Restore get_renderer function in deprecated tight_layout) +* :ghpull:`24301`: Restore get_renderer function in deprecated tight_layout +* :ghpull:`24337`: Backport PR #24238 on branch v3.6.x (Update example and docstring to encourage the use of functools.partial in FuncAnimation) +* :ghpull:`24336`: Backport PR #24335 on branch v3.6.x (Fix missing word in ImageMagickWriter docstring.) +* :ghpull:`20358`: Updates example and docstring to encourage the use of functools.partial in FuncAnimation +* :ghpull:`24238`: Update example and docstring to encourage the use of functools.partial in FuncAnimation +* :ghpull:`24335`: Fix missing word in ImageMagickWriter docstring. +* :ghpull:`24330`: Backport PR #24282 on branch v3.6.x (Fix some minor docstring typos) +* :ghpull:`24323`: Backport PR #24320 on branch v3.6.x (DOC: add warning note to imsave) +* :ghpull:`24282`: Fix some minor docstring typos +* :ghpull:`24327`: Backport PR #24310 on branch v3.6.x (show axes changing in animate decay example) +* :ghpull:`24310`: show axes changing in animate decay example +* :ghpull:`24324`: Backport PR #24259 on branch v3.6.x (Move empty hexbin fix to make_norm_from_scale.) +* :ghpull:`24325`: Backport PR #24095 on branch v3.6.x (nb/webagg: Move mouse events to outer canvas div) +* :ghpull:`24326`: Backport PR #24318 on branch v3.6.x (Bump pypa/cibuildwheel from 2.11.1 to 2.11.2) +* :ghpull:`24318`: Bump pypa/cibuildwheel from 2.11.1 to 2.11.2 +* :ghpull:`24095`: nb/webagg: Move mouse events to outer canvas div +* :ghpull:`24259`: Move empty hexbin fix to make_norm_from_scale. +* :ghpull:`24320`: DOC: add warning note to imsave +* :ghpull:`24297`: Backport PR #24294 on branch v3.6.x (Run test if fontconfig is present) +* :ghpull:`24294`: Run test if fontconfig is present +* :ghpull:`24286`: Backport PR #24284 on branch v3.6.x (Remove comment about cmap from voxels docstring) +* :ghpull:`24284`: Remove comment about cmap from voxels docstring +* :ghpull:`24280`: Backport PR #24145 on branch v3.6.x (Updated Angles on Bracket arrow styles example to make angles clear #23176) +* :ghpull:`24145`: Updated Angles on Bracket arrow styles example to make angles clear #23176 +* :ghpull:`24270`: Backport PR #24265 on branch v3.6.x (Restore (and warn on) seaborn styles in style.library) +* :ghpull:`24271`: Backport PR #24266 on branch v3.6.x (TST: Increase fp tolerance on more tests for new NumPy) +* :ghpull:`24266`: TST: Increase fp tolerance on more tests for new NumPy +* :ghpull:`24265`: Restore (and warn on) seaborn styles in style.library +* :ghpull:`24267`: Backport PR #24261 on branch v3.6.x (Fix pie chart in demo_agg_filter.py) +* :ghpull:`24261`: Fix pie chart in demo_agg_filter.py +* :ghpull:`24258`: Backport PR #24108 on branch v3.6.x (Add 3D plots to plot_types doc page) +* :ghpull:`24108`: Add 3D plots to plot_types doc page +* :ghpull:`24255`: Backport PR #24250 on branch v3.6.x (Fix key reporting in pick events) +* :ghpull:`24250`: Fix key reporting in pick events +* :ghpull:`24237`: Backport PR #24197 on branch v3.6.x (Properly set and inherit backend_version.) +* :ghpull:`24197`: Properly set and inherit backend_version. +* :ghpull:`24234`: Backport PR #23607 on branch v3.6.x (DOC: document that appearance is part of our stable API) +* :ghpull:`24233`: Backport PR #23985 on branch v3.6.x (Improve rubberband rendering in wx and tk) +* :ghpull:`24232`: Backport PR #24096 on branch v3.6.x ([DOC]: Add simple animation scatter plot to the example documentation) +* :ghpull:`24231`: Backport PR #24009 on branch v3.6.x (Fix evaluating colormaps on non-numpy arrays) +* :ghpull:`24230`: Backport PR #24229 on branch v3.6.x (FIX: do not mutate dictionaries passed in by user) +* :ghpull:`23607`: DOC: document that appearance is part of our stable API +* :ghpull:`23985`: Improve rubberband rendering in wx and tk +* :ghpull:`24096`: [DOC]: Add simple animation scatter plot to the example documentation +* :ghpull:`24009`: Fix evaluating colormaps on non-numpy arrays +* :ghpull:`24229`: FIX: do not mutate dictionaries passed in by user +* :ghpull:`24223`: Backport PR #24184 on branch v3.6.x (Add tests for ToolManager) +* :ghpull:`24219`: Backport PR #23995 on branch v3.6.x (DOC: Lowercase some parameter names) +* :ghpull:`23995`: DOC: Lowercase some parameter names +* :ghpull:`24184`: Add tests for ToolManager +* :ghpull:`24211`: Backport PR #24202 on branch v3.6.x (Bump pypa/cibuildwheel from 2.10.2 to 2.11.1) +* :ghpull:`24214`: Backport PR #24169 on branch v3.6.x ([DOC]: added parent link for ``FuncAnimation`` and ``ArtistAnimation``) +* :ghpull:`24169`: [DOC]: add parent link for ``FuncAnimation`` and ``ArtistAnimation`` +* :ghpull:`24202`: Bump pypa/cibuildwheel from 2.10.2 to 2.11.1 +* :ghpull:`24206`: Backport PR #24081 on branch v3.6.x (TST: force test with shared test image to run in serial) +* :ghpull:`24181`: Backport PR #24177 on branch v3.6.x (Don't simplify paths used for autoscaling) +* :ghpull:`24200`: Backport PR #24193 on branch v3.6.x (DOC: Explain gridsize in hexbin()) +* :ghpull:`24201`: Backport PR #24194 on branch v3.6.x (DOC: Improve plot_directive documentation) +* :ghpull:`24194`: DOC: Improve plot_directive documentation +* :ghpull:`24193`: DOC: Explain gridsize in hexbin() +* :ghpull:`24192`: Backport PR #24187 on branch v3.6.x (DOC: Fix toc structure in explain/interactive) +* :ghpull:`24186`: Backport PR #24157 on branch v3.6.x (test only PR milestoning guidance) +* :ghpull:`24187`: DOC: Fix toc structure in explain/interactive +* :ghpull:`24190`: DOC: fix markup +* :ghpull:`24157`: test only PR milestoning guidance +* :ghpull:`24183`: Backport PR #24178 on branch v3.6.x (Fall back to Python-level Thread for GUI warning) +* :ghpull:`24180`: Backport PR #24173 on branch v3.6.x (TST: convert nose-style tests) +* :ghpull:`24178`: Fall back to Python-level Thread for GUI warning +* :ghpull:`24177`: Don't simplify paths used for autoscaling +* :ghpull:`24173`: TST: convert nose-style tests +* :ghpull:`24174`: Backport PR #24171 on branch v3.6.x (Fix example where wrong variable was used) +* :ghpull:`24176`: Backport PR #24167 on branch v3.6.x (FIX: turn off layout engine tightbbox) +* :ghpull:`24167`: FIX: turn off layout engine tightbbox +* :ghpull:`24171`: Fix example where wrong variable was used +* :ghpull:`24172`: Backport PR #24158 on branch v3.6.x (Fix Qt with PySide6 6.4.0) +* :ghpull:`24158`: Fix Qt with PySide6 6.4.0 +* :ghpull:`24165`: Backport PR #24164 on branch v3.6.x (Fix argument order in hist() docstring.) +* :ghpull:`24164`: Fix argument order in hist() docstring. +* :ghpull:`24151`: Backport PR #24149 on branch v3.6.x (FIX: handle input to ax.bar that is all nan) +* :ghpull:`24149`: FIX: handle input to ax.bar that is all nan +* :ghpull:`24146`: Backport PR #24137 on branch v3.6.x (Add note about blitting and zorder in animations) +* :ghpull:`24137`: Add note about blitting and zorder in animations +* :ghpull:`24134`: Backport PR #24130 on branch v3.6.x (DOC: align contour parameter doc with implementation) +* :ghpull:`24130`: DOC: align contour parameter doc with implementation +* :ghpull:`24081`: TST: force test with shared test image to run in serial + +Issues (21): + +* :ghissue:`20326`: FuncAnimation Named Arguments +* :ghissue:`24332`: [Bug]: backend bug in matplotlib==3.6.1 with python3.11 and PySide6==6.4.0.1 +* :ghissue:`24296`: [Doc]: Axes limits not updated in animate decay +* :ghissue:`24089`: [Bug]: Resizing does not work in WebAgg backend in Safari +* :ghissue:`3657`: matplotlib.pyplot.imsave colormaps some grayscale images before saving them +* :ghissue:`24060`: [TST] Upcoming dependency test failures +* :ghissue:`24264`: [Bug]: Setting matplotlib.pyplot.style.library['seaborn-colorblind'] result in key error on matplotlib v3.6.1 +* :ghissue:`23900`: [Doc]: Adding some 3D plots to plot gallery +* :ghissue:`24199`: [Bug]: pick events do not forward mouseevent-key on Linux +* :ghissue:`23969`: [ENH]: Make rubber band more visible +* :ghissue:`23132`: [Bug]: call cmap object on torch.tensor will output first element all 0 +* :ghissue:`21349`: [Bug]: Hexbin gridsize interpreted differently for x and y +* :ghissue:`22905`: [Doc]: Duplicated toc entries +* :ghissue:`24094`: [Bug]: macOS: PyPy 3.8 (v7.3.9) threading get_native_id Broken +* :ghissue:`24097`: [Bug]: ax.hist density not auto-scaled when using histtype='step' +* :ghissue:`24148`: remove nose-style test classes +* :ghissue:`24133`: [Bug]: Incorrect crop after constrained layout with equal aspect ratio and bbox_inches = tight +* :ghissue:`24155`: [Bug]: TypeError: int() argument must be a string, a bytes-like object or a number, not 'KeyboardModifier' +* :ghissue:`24127`: [Bug]: ax.bar raises for all-nan data on matplotlib 3.6.1 +* :ghissue:`2959`: artists zorder is ignored during animations +* :ghissue:`24121`: [Doc]: Contour functions: auto-generated levels From abcbf3d11524fa53b08243bc0aa85dd942439454 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 11 Jan 2023 16:59:52 -0500 Subject: [PATCH 190/194] DOC: Update switcher versions --- doc/_static/switcher.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/_static/switcher.json b/doc/_static/switcher.json index 53ca35b763bc..3a0636e13056 100644 --- a/doc/_static/switcher.json +++ b/doc/_static/switcher.json @@ -1,6 +1,6 @@ [ { - "name": "3.6.2 (stable)", + "name": "3.6.3 (stable)", "version": "stable", "url": "https://matplotlib.org/stable/" }, From c23ccdde6f0f8c071b09a88770e24452f2859e99 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 11 Jan 2023 17:29:27 -0500 Subject: [PATCH 191/194] REL: v3.6.3 This is the third bugfix release of the 3.6.x series. This release contains several bug-fixes and adjustments: * Fix Artist removal from `axes_grid1` Axes classes * Fix `inset_locator` in subfigures * Fix `scatter` on masked arrays with units * Fix colorbar ticks with log norm contours * Fix deprecation warnings in GTK4 backend * Fix using relative paths in `HTMLWriter` * Improve failure message from rcParams string validation for tuple inputs * Improve performance of QtAgg backends * No longer modify `pil_kwargs` argument to `imsave` and `savefig` From dbbd55546790ebc1fcab522843a494424e0fca76 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 11 Jan 2023 17:45:01 -0500 Subject: [PATCH 192/194] BLD: bump branch away from tag So the tarballs from GitHub are stable. From 11878dd10289356dfca9b33fd753022f6eb3944c Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 11 Jan 2023 21:27:59 -0500 Subject: [PATCH 193/194] DOC: Add Zenodo DOI for 3.6.3 --- doc/_static/zenodo_cache/7527665.svg | 35 ++++++++++++++++++++++++++++ doc/users/project/citing.rst | 3 +++ tools/cache_zenodo_svg.py | 1 + 3 files changed, 39 insertions(+) create mode 100644 doc/_static/zenodo_cache/7527665.svg diff --git a/doc/_static/zenodo_cache/7527665.svg b/doc/_static/zenodo_cache/7527665.svg new file mode 100644 index 000000000000..3c3e0b7a8b2a --- /dev/null +++ b/doc/_static/zenodo_cache/7527665.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + DOI + + + DOI + + + 10.5281/zenodo.7527665 + + + 10.5281/zenodo.7527665 + + + \ No newline at end of file diff --git a/doc/users/project/citing.rst b/doc/users/project/citing.rst index b36562014b23..74f9fe13b56f 100644 --- a/doc/users/project/citing.rst +++ b/doc/users/project/citing.rst @@ -29,6 +29,9 @@ By version .. START OF AUTOGENERATED +v3.6.3 + .. image:: ../../_static/zenodo_cache/7527665.svg + :target: https://doi.org/10.5281/zenodo.7527665 v3.6.2 .. image:: ../../_static/zenodo_cache/7275322.svg :target: https://doi.org/10.5281/zenodo.7275322 diff --git a/tools/cache_zenodo_svg.py b/tools/cache_zenodo_svg.py index 88355ddf9be9..8a3c0450d626 100644 --- a/tools/cache_zenodo_svg.py +++ b/tools/cache_zenodo_svg.py @@ -63,6 +63,7 @@ def _get_xdg_cache_dir(): if __name__ == "__main__": data = { + "v3.6.3": "7527665", "v3.6.2": "7275322", "v3.6.1": "7162185", "v3.6.0": "7084615", From 655f616e86e2c0f7724d7c88717d4ac4eb438c57 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Thu, 12 Jan 2023 04:44:59 -0500 Subject: [PATCH 194/194] Add missing 3.6.2 GitHub stats to release notes --- doc/users/release_notes.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/users/release_notes.rst b/doc/users/release_notes.rst index 8e4d8c1d3e63..cd60add5fef1 100644 --- a/doc/users/release_notes.rst +++ b/doc/users/release_notes.rst @@ -18,6 +18,7 @@ Version 3.6 ../api/prev_api_changes/api_changes_3.6.1.rst ../api/prev_api_changes/api_changes_3.6.0.rst github_stats.rst + prev_whats_new/github_stats_3.6.2.rst prev_whats_new/github_stats_3.6.1.rst prev_whats_new/github_stats_3.6.0.rst