diff --git a/.github/workflows/cibuildwheel.yml b/.github/workflows/cibuildwheel.yml
index 79d770d0c8f4..3eddbb402e6a 100644
--- a/.github/workflows/cibuildwheel.yml
+++ b/.github/workflows/cibuildwheel.yml
@@ -24,14 +24,16 @@ permissions:
jobs:
build_sdist:
if: >-
- github.event_name == 'push' ||
- github.event_name == 'pull_request' && (
- (
- github.event.action == 'labeled' &&
- github.event.label.name == 'CI: Run cibuildwheel'
- ) ||
- contains(github.event.pull_request.labels.*.name,
- 'CI: Run cibuildwheel')
+ github.repository == 'matplotlib/matplotlib' && (
+ github.event_name == 'push' ||
+ github.event_name == 'pull_request' && (
+ (
+ github.event.action == 'labeled' &&
+ github.event.label.name == 'CI: Run cibuildwheel'
+ ) ||
+ contains(github.event.pull_request.labels.*.name,
+ 'CI: Run cibuildwheel')
+ )
)
name: Build sdist
runs-on: ubuntu-latest
@@ -78,14 +80,16 @@ jobs:
build_wheels:
if: >-
- github.event_name == 'push' ||
- github.event_name == 'pull_request' && (
- (
- github.event.action == 'labeled' &&
- github.event.label.name == 'CI: Run cibuildwheel'
- ) ||
- contains(github.event.pull_request.labels.*.name,
- 'CI: Run cibuildwheel')
+ github.repository == 'matplotlib/matplotlib' && (
+ github.event_name == 'push' ||
+ github.event_name == 'pull_request' && (
+ (
+ github.event.action == 'labeled' &&
+ github.event.label.name == 'CI: Run cibuildwheel'
+ ) ||
+ contains(github.event.pull_request.labels.*.name,
+ 'CI: Run cibuildwheel')
+ )
)
needs: build_sdist
name: Build wheels on ${{ matrix.os }} for ${{ matrix.cibw_archs }}
@@ -188,7 +192,7 @@ jobs:
if-no-files-found: error
publish:
- if: github.event_name == 'push' && github.ref_type == 'tag'
+ if: github.repository == 'matplotlib/matplotlib' && github.event_name == 'push' && github.ref_type == 'tag'
name: Upload release to PyPI
needs: [build_sdist, build_wheels]
runs-on: ubuntu-latest
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 089b15700f1b..7a15de609834 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -12,6 +12,7 @@ on:
jobs:
analyze:
+ if: github.repository == 'matplotlib/matplotlib'
name: Analyze
runs-on: ubuntu-latest
permissions:
diff --git a/.github/workflows/conflictcheck.yml b/.github/workflows/conflictcheck.yml
index b018101f325c..c9aa036004e7 100644
--- a/.github/workflows/conflictcheck.yml
+++ b/.github/workflows/conflictcheck.yml
@@ -11,6 +11,7 @@ on:
jobs:
main:
+ if: github.repository == 'matplotlib/matplotlib'
runs-on: ubuntu-latest
permissions:
pull-requests: write
diff --git a/doc/_embedded_plots/figure_subplots_adjust.py b/doc/_embedded_plots/figure_subplots_adjust.py
index b4b8d7d32a3d..d32a029fe05d 100644
--- a/doc/_embedded_plots/figure_subplots_adjust.py
+++ b/doc/_embedded_plots/figure_subplots_adjust.py
@@ -1,28 +1,34 @@
import matplotlib.pyplot as plt
-def arrow(p1, p2, **props):
- axs[0, 0].annotate(
- "", p1, p2, xycoords='figure fraction',
- arrowprops=dict(arrowstyle="<->", shrinkA=0, shrinkB=0, **props))
-
-
fig, axs = plt.subplots(2, 2, figsize=(6.5, 4))
fig.set_facecolor('lightblue')
fig.subplots_adjust(0.1, 0.1, 0.9, 0.9, 0.4, 0.4)
+
+overlay = fig.add_axes([0, 0, 1, 1], zorder=100)
+overlay.axis("off")
+xycoords = 'figure fraction'
+arrowprops = dict(arrowstyle="<->", shrinkA=0, shrinkB=0)
+
for ax in axs.flat:
ax.set(xticks=[], yticks=[])
-arrow((0, 0.75), (0.1, 0.75)) # left
-arrow((0.435, 0.75), (0.565, 0.75)) # wspace
-arrow((0.9, 0.75), (1, 0.75)) # right
+overlay.annotate("", (0, 0.75), (0.1, 0.75),
+ xycoords=xycoords, arrowprops=arrowprops) # left
+overlay.annotate("", (0.435, 0.25), (0.565, 0.25),
+ xycoords=xycoords, arrowprops=arrowprops) # wspace
+overlay.annotate("", (0, 0.8), (0.9, 0.8),
+ xycoords=xycoords, arrowprops=arrowprops) # right
fig.text(0.05, 0.7, "left", ha="center")
-fig.text(0.5, 0.7, "wspace", ha="center")
-fig.text(0.95, 0.7, "right", ha="center")
+fig.text(0.5, 0.3, "wspace", ha="center")
+fig.text(0.05, 0.83, "right", ha="center")
-arrow((0.25, 0), (0.25, 0.1)) # bottom
-arrow((0.25, 0.435), (0.25, 0.565)) # hspace
-arrow((0.25, 0.9), (0.25, 1)) # top
-fig.text(0.28, 0.05, "bottom", va="center")
+overlay.annotate("", (0.75, 0), (0.75, 0.1),
+ xycoords=xycoords, arrowprops=arrowprops) # bottom
+overlay.annotate("", (0.25, 0.435), (0.25, 0.565),
+ xycoords=xycoords, arrowprops=arrowprops) # hspace
+overlay.annotate("", (0.8, 0), (0.8, 0.9),
+ xycoords=xycoords, arrowprops=arrowprops) # top
+fig.text(0.65, 0.05, "bottom", va="center")
fig.text(0.28, 0.5, "hspace", va="center")
-fig.text(0.28, 0.95, "top", va="center")
+fig.text(0.82, 0.05, "top", va="center")
diff --git a/doc/_static/zenodo_cache/14940554.svg b/doc/_static/zenodo_cache/14940554.svg
new file mode 100644
index 000000000000..6e7d5c37bf7b
--- /dev/null
+++ b/doc/_static/zenodo_cache/14940554.svg
@@ -0,0 +1,35 @@
+
\ No newline at end of file
diff --git a/doc/_static/zenodo_cache/15375714.svg b/doc/_static/zenodo_cache/15375714.svg
new file mode 100644
index 000000000000..d5e403138561
--- /dev/null
+++ b/doc/_static/zenodo_cache/15375714.svg
@@ -0,0 +1,35 @@
+
\ No newline at end of file
diff --git a/doc/api/prev_api_changes/api_changes_3.5.0/deprecations.rst b/doc/api/prev_api_changes/api_changes_3.5.0/deprecations.rst
index d10da55a97f8..742a18f04072 100644
--- a/doc/api/prev_api_changes/api_changes_3.5.0/deprecations.rst
+++ b/doc/api/prev_api_changes/api_changes_3.5.0/deprecations.rst
@@ -282,7 +282,7 @@ Miscellaneous deprecations
- The *format* parameter of ``dviread.find_tex_file`` is deprecated (with no
replacement).
- ``FancyArrowPatch.get_path_in_displaycoord`` and
- ``ConnectionPath.get_path_in_displaycoord`` are deprecated. The path in
+ ``ConnectionPatch.get_path_in_displaycoord`` are deprecated. The path in
display coordinates can still be obtained, as for other patches, using
``patch.get_transform().transform_path(patch.get_path())``.
- The ``font_manager.win32InstalledFonts`` and
diff --git a/doc/api/prev_api_changes/api_changes_3.7.0/removals.rst b/doc/api/prev_api_changes/api_changes_3.7.0/removals.rst
index 03239be31057..56b3ad5c253e 100644
--- a/doc/api/prev_api_changes/api_changes_3.7.0/removals.rst
+++ b/doc/api/prev_api_changes/api_changes_3.7.0/removals.rst
@@ -323,7 +323,7 @@ Miscellaneous removals
- The *format* parameter of ``dviread.find_tex_file`` is removed (with no
replacement).
- ``FancyArrowPatch.get_path_in_displaycoord`` and
- ``ConnectionPath.get_path_in_displaycoord`` are removed. The path in
+ ``ConnectionPatch.get_path_in_displaycoord`` are removed. The path in
display coordinates can still be obtained, as for other patches, using
``patch.get_transform().transform_path(patch.get_path())``.
- The ``font_manager.win32InstalledFonts`` and
diff --git a/doc/missing-references.json b/doc/missing-references.json
index 1a816d19f7cd..e3b23db6fbc8 100644
--- a/doc/missing-references.json
+++ b/doc/missing-references.json
@@ -261,8 +261,12 @@
"doc/api/_as_gen/mpl_toolkits.axisartist.floating_axes.rst:32::1"
],
"numpy.float64": [
+ "doc/docstring of matplotlib.ft2font.pybind11_detail_function_record_v1_system_libstdcpp_gxx_abi_1xxx_use_cxx11_abi_1.set_text:1",
"doc/docstring of matplotlib.ft2font.PyCapsule.set_text:1"
],
+ "numpy.typing.NDArray": [
+ "doc/docstring of matplotlib.ft2font.pybind11_detail_function_record_v1_system_libstdcpp_gxx_abi_1xxx_use_cxx11_abi_1.set_text:1"
+ ],
"numpy.uint8": [
":1"
]
diff --git a/doc/project/citing.rst b/doc/project/citing.rst
index 2cd317906bb5..8b4c323229ca 100644
--- a/doc/project/citing.rst
+++ b/doc/project/citing.rst
@@ -32,6 +32,12 @@ By version
.. START OF AUTOGENERATED
+v3.10.3
+ .. image:: ../_static/zenodo_cache/15375714.svg
+ :target: https://doi.org/10.5281/zenodo.15375714
+v3.10.1
+ .. image:: ../_static/zenodo_cache/14940554.svg
+ :target: https://doi.org/10.5281/zenodo.14940554
v3.10.0
.. image:: ../_static/zenodo_cache/14464227.svg
:target: https://doi.org/10.5281/zenodo.14464227
diff --git a/doc/users/faq.rst b/doc/users/faq.rst
index 592fff551099..87a1af03d96e 100644
--- a/doc/users/faq.rst
+++ b/doc/users/faq.rst
@@ -281,8 +281,23 @@ locators as desired because the two axes are independent.
Generate images without having a window appear
----------------------------------------------
-Simply do not call `~matplotlib.pyplot.show`, and directly save the figure to
-the desired format::
+The recommended approach since matplotlib 3.1 is to explicitly create a Figure
+instance::
+
+ from matplotlib.figure import Figure
+ fig = Figure()
+ ax = fig.subplots()
+ ax.plot([1, 2, 3])
+ fig.savefig('myfig.png')
+
+This prevents any interaction with GUI frameworks and the window manager.
+
+It's alternatively still possible to use the pyplot interface. Instead of
+calling `matplotlib.pyplot.show`, call `matplotlib.pyplot.savefig`.
+
+Additionally, you must ensure to close the figure after saving it. Not
+closing the figure is a memory leak, because pyplot keeps references
+to all not-yet-shown figures::
import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
diff --git a/galleries/examples/pie_and_polar_charts/polar_demo.py b/galleries/examples/pie_and_polar_charts/polar_demo.py
index e4967079d19d..909fea094be5 100644
--- a/galleries/examples/pie_and_polar_charts/polar_demo.py
+++ b/galleries/examples/pie_and_polar_charts/polar_demo.py
@@ -4,6 +4,11 @@
==========
Demo of a line plot on a polar axis.
+
+The second plot shows the same data, but with the radial axis starting at r=1
+and the angular axis starting at 0 degrees and ending at 225 degrees. Setting
+the origin of the radial axis to 0 allows the radial ticks to be placed at the
+same location as the first plot.
"""
import matplotlib.pyplot as plt
import numpy as np
@@ -11,14 +16,29 @@
r = np.arange(0, 2, 0.01)
theta = 2 * np.pi * r
-fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
+fig, axs = plt.subplots(2, 1, figsize=(5, 8), subplot_kw={'projection': 'polar'},
+ layout='constrained')
+ax = axs[0]
ax.plot(theta, r)
ax.set_rmax(2)
-ax.set_rticks([0.5, 1, 1.5, 2]) # Less radial ticks
+ax.set_rticks([0.5, 1, 1.5, 2]) # Fewer radial ticks
ax.set_rlabel_position(-22.5) # Move radial labels away from plotted line
ax.grid(True)
ax.set_title("A line plot on a polar axis", va='bottom')
+
+ax = axs[1]
+ax.plot(theta, r)
+ax.set_rmax(2)
+ax.set_rmin(1) # Change the radial axis to only go from 1 to 2
+ax.set_rorigin(0) # Set the origin of the radial axis to 0
+ax.set_thetamin(0)
+ax.set_thetamax(225)
+ax.set_rticks([1, 1.5, 2]) # Fewer radial ticks
+ax.set_rlabel_position(-22.5) # Move radial labels away from plotted line
+
+ax.grid(True)
+ax.set_title("Same plot, but with reduced axis limits", va='bottom')
plt.show()
# %%
@@ -32,6 +52,8 @@
# - `matplotlib.projections.polar`
# - `matplotlib.projections.polar.PolarAxes`
# - `matplotlib.projections.polar.PolarAxes.set_rticks`
+# - `matplotlib.projections.polar.PolarAxes.set_rmin`
+# - `matplotlib.projections.polar.PolarAxes.set_rorigin`
# - `matplotlib.projections.polar.PolarAxes.set_rmax`
# - `matplotlib.projections.polar.PolarAxes.set_rlabel_position`
#
diff --git a/lib/matplotlib/_mathtext.py b/lib/matplotlib/_mathtext.py
index 7085a986414e..9e20ea3da9b7 100644
--- a/lib/matplotlib/_mathtext.py
+++ b/lib/matplotlib/_mathtext.py
@@ -2521,10 +2521,10 @@ def subsuper(self, s: str, loc: int, toks: ParseResults) -> T.Any:
if len(new_children):
# remove last kern
if (isinstance(new_children[-1], Kern) and
- hasattr(new_children[-2], '_metrics')):
+ isinstance(new_children[-2], Char)):
new_children = new_children[:-1]
last_char = new_children[-1]
- if hasattr(last_char, '_metrics'):
+ if isinstance(last_char, Char):
last_char.width = last_char._metrics.advance
# create new Hlist without kerning
nucleus = Hlist(new_children, do_kern=False)
@@ -2600,7 +2600,7 @@ def subsuper(self, s: str, loc: int, toks: ParseResults) -> T.Any:
# Do we need to add a space after the nucleus?
# To find out, check the flag set by operatorname
- spaced_nucleus = [nucleus, x]
+ spaced_nucleus: list[Node] = [nucleus, x]
if self._in_subscript_or_superscript:
spaced_nucleus += [self._make_space(self._space_widths[r'\,'])]
self._in_subscript_or_superscript = False
diff --git a/tools/cache_zenodo_svg.py b/tools/cache_zenodo_svg.py
index 3be7d6ca21e4..229e90efeb34 100644
--- a/tools/cache_zenodo_svg.py
+++ b/tools/cache_zenodo_svg.py
@@ -63,6 +63,8 @@ def _get_xdg_cache_dir():
if __name__ == "__main__":
data = {
+ "v3.10.3": "15375714",
+ "v3.10.1": "14940554",
"v3.10.0": "14464227",
"v3.9.4": "14436121",
"v3.9.3": "14249941",