ultraplot 2.1.5__tar.gz → 2.1.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (464) hide show
  1. {ultraplot-2.1.5 → ultraplot-2.1.9}/.github/workflows/build-ultraplot.yml +2 -2
  2. {ultraplot-2.1.5 → ultraplot-2.1.9}/.github/workflows/main.yml +3 -3
  3. {ultraplot-2.1.5 → ultraplot-2.1.9}/.github/workflows/publish-pypi.yml +35 -13
  4. {ultraplot-2.1.5 → ultraplot-2.1.9}/.github/workflows/test-map.yml +2 -2
  5. {ultraplot-2.1.5 → ultraplot-2.1.9}/.pre-commit-config.yaml +1 -1
  6. {ultraplot-2.1.5 → ultraplot-2.1.9}/CITATION.cff +2 -2
  7. {ultraplot-2.1.5/ultraplot.egg-info → ultraplot-2.1.9}/PKG-INFO +1 -1
  8. {ultraplot-2.1.5 → ultraplot-2.1.9}/tools/release/publish_zenodo.py +9 -3
  9. ultraplot-2.1.9/tools/release/sync_citation.py +168 -0
  10. ultraplot-2.1.9/ultraplot/_version.py +1 -0
  11. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/axes/base.py +38 -3
  12. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/axes/plot.py +27 -18
  13. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/axes/plot_types/curved_quiver.py +42 -13
  14. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/figure.py +326 -4
  15. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/gridspec.py +44 -20
  16. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_colorbar.py +56 -0
  17. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_figure.py +407 -0
  18. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_gridspec.py +145 -0
  19. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_plot.py +95 -2
  20. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_release_metadata.py +61 -40
  21. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_ultralayout.py +20 -0
  22. {ultraplot-2.1.5 → ultraplot-2.1.9/ultraplot.egg-info}/PKG-INFO +1 -1
  23. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot.egg-info/SOURCES.txt +1 -1
  24. ultraplot-2.1.5/AGENTS.md +0 -21
  25. ultraplot-2.1.5/ultraplot/_version.py +0 -1
  26. {ultraplot-2.1.5 → ultraplot-2.1.9}/.github/ISSUE_TEMPLATE.md +0 -0
  27. {ultraplot-2.1.5 → ultraplot-2.1.9}/.github/dependabot.yml +0 -0
  28. {ultraplot-2.1.5 → ultraplot-2.1.9}/.github/micromamba-condarc.yml +0 -0
  29. {ultraplot-2.1.5 → ultraplot-2.1.9}/.gitignore +0 -0
  30. {ultraplot-2.1.5 → ultraplot-2.1.9}/.readthedocs.yml +0 -0
  31. {ultraplot-2.1.5 → ultraplot-2.1.9}/CODEOFCONDUCT.md +0 -0
  32. {ultraplot-2.1.5 → ultraplot-2.1.9}/CONTRIBUTING.rst +0 -0
  33. {ultraplot-2.1.5 → ultraplot-2.1.9}/INSTALL.rst +0 -0
  34. {ultraplot-2.1.5 → ultraplot-2.1.9}/LICENSE.txt +0 -0
  35. {ultraplot-2.1.5 → ultraplot-2.1.9}/README.rst +0 -0
  36. {ultraplot-2.1.5 → ultraplot-2.1.9}/UltraPlotLogo.svg +0 -0
  37. {ultraplot-2.1.5 → ultraplot-2.1.9}/codecov.yml +0 -0
  38. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/1dplots.py +0 -0
  39. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/2dplots.py +0 -0
  40. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/Makefile +0 -0
  41. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_ext/notoc.py +0 -0
  42. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_scripts/fetch_releases.py +0 -0
  43. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_static/custom.css +0 -0
  44. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_static/custom.js +0 -0
  45. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_static/example_plots/cartesian_example.svg +0 -0
  46. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_static/example_plots/colorbars_legends_example.svg +0 -0
  47. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_static/example_plots/colormaps_example.svg +0 -0
  48. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_static/example_plots/panels_example.svg +0 -0
  49. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_static/example_plots/projection_example.svg +0 -0
  50. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_static/example_plots/subplot_example.svg +0 -0
  51. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_static/logo_blank.svg +0 -0
  52. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_static/logo_long.png +0 -0
  53. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_static/logo_long.svg +0 -0
  54. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_static/logo_social.png +0 -0
  55. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_static/logo_social.svg +0 -0
  56. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_static/logo_square.png +0 -0
  57. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/_templates/whatsnew_sidebar.html +0 -0
  58. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/about.rst +0 -0
  59. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/api.rst +0 -0
  60. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/basics.py +0 -0
  61. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/cartesian.py +0 -0
  62. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/colorbars_legends.py +0 -0
  63. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/colormaps.py +0 -0
  64. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/colors.py +0 -0
  65. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/conf.py +0 -0
  66. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/configuration.rst +0 -0
  67. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/contributing.rst +0 -0
  68. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/cycles.py +0 -0
  69. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/README.txt +0 -0
  70. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/colors/01_cycle_colormap.py +0 -0
  71. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/colors/02_diverging_colormap.py +0 -0
  72. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/colors/README.txt +0 -0
  73. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/geo/01_robin_tracks.py +0 -0
  74. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/geo/02_orthographic_views.py +0 -0
  75. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/geo/03_projections_features.py +0 -0
  76. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/geo/04_choropleth.py +0 -0
  77. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/geo/README.txt +0 -0
  78. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/layouts/01_shared_axes_abc.py +0 -0
  79. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/layouts/02_complex_layout_insets.py +0 -0
  80. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/layouts/03_spanning_labels.py +0 -0
  81. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/layouts/README.txt +0 -0
  82. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/legends_colorbars/01_multi_colorbars.py +0 -0
  83. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/legends_colorbars/02_legend_inset_colorbar.py +0 -0
  84. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/legends_colorbars/03_semantic_legends.py +0 -0
  85. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/legends_colorbars/README.txt +0 -0
  86. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/plot_types/01_curved_quiver.py +0 -0
  87. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/plot_types/02_network_graph.py +0 -0
  88. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/plot_types/03_lollipop.py +0 -0
  89. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/plot_types/04_datetime_series.py +0 -0
  90. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/plot_types/05_box_violin.py +0 -0
  91. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/plot_types/06_ridge_plot.py +0 -0
  92. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/plot_types/07_radar.py +0 -0
  93. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/plot_types/07_sankey.py +0 -0
  94. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/plot_types/08_chord_diagram.py +0 -0
  95. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/plot_types/08_ternary.py +0 -0
  96. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/plot_types/09_phylogeny.py +0 -0
  97. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/plot_types/10_circos_bed.py +0 -0
  98. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/plot_types/11_topic_ribbon.py +0 -0
  99. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/examples/plot_types/README.txt +0 -0
  100. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/external-links.rst +0 -0
  101. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/faq.rst +0 -0
  102. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/fonts.py +0 -0
  103. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/index.rst +0 -0
  104. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/insets_panels.py +0 -0
  105. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/install.rst +0 -0
  106. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/lazy_loading.rst +0 -0
  107. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/make.bat +0 -0
  108. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/networks.py +0 -0
  109. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/projections.py +0 -0
  110. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/requirements-rtd.txt +0 -0
  111. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/sphinxext/custom_roles.py +0 -0
  112. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/sphinxext/jupytext_cache.py +0 -0
  113. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/stats.py +0 -0
  114. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/subplots.py +0 -0
  115. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/ultraplotrc +0 -0
  116. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/usage.rst +0 -0
  117. {ultraplot-2.1.5 → ultraplot-2.1.9}/docs/why.rst +0 -0
  118. {ultraplot-2.1.5 → ultraplot-2.1.9}/environment.yml +0 -0
  119. {ultraplot-2.1.5 → ultraplot-2.1.9}/logo/PermanentMarker-Regular.ttf +0 -0
  120. {ultraplot-2.1.5 → ultraplot-2.1.9}/logo/environment-logo.yml +0 -0
  121. {ultraplot-2.1.5 → ultraplot-2.1.9}/logo/logo.py +0 -0
  122. {ultraplot-2.1.5 → ultraplot-2.1.9}/logo/run-linter.sh +0 -0
  123. {ultraplot-2.1.5 → ultraplot-2.1.9}/logo/webicon.py +0 -0
  124. {ultraplot-2.1.5 → ultraplot-2.1.9}/logo/whyUltraPlot.svg +0 -0
  125. {ultraplot-2.1.5 → ultraplot-2.1.9}/noxfile.py +0 -0
  126. {ultraplot-2.1.5 → ultraplot-2.1.9}/pyproject.toml +0 -0
  127. {ultraplot-2.1.5 → ultraplot-2.1.9}/requirements-minimal.txt +0 -0
  128. {ultraplot-2.1.5 → ultraplot-2.1.9}/setup.cfg +0 -0
  129. {ultraplot-2.1.5 → ultraplot-2.1.9}/tools/ci/build_test_map.py +0 -0
  130. {ultraplot-2.1.5 → ultraplot-2.1.9}/tools/ci/select_tests.py +0 -0
  131. {ultraplot-2.1.5 → ultraplot-2.1.9}/tools/ci/version_support.py +0 -0
  132. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/__init__.py +0 -0
  133. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/_lazy.py +0 -0
  134. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/axes/__init__.py +0 -0
  135. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/axes/cartesian.py +0 -0
  136. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/axes/container.py +0 -0
  137. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/axes/geo.py +0 -0
  138. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/axes/plot_types/__init__.py +0 -0
  139. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/axes/plot_types/circlize.py +0 -0
  140. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/axes/plot_types/ribbon.py +0 -0
  141. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/axes/plot_types/sankey.py +0 -0
  142. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/axes/polar.py +0 -0
  143. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/axes/shared.py +0 -0
  144. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/axes/three.py +0 -0
  145. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Algae.rgb +0 -0
  146. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Amp.rgb +0 -0
  147. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/BR.rgb +0 -0
  148. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Balance.rgb +0 -0
  149. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Blues1_r.xml +0 -0
  150. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Blues2.xml +0 -0
  151. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Blues3.xml +0 -0
  152. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Blues4_r.xml +0 -0
  153. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Blues5.xml +0 -0
  154. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Blues6.xml +0 -0
  155. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Blues7.xml +0 -0
  156. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Blues8.xml +0 -0
  157. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Blues9.xml +0 -0
  158. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Boreal.json +0 -0
  159. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Browns1.xml +0 -0
  160. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Browns2.xml +0 -0
  161. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Browns3.xml +0 -0
  162. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Browns4.xml +0 -0
  163. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Browns5.xml +0 -0
  164. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Browns6.xml +0 -0
  165. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Browns7.xml +0 -0
  166. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Browns8.xml +0 -0
  167. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Browns9.xml +0 -0
  168. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/ColdHot.rgb +0 -0
  169. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Crest.rgb +0 -0
  170. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Curl.rgb +0 -0
  171. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Deep.rgb +0 -0
  172. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Delta.rgb +0 -0
  173. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Dense.rgb +0 -0
  174. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Div.json +0 -0
  175. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/DryWet.json +0 -0
  176. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Dusk.json +0 -0
  177. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Fire.json +0 -0
  178. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Flare.rgb +0 -0
  179. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Glacial.json +0 -0
  180. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Greens1_r.xml +0 -0
  181. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Greens2.xml +0 -0
  182. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Greens3_r.xml +0 -0
  183. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Greens4.xml +0 -0
  184. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Greens5.xml +0 -0
  185. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Greens6_r.xml +0 -0
  186. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Greens7.xml +0 -0
  187. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Greens8.xml +0 -0
  188. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Haline.rgb +0 -0
  189. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Ice.rgb +0 -0
  190. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/IceFire.rgb +0 -0
  191. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Mako.rgb +0 -0
  192. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Marine.json +0 -0
  193. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Matter.rgb +0 -0
  194. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Mono.txt +0 -0
  195. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/MonoCycle.txt +0 -0
  196. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/NegPos.json +0 -0
  197. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Oranges1.xml +0 -0
  198. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Oranges2.xml +0 -0
  199. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Oranges3.xml +0 -0
  200. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Oranges4.xml +0 -0
  201. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Oxy.rgb +0 -0
  202. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Phase.rgb +0 -0
  203. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Purples1_r.xml +0 -0
  204. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Purples2.xml +0 -0
  205. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Purples3.xml +0 -0
  206. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Reds1.xml +0 -0
  207. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Reds2.xml +0 -0
  208. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Reds3.xml +0 -0
  209. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Reds4.xml +0 -0
  210. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Reds5.xml +0 -0
  211. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Rocket.rgb +0 -0
  212. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Solar.rgb +0 -0
  213. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Speed.rgb +0 -0
  214. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Stellar.json +0 -0
  215. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Sunrise.json +0 -0
  216. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Sunset.json +0 -0
  217. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Tempo.rgb +0 -0
  218. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Thermal.rgb +0 -0
  219. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Turbid.rgb +0 -0
  220. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Vivid.xml +0 -0
  221. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Vlag.rgb +0 -0
  222. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Yellows1.xml +0 -0
  223. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Yellows2.xml +0 -0
  224. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Yellows3.xml +0 -0
  225. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/Yellows4.xml +0 -0
  226. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/acton.txt +0 -0
  227. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/bam.txt +0 -0
  228. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/bamO.txt +0 -0
  229. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/bamako.txt +0 -0
  230. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/batlow.txt +0 -0
  231. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/batlowK.txt +0 -0
  232. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/batlowW.txt +0 -0
  233. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/berlin.txt +0 -0
  234. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/bilbao.txt +0 -0
  235. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/broc.txt +0 -0
  236. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/brocO.txt +0 -0
  237. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/buda.txt +0 -0
  238. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/bukavu.txt +0 -0
  239. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/cork.txt +0 -0
  240. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/corkO.txt +0 -0
  241. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/davos.txt +0 -0
  242. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/devon.txt +0 -0
  243. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/fes.txt +0 -0
  244. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/hawaii.txt +0 -0
  245. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/imola.txt +0 -0
  246. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/lajolla.txt +0 -0
  247. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/lapaz.txt +0 -0
  248. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/lisbon.txt +0 -0
  249. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/nuuk.txt +0 -0
  250. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/oleron.txt +0 -0
  251. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/oslo.txt +0 -0
  252. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/roma.txt +0 -0
  253. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/romaO.txt +0 -0
  254. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/tofino.txt +0 -0
  255. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/tokyo.txt +0 -0
  256. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/turku.txt +0 -0
  257. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/vanimo.txt +0 -0
  258. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/vik.txt +0 -0
  259. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cmaps/vikO.txt +0 -0
  260. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/colorbar.py +0 -0
  261. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/colors/opencolor.txt +0 -0
  262. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/colors/xkcd.txt +0 -0
  263. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/colors.py +0 -0
  264. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/config.py +0 -0
  265. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/constructor.py +0 -0
  266. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cycles/538.hex +0 -0
  267. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cycles/FlatUI.hex +0 -0
  268. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cycles/Qual1.rgb +0 -0
  269. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cycles/Qual2.rgb +0 -0
  270. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cycles/bmh.hex +0 -0
  271. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cycles/classic.hex +0 -0
  272. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cycles/colorblind.hex +0 -0
  273. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cycles/colorblind10.hex +0 -0
  274. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cycles/default.hex +0 -0
  275. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cycles/ggplot.hex +0 -0
  276. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cycles/seaborn.hex +0 -0
  277. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/cycles/tableau.hex +0 -0
  278. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/demos.py +0 -0
  279. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/externals/__init__.py +0 -0
  280. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/externals/hsluv.py +0 -0
  281. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraMath-Bold.ttf +0 -0
  282. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraMath-ExtraLight.ttf +0 -0
  283. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraMath-Heavy.ttf +0 -0
  284. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraMath-Light.ttf +0 -0
  285. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraMath-Medium.ttf +0 -0
  286. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraMath-Regular.ttf +0 -0
  287. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraMath-SemiBold.ttf +0 -0
  288. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraMath-UltraLight.ttf +0 -0
  289. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-Black.ttf +0 -0
  290. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-BlackItalic.ttf +0 -0
  291. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-Bold.ttf +0 -0
  292. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-BoldItalic.ttf +0 -0
  293. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-ExtraBold.ttf +0 -0
  294. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-ExtraBoldItalic.ttf +0 -0
  295. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-ExtraLight.ttf +0 -0
  296. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-ExtraLightItalic.ttf +0 -0
  297. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-Italic.ttf +0 -0
  298. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-Light.ttf +0 -0
  299. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-LightItalic.ttf +0 -0
  300. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-Medium.ttf +0 -0
  301. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-MediumItalic.ttf +0 -0
  302. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-Regular.ttf +0 -0
  303. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-SemiBold.ttf +0 -0
  304. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/FiraSans-SemiBoldItalic.ttf +0 -0
  305. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/LICENSE_FIRAMATH.txt +0 -0
  306. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/LICENSE_FIRASANS.txt +0 -0
  307. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/LICENSE_NOTOSANS.txt +0 -0
  308. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/LICENSE_NOTOSERIF.txt +0 -0
  309. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/LICENSE_OPENSANS.txt +0 -0
  310. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/LICENSE_ROBOTO.txt +0 -0
  311. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/LICENSE_SOURCESANS.txt +0 -0
  312. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/LICENSE_SOURCESERIF.txt +0 -0
  313. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/LICENSE_TEXGYRE.txt +0 -0
  314. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/LICENSE_UBUNTU.txt +0 -0
  315. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/NotoSans-Bold.ttf +0 -0
  316. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/NotoSans-BoldItalic.ttf +0 -0
  317. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/NotoSans-Italic.ttf +0 -0
  318. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/NotoSans-Regular.ttf +0 -0
  319. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/NotoSerif-Bold.ttf +0 -0
  320. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/NotoSerif-BoldItalic.ttf +0 -0
  321. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/NotoSerif-Italic.ttf +0 -0
  322. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/NotoSerif-Regular.ttf +0 -0
  323. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/OpenSans-Bold.ttf +0 -0
  324. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/OpenSans-BoldItalic.ttf +0 -0
  325. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/OpenSans-Italic.ttf +0 -0
  326. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/OpenSans-Regular.ttf +0 -0
  327. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/OpenSans-Semibold.ttf +0 -0
  328. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/OpenSans-SemiboldItalic.ttf +0 -0
  329. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Roboto-Black.ttf +0 -0
  330. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Roboto-BlackItalic.ttf +0 -0
  331. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Roboto-Bold.ttf +0 -0
  332. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Roboto-BoldItalic.ttf +0 -0
  333. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Roboto-Italic.ttf +0 -0
  334. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Roboto-Light.ttf +0 -0
  335. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Roboto-LightItalic.ttf +0 -0
  336. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Roboto-Medium.ttf +0 -0
  337. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Roboto-MediumItalic.ttf +0 -0
  338. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Roboto-Regular.ttf +0 -0
  339. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSansPro-Black.ttf +0 -0
  340. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSansPro-BlackItalic.ttf +0 -0
  341. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSansPro-Bold.ttf +0 -0
  342. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSansPro-BoldItalic.ttf +0 -0
  343. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSansPro-ExtraLight.ttf +0 -0
  344. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSansPro-ExtraLightItalic.ttf +0 -0
  345. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSansPro-Italic.ttf +0 -0
  346. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSansPro-Light.ttf +0 -0
  347. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSansPro-LightItalic.ttf +0 -0
  348. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSansPro-Regular.ttf +0 -0
  349. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSansPro-SemiBold.ttf +0 -0
  350. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSansPro-SemiBoldItalic.ttf +0 -0
  351. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSerifPro-Black.ttf +0 -0
  352. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSerifPro-BlackItalic.ttf +0 -0
  353. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSerifPro-Bold.ttf +0 -0
  354. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSerifPro-BoldItalic.ttf +0 -0
  355. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSerifPro-ExtraLight.ttf +0 -0
  356. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSerifPro-ExtraLightItalic.ttf +0 -0
  357. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSerifPro-Italic.ttf +0 -0
  358. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSerifPro-Light.ttf +0 -0
  359. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSerifPro-LightItalic.ttf +0 -0
  360. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSerifPro-Regular.ttf +0 -0
  361. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSerifPro-SemiBold.ttf +0 -0
  362. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/SourceSerifPro-SemiBoldItalic.ttf +0 -0
  363. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Ubuntu-Bold.ttf +0 -0
  364. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Ubuntu-BoldItalic.ttf +0 -0
  365. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Ubuntu-Italic.ttf +0 -0
  366. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Ubuntu-Light.ttf +0 -0
  367. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Ubuntu-LightItalic.ttf +0 -0
  368. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Ubuntu-Medium.ttf +0 -0
  369. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Ubuntu-MediumItalic.ttf +0 -0
  370. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/Ubuntu-Regular.ttf +0 -0
  371. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyreadventor-bold.ttf +0 -0
  372. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyreadventor-bolditalic.ttf +0 -0
  373. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyreadventor-italic.ttf +0 -0
  374. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyreadventor-regular.ttf +0 -0
  375. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyrebonum-bold.ttf +0 -0
  376. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyrebonum-bolditalic.ttf +0 -0
  377. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyrebonum-italic.ttf +0 -0
  378. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyrebonum-regular.ttf +0 -0
  379. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyrechorus-mediumitalic.ttf +0 -0
  380. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyrecursor-bold.ttf +0 -0
  381. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyrecursor-bolditalic.ttf +0 -0
  382. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyrecursor-italic.ttf +0 -0
  383. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyrecursor-regular.ttf +0 -0
  384. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyreheros-bold.ttf +0 -0
  385. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyreheros-bolditalic.ttf +0 -0
  386. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyreheros-italic.ttf +0 -0
  387. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyreheros-regular.ttf +0 -0
  388. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyrepagella-bold.ttf +0 -0
  389. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyrepagella-bolditalic.ttf +0 -0
  390. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyrepagella-italic.ttf +0 -0
  391. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyrepagella-regular.ttf +0 -0
  392. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyreschola-bold.ttf +0 -0
  393. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyreschola-bolditalic.ttf +0 -0
  394. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyreschola-italic.ttf +0 -0
  395. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyreschola-regular.ttf +0 -0
  396. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyretermes-bold.ttf +0 -0
  397. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyretermes-bolditalic.ttf +0 -0
  398. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyretermes-italic.ttf +0 -0
  399. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/fonts/texgyretermes-regular.ttf +0 -0
  400. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/internals/__init__.py +0 -0
  401. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/internals/benchmarks.py +0 -0
  402. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/internals/context.py +0 -0
  403. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/internals/docstring.py +0 -0
  404. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/internals/fonts.py +0 -0
  405. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/internals/guides.py +0 -0
  406. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/internals/inputs.py +0 -0
  407. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/internals/labels.py +0 -0
  408. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/internals/rcsetup.py +0 -0
  409. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/internals/versions.py +0 -0
  410. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/internals/warnings.py +0 -0
  411. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/legend.py +0 -0
  412. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/proj.py +0 -0
  413. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/scale.py +0 -0
  414. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/__init__.py +0 -0
  415. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/conftest.py +0 -0
  416. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_1dplots.py +0 -0
  417. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_2dplots.py +0 -0
  418. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_animation.py +0 -0
  419. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_axes.py +0 -0
  420. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_axes_base_colorbar_helpers.py +0 -0
  421. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_base.py +0 -0
  422. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_circlize_integration.py +0 -0
  423. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_colorbar_helpers_extra.py +0 -0
  424. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_colormap.py +0 -0
  425. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_colormap_helpers_extra.py +0 -0
  426. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_colors.py +0 -0
  427. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_colors_helpers.py +0 -0
  428. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_config.py +0 -0
  429. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_config_helpers_extra.py +0 -0
  430. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_constructor.py +0 -0
  431. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_constructor_helpers_extra.py +0 -0
  432. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_core_versions.py +0 -0
  433. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_demos.py +0 -0
  434. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_docs.py +0 -0
  435. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_external_axes_container_integration.py +0 -0
  436. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_external_container_edge_cases.py +0 -0
  437. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_external_container_mocked.py +0 -0
  438. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_fonts.py +0 -0
  439. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_format.py +0 -0
  440. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_geographic.py +0 -0
  441. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_handlers.py +0 -0
  442. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_imports.py +0 -0
  443. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_imshow.py +0 -0
  444. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_inputs.py +0 -0
  445. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_inputs_helpers.py +0 -0
  446. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_inset.py +0 -0
  447. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_integration.py +0 -0
  448. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_legend.py +0 -0
  449. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_proj_helpers.py +0 -0
  450. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_projections.py +0 -0
  451. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_rcsetup_helpers.py +0 -0
  452. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_scale_helpers.py +0 -0
  453. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_statistical_plotting.py +0 -0
  454. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_subplots.py +0 -0
  455. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_text_helpers.py +0 -0
  456. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/tests/test_tickers.py +0 -0
  457. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/text.py +0 -0
  458. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/ticker.py +0 -0
  459. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/ui.py +0 -0
  460. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/ultralayout.py +0 -0
  461. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot/utils.py +0 -0
  462. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot.egg-info/dependency_links.txt +0 -0
  463. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot.egg-info/requires.txt +0 -0
  464. {ultraplot-2.1.5 → ultraplot-2.1.9}/ultraplot.egg-info/top_level.txt +0 -0
@@ -53,7 +53,7 @@ jobs:
53
53
  with:
54
54
  fetch-depth: 0
55
55
 
56
- - uses: mamba-org/setup-micromamba@v2.0.7
56
+ - uses: mamba-org/setup-micromamba@v3.0.0
57
57
  with:
58
58
  environment-file: ./environment.yml
59
59
  init-shell: bash
@@ -100,7 +100,7 @@ jobs:
100
100
 
101
101
  - uses: actions/checkout@v6
102
102
 
103
- - uses: mamba-org/setup-micromamba@v2.0.7
103
+ - uses: mamba-org/setup-micromamba@v3.0.0
104
104
  with:
105
105
  environment-file: ./environment.yml
106
106
  init-shell: bash
@@ -50,7 +50,7 @@ jobs:
50
50
 
51
51
  - name: Build test map on cache miss
52
52
  if: steps.restore-map.outputs.cache-hit != 'true'
53
- uses: mamba-org/setup-micromamba@v2.0.7
53
+ uses: mamba-org/setup-micromamba@v3.0.0
54
54
  with:
55
55
  environment-file: ./environment.yml
56
56
  init-shell: bash
@@ -157,7 +157,7 @@ jobs:
157
157
  with:
158
158
  fetch-depth: 0
159
159
 
160
- - uses: mamba-org/setup-micromamba@v2.0.7
160
+ - uses: mamba-org/setup-micromamba@v3.0.0
161
161
  with:
162
162
  environment-file: ./environment.yml
163
163
  init-shell: bash
@@ -182,7 +182,7 @@ jobs:
182
182
  ultraplot/tests
183
183
 
184
184
  - name: Upload coverage reports to Codecov
185
- uses: codecov/codecov-action@v5
185
+ uses: codecov/codecov-action@v6
186
186
  with:
187
187
  token: ${{ secrets.CODECOV_TOKEN }}
188
188
  files: ./coverage.xml
@@ -1,11 +1,13 @@
1
1
  name: Publish to PyPI
2
+
2
3
  on:
3
4
  pull_request:
4
5
  push:
5
- tags: ["v*"]
6
+ tags:
7
+ - "v*"
6
8
 
7
9
  concurrency:
8
- group: publish-pypi-{{ github.sha }}
10
+ group: publish-pypi-${{ github.sha }}
9
11
  cancel-in-progress: false
10
12
 
11
13
  jobs:
@@ -17,22 +19,25 @@ jobs:
17
19
  with:
18
20
  fetch-depth: 0
19
21
 
20
- - name: Get tags
21
- run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*
22
- shell: bash
23
-
24
22
  - uses: actions/setup-python@v6
25
23
  with:
26
24
  python-version: "3.12"
27
25
 
26
+ - name: Ensure clean tree before build
27
+ run: |
28
+ git diff --quiet || (git status --short && git diff && exit 1)
29
+ shell: bash
30
+
28
31
  - name: Build package
29
32
  run: |
30
- python -m pip install --upgrade pip wheel setuptools setuptools_scm build twine
33
+ python -m pip install --upgrade pip
34
+ python -m pip install wheel setuptools setuptools_scm build twine
31
35
  python -m build --sdist --wheel . --outdir dist
36
+ shell: bash
32
37
 
33
38
  - name: Check files
34
39
  run: |
35
- ls dist
40
+ ls -lah dist
36
41
  shell: bash
37
42
 
38
43
  - name: Test wheels
@@ -78,7 +83,7 @@ jobs:
78
83
 
79
84
  - name: Check files
80
85
  run: |
81
- ls dist
86
+ ls -lah dist
82
87
  shell: bash
83
88
 
84
89
  - name: Publish to TestPyPI
@@ -91,11 +96,11 @@ jobs:
91
96
  publish-pypi:
92
97
  name: Publish to PyPI
93
98
  needs: publish-pypi-test
99
+ if: github.event_name == 'push'
94
100
  environment:
95
101
  name: prod
96
102
  url: https://pypi.org/project/ultraplot/
97
103
  runs-on: ubuntu-latest
98
- if: github.event_name == 'push'
99
104
  permissions:
100
105
  id-token: write
101
106
  contents: read
@@ -108,7 +113,7 @@ jobs:
108
113
 
109
114
  - name: Check files
110
115
  run: |
111
- ls dist
116
+ ls -lah dist
112
117
  shell: bash
113
118
 
114
119
  - name: Publish to PyPI
@@ -141,6 +146,8 @@ jobs:
141
146
  ZENODO_ACCESS_TOKEN: ${{ secrets.ZENODO_ACCESS_TOKEN }}
142
147
  steps:
143
148
  - uses: actions/checkout@v6
149
+ with:
150
+ fetch-depth: 0
144
151
 
145
152
  - uses: actions/setup-python@v6
146
153
  with:
@@ -148,7 +155,8 @@ jobs:
148
155
 
149
156
  - name: Install release tooling
150
157
  run: |
151
- python -m pip install --upgrade pip PyYAML
158
+ python -m pip install --upgrade pip
159
+ python -m pip install PyYAML
152
160
  shell: bash
153
161
 
154
162
  - name: Download artifacts
@@ -157,7 +165,21 @@ jobs:
157
165
  name: dist-${{ github.sha }}-${{ github.run_id }}-${{ github.run_number }}
158
166
  path: dist
159
167
 
168
+ - name: Generate release citation metadata
169
+ run: |
170
+ python tools/release/sync_citation.py \
171
+ --tag "${GITHUB_REF_NAME}" \
172
+ --output "${RUNNER_TEMP}/CITATION.cff"
173
+ shell: bash
174
+
175
+ - name: Check tree stayed clean
176
+ run: |
177
+ git diff --quiet || (git status --short && git diff && exit 1)
178
+ shell: bash
179
+
160
180
  - name: Publish to Zenodo
161
181
  run: |
162
- python tools/release/publish_zenodo.py --dist-dir dist
182
+ python tools/release/publish_zenodo.py \
183
+ --dist-dir dist \
184
+ --citation-file "${RUNNER_TEMP}/CITATION.cff"
163
185
  shell: bash
@@ -23,7 +23,7 @@ jobs:
23
23
  with:
24
24
  fetch-depth: 0
25
25
 
26
- - uses: mamba-org/setup-micromamba@v2.0.7
26
+ - uses: mamba-org/setup-micromamba@v3.0.0
27
27
  with:
28
28
  environment-file: ./environment.yml
29
29
  init-shell: bash
@@ -48,7 +48,7 @@ jobs:
48
48
  python tools/ci/build_test_map.py --coverage-file .coverage --output .ci/test-map.json --root .
49
49
 
50
50
  - name: Upload coverage reports to Codecov
51
- uses: codecov/codecov-action@v5
51
+ uses: codecov/codecov-action@v6
52
52
  with:
53
53
  token: ${{ secrets.CODECOV_TOKEN }}
54
54
  files: ./coverage.xml
@@ -11,6 +11,6 @@ ci:
11
11
 
12
12
  repos:
13
13
  - repo: https://github.com/psf/black-pre-commit-mirror
14
- rev: 26.1.0
14
+ rev: 26.3.1
15
15
  hooks:
16
16
  - id: black
@@ -8,8 +8,8 @@ authors:
8
8
  - family-names: "Becker"
9
9
  given-names: "Matthew R."
10
10
  orcid: "https://orcid.org/0000-0001-7774-2246"
11
- date-released: "2026-03-11"
12
- version: "2.1.3"
11
+ date-released: "2026-03-30"
12
+ version: "2.1.5"
13
13
  doi: "10.5281/zenodo.15733564"
14
14
  repository-code: "https://github.com/Ultraplot/UltraPlot"
15
15
  license: "MIT"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultraplot
3
- Version: 2.1.5
3
+ Version: 2.1.9
4
4
  Summary: A succinct matplotlib wrapper for making beautiful, publication-quality graphics.
5
5
  Author-email: Casper van Elteren <caspervanelteren@gmail.com>, Luke Davis <lukelbd@gmail.com>
6
6
  Maintainer-email: Casper van Elteren <caspervanelteren@gmail.com>, "Matthew R. Becker" <becker.mr@gmail.com>
@@ -3,7 +3,6 @@ from __future__ import annotations
3
3
 
4
4
  import argparse
5
5
  import json
6
- import mimetypes
7
6
  import os
8
7
  import sys
9
8
  from pathlib import Path
@@ -43,6 +42,12 @@ def parse_args() -> argparse.Namespace:
43
42
  default=Path("CITATION.cff"),
44
43
  help="Path to the repository CITATION.cff file.",
45
44
  )
45
+ parser.add_argument(
46
+ "--citation-file",
47
+ type=Path,
48
+ default=Path("CITATION.cff"),
49
+ help="Path to the citation metadata file to upload.",
50
+ )
46
51
  parser.add_argument(
47
52
  "--pyproject",
48
53
  type=Path,
@@ -244,14 +249,15 @@ def upload_dist_files(draft: dict, token: str, dist_dir: Path) -> None:
244
249
  for path in sorted(dist_dir.iterdir()):
245
250
  if not path.is_file():
246
251
  continue
247
- content_type = mimetypes.guess_type(path.name)[0] or "application/octet-stream"
248
252
  with path.open("rb") as handle:
249
253
  api_request(
250
254
  "PUT",
251
255
  f"{bucket_url}/{parse.quote(path.name)}",
252
256
  token=token,
253
257
  data=handle.read(),
254
- content_type=content_type,
258
+ # Zenodo bucket uploads reject extension-specific types like
259
+ # application/gzip for source tarballs and require raw bytes.
260
+ content_type="application/octet-stream",
255
261
  )
256
262
  print(f"Uploaded {path.name} to Zenodo draft {draft['id']}.")
257
263
 
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env python3
2
+ from __future__ import annotations
3
+
4
+ import argparse
5
+ import re
6
+ import subprocess
7
+ from pathlib import Path
8
+
9
+
10
+ def parse_args() -> argparse.Namespace:
11
+ parser = argparse.ArgumentParser(
12
+ description="Sync CITATION.cff release metadata from a git tag."
13
+ )
14
+ parser.add_argument(
15
+ "--tag",
16
+ required=True,
17
+ help="Release tag to sync from, for example v2.1.5 or refs/tags/v2.1.5.",
18
+ )
19
+ parser.add_argument(
20
+ "--citation",
21
+ type=Path,
22
+ default=Path("CITATION.cff"),
23
+ help="Path to the source CITATION.cff file.",
24
+ )
25
+ parser.add_argument(
26
+ "--output",
27
+ type=Path,
28
+ default=None,
29
+ help=(
30
+ "Optional output path for the synced citation file. "
31
+ "Defaults to overwriting --citation."
32
+ ),
33
+ )
34
+ parser.add_argument(
35
+ "--date",
36
+ help="Explicit release date in YYYY-MM-DD format. Defaults to the git tag date.",
37
+ )
38
+ parser.add_argument(
39
+ "--check",
40
+ action="store_true",
41
+ help="Validate the file contents instead of writing them.",
42
+ )
43
+ return parser.parse_args()
44
+
45
+
46
+ def normalize_tag(tag: str) -> str:
47
+ return tag.strip().removeprefix("refs/tags/")
48
+
49
+
50
+ def tag_version(tag: str) -> str:
51
+ tag = normalize_tag(tag)
52
+ if not tag.startswith("v"):
53
+ raise ValueError(f"Release tag must start with 'v', got {tag!r}.")
54
+ return tag.removeprefix("v")
55
+
56
+
57
+ def resolve_release_date(tag: str, repo_root: Path) -> str:
58
+ result = subprocess.run(
59
+ [
60
+ "git",
61
+ "for-each-ref",
62
+ f"refs/tags/{normalize_tag(tag)}",
63
+ "--format=%(creatordate:short)",
64
+ ],
65
+ check=True,
66
+ cwd=repo_root,
67
+ capture_output=True,
68
+ text=True,
69
+ )
70
+ value = result.stdout.strip()
71
+ if not value:
72
+ raise ValueError(f"Could not resolve a release date for tag {tag!r}.")
73
+ return value
74
+
75
+
76
+ def replace_scalar(text: str, key: str, value: str) -> str:
77
+ pattern = rf'^(?P<prefix>{re.escape(key)}:\s*)"[^"]*"\s*$'
78
+ updated, count = re.subn(
79
+ pattern,
80
+ rf'\g<prefix>"{value}"',
81
+ text,
82
+ count=1,
83
+ flags=re.MULTILINE,
84
+ )
85
+ if count != 1:
86
+ raise ValueError(f"Missing quoted scalar {key!r} in CITATION metadata.")
87
+ return updated
88
+
89
+
90
+ def build_synced_citation(
91
+ citation_path: Path,
92
+ *,
93
+ tag: str,
94
+ release_date: str | None = None,
95
+ repo_root: Path | None = None,
96
+ ) -> tuple[str, str, bool]:
97
+ repo_root = repo_root or citation_path.resolve().parent
98
+ version = tag_version(tag)
99
+ release_date = release_date or resolve_release_date(tag, repo_root)
100
+
101
+ original = citation_path.read_text(encoding="utf-8")
102
+ updated = replace_scalar(original, "version", version)
103
+ updated = replace_scalar(updated, "date-released", release_date)
104
+ changed = updated != original
105
+ return original, updated, changed
106
+
107
+
108
+ def sync_citation(
109
+ citation_path: Path,
110
+ *,
111
+ tag: str,
112
+ output_path: Path | None = None,
113
+ release_date: str | None = None,
114
+ repo_root: Path | None = None,
115
+ check: bool = False,
116
+ ) -> bool:
117
+ original, updated, changed = build_synced_citation(
118
+ citation_path,
119
+ tag=tag,
120
+ release_date=release_date,
121
+ repo_root=repo_root,
122
+ )
123
+
124
+ if check:
125
+ if changed:
126
+ raise SystemExit(
127
+ f"{citation_path} is out of date for {normalize_tag(tag)}. "
128
+ "Run tools/release/sync_citation.py before releasing."
129
+ )
130
+ return False
131
+
132
+ destination = output_path or citation_path
133
+ destination.parent.mkdir(parents=True, exist_ok=True)
134
+ destination.write_text(updated, encoding="utf-8")
135
+ return changed
136
+
137
+
138
+ def main() -> int:
139
+ args = parse_args()
140
+ destination = args.output or args.citation
141
+
142
+ changed = sync_citation(
143
+ args.citation,
144
+ tag=args.tag,
145
+ output_path=args.output,
146
+ release_date=args.date,
147
+ repo_root=Path.cwd(),
148
+ check=args.check,
149
+ )
150
+
151
+ if args.check:
152
+ print(f"Validated {args.citation} for {normalize_tag(args.tag)}.")
153
+ else:
154
+ source = args.citation.resolve()
155
+ dest = destination.resolve()
156
+ if source == dest:
157
+ print(f"Updated {args.citation} for {normalize_tag(args.tag)}.")
158
+ else:
159
+ print(
160
+ f"Wrote synced citation metadata from {args.citation} "
161
+ f"to {destination} for {normalize_tag(args.tag)}."
162
+ )
163
+
164
+ return 0
165
+
166
+
167
+ if __name__ == "__main__":
168
+ raise SystemExit(main())
@@ -0,0 +1 @@
1
+ __version__ = '2.1.9'
@@ -2459,7 +2459,20 @@ class Axes(_ExternalModeMixin, maxes.Axes):
2459
2459
  ncols=gs.ncols_total
2460
2460
  )
2461
2461
 
2462
+ # Check if the panel has a span override (spans more columns/rows
2463
+ # than its parent). When it does, use the SubplotSpec position for
2464
+ # the "along" dimension so the span is respected. Otherwise use
2465
+ # parent_bbox which correctly tracks aspect-ratio adjustments.
2466
+ parent_ss = self._panel_parent.get_subplotspec().get_topmost_subplotspec()
2467
+ p_row1, p_row2, p_col1, p_col2 = parent_ss._get_rows_columns(
2468
+ ncols=gs.ncols_total
2469
+ )
2470
+
2462
2471
  if side in ("right", "left"):
2472
+ has_span_override = (row1 < p_row1) or (row2 > p_row2)
2473
+ along_bbox = (
2474
+ ss.get_position(self.figure) if has_span_override else parent_bbox
2475
+ )
2463
2476
  boundary = None
2464
2477
  width = sum(gs._wratios_total[col1 : col2 + 1]) / figwidth
2465
2478
  if a_col2 < col1:
@@ -2480,9 +2493,13 @@ class Axes(_ExternalModeMixin, maxes.Axes):
2480
2493
  else:
2481
2494
  x0 = anchor_bbox.x0 - pad - width
2482
2495
  bbox = mtransforms.Bbox.from_bounds(
2483
- x0, parent_bbox.y0, width, parent_bbox.height
2496
+ x0, along_bbox.y0, width, along_bbox.height
2484
2497
  )
2485
2498
  else:
2499
+ has_span_override = (col1 < p_col1) or (col2 > p_col2)
2500
+ along_bbox = (
2501
+ ss.get_position(self.figure) if has_span_override else parent_bbox
2502
+ )
2486
2503
  boundary = None
2487
2504
  height = sum(gs._hratios_total[row1 : row2 + 1]) / figheight
2488
2505
  if a_row2 < row1:
@@ -2502,7 +2519,7 @@ class Axes(_ExternalModeMixin, maxes.Axes):
2502
2519
  else:
2503
2520
  y0 = anchor_bbox.y0 - pad - height
2504
2521
  bbox = mtransforms.Bbox.from_bounds(
2505
- parent_bbox.x0, y0, parent_bbox.width, height
2522
+ along_bbox.x0, y0, along_bbox.width, height
2506
2523
  )
2507
2524
  setter(bbox)
2508
2525
 
@@ -3191,13 +3208,31 @@ class Axes(_ExternalModeMixin, maxes.Axes):
3191
3208
  # Perform extra post-processing steps
3192
3209
  # NOTE: This should be updated alongside draw(). We also cache the resulting
3193
3210
  # bounding box to speed up tight layout calculations (see _range_tightbbox).
3211
+ include_subset_titles = kwargs.pop("include_subset_titles", True)
3194
3212
  self._add_queued_guides()
3195
3213
  self._apply_title_above()
3196
3214
  if self._colorbar_fill:
3197
3215
  self._colorbar_fill.update_ticks(manual_only=True) # only if needed
3198
3216
  if self._inset_parent is not None and self._inset_zoom:
3199
3217
  self.indicate_inset_zoom()
3200
- self._tight_bbox = super().get_tightbbox(renderer, *args, **kwargs)
3218
+ bbox = super().get_tightbbox(renderer, *args, **kwargs)
3219
+ fig = self.figure
3220
+ if (
3221
+ bbox is not None
3222
+ and fig is not None
3223
+ and self._panel_parent is None
3224
+ and include_subset_titles
3225
+ and hasattr(fig, "_get_subset_title_bbox")
3226
+ ):
3227
+ title_bbox = fig._get_subset_title_bbox(self, renderer)
3228
+ if title_bbox is not None:
3229
+ bbox = mtransforms.Bbox.from_extents(
3230
+ bbox.xmin,
3231
+ min(bbox.ymin, title_bbox.ymin),
3232
+ bbox.xmax,
3233
+ max(bbox.ymax, title_bbox.ymax),
3234
+ )
3235
+ self._tight_bbox = bbox
3201
3236
  return self._tight_bbox
3202
3237
 
3203
3238
  def get_default_bbox_extra_artists(self):
@@ -193,6 +193,8 @@ linewidth : float or 2D array, optional
193
193
  Width of streamlines.
194
194
  cmap, norm : optional
195
195
  Colormap and normalization for array colors.
196
+ colorbar, colorbar_kw : optional
197
+ Add a colorbar for array-valued streamline colors.
196
198
  arrowsize : float, optional
197
199
  Arrow size scaling.
198
200
  arrowstyle : str, optional
@@ -1918,6 +1920,8 @@ class PlotAxes(base.Axes):
1918
1920
  grains: Optional[int] = None,
1919
1921
  density: Optional[int] = None,
1920
1922
  arrow_at_end: Optional[bool] = None,
1923
+ colorbar: Optional[str] = None,
1924
+ colorbar_kw: Optional[dict[str, Any]] = None,
1921
1925
  ):
1922
1926
  """
1923
1927
  %(plot.curved_quiver)s
@@ -1935,6 +1939,7 @@ class PlotAxes(base.Axes):
1935
1939
  zorder = _not_none(zorder, mlines.Line2D.zorder)
1936
1940
  transform = _not_none(transform, self.transData)
1937
1941
  color = _not_none(color, self._get_lines.get_next_color())
1942
+ colorbar_kw = colorbar_kw or {}
1938
1943
  linewidth = _not_none(linewidth, rc["lines.linewidth"])
1939
1944
  scale = _not_none(scale, rc["curved_quiver.scale"])
1940
1945
  grains = _not_none(grains, rc["curved_quiver.grains"])
@@ -1968,6 +1973,7 @@ class PlotAxes(base.Axes):
1968
1973
  raise ValueError(
1969
1974
  "If 'linewidth' is given, must have the shape of 'Grid(x,y)'"
1970
1975
  )
1976
+ linewidth = np.ma.masked_invalid(linewidth)
1971
1977
  line_kw["linewidth"] = []
1972
1978
  else:
1973
1979
  line_kw["linewidth"] = linewidth
@@ -1990,7 +1996,6 @@ class PlotAxes(base.Axes):
1990
1996
 
1991
1997
  integrate = solver.get_integrator(u, v, minlength, resolution, magnitude)
1992
1998
  trajectories = []
1993
- edges = []
1994
1999
 
1995
2000
  if start_points is None:
1996
2001
  start_points = solver.gen_starting_points(x, y, grains)
@@ -2026,18 +2031,19 @@ class PlotAxes(base.Axes):
2026
2031
 
2027
2032
  for xs, ys in sp2:
2028
2033
  xg, yg = solver.domain_map.data2grid(xs, ys)
2029
- t = integrate(xg, yg)
2030
- if t is not None:
2031
- trajectories.append(t[0])
2032
- edges.append(t[1])
2034
+ trajectory = integrate(xg, yg)
2035
+ if trajectory is not None:
2036
+ trajectories.append(trajectory)
2033
2037
  streamlines = []
2034
2038
  arrows = []
2035
- for t, edge in zip(trajectories, edges):
2036
- tgx = np.array(t[0])
2037
- tgy = np.array(t[1])
2039
+ for trajectory in trajectories:
2040
+ tgx = np.array(trajectory.x)
2041
+ tgy = np.array(trajectory.y)
2038
2042
 
2039
2043
  # Rescale from grid-coordinates to data-coordinates.
2040
- tx, ty = solver.domain_map.grid2data(*np.array(t))
2044
+ tx, ty = solver.domain_map.grid2data(
2045
+ *np.array([trajectory.x, trajectory.y])
2046
+ )
2041
2047
  tx += solver.grid.x_origin
2042
2048
  ty += solver.grid.y_origin
2043
2049
 
@@ -2054,14 +2060,9 @@ class PlotAxes(base.Axes):
2054
2060
  continue
2055
2061
 
2056
2062
  arrow_tail = (tx[-1], ty[-1])
2057
-
2058
- # Extrapolate to find arrow head
2059
- xg, yg = solver.domain_map.data2grid(
2060
- tx[-1] - solver.grid.x_origin, ty[-1] - solver.grid.y_origin
2061
- )
2062
-
2063
- ui = solver.interpgrid(u, xg, yg)
2064
- vi = solver.interpgrid(v, xg, yg)
2063
+ if trajectory.end_direction is None:
2064
+ continue
2065
+ ui, vi = trajectory.end_direction
2065
2066
 
2066
2067
  norm_v = np.sqrt(ui**2 + vi**2)
2067
2068
  if norm_v > 0:
@@ -2087,6 +2088,8 @@ class PlotAxes(base.Axes):
2087
2088
  if isinstance(linewidth, np.ndarray):
2088
2089
  line_widths = solver.interpgrid(linewidth, tgx, tgy)[:-1]
2089
2090
  line_kw["linewidth"].extend(line_widths)
2091
+ if np.ma.is_masked(line_widths[n]):
2092
+ continue
2090
2093
  arrow_kw["linewidth"] = line_widths[n]
2091
2094
 
2092
2095
  if use_multicolor_lines:
@@ -2094,7 +2097,7 @@ class PlotAxes(base.Axes):
2094
2097
  line_colors.append(color_values)
2095
2098
  arrow_kw["color"] = cmap(norm(color_values[n]))
2096
2099
 
2097
- if not edge:
2100
+ if not trajectory.hit_edge:
2098
2101
  p = mpatches.FancyArrowPatch(
2099
2102
  arrow_tail, arrow_head, transform=transform, **arrow_kw
2100
2103
  )
@@ -2125,6 +2128,12 @@ class PlotAxes(base.Axes):
2125
2128
  lc.set_array(np.ma.hstack(line_colors))
2126
2129
  lc.set_cmap(cmap)
2127
2130
  lc.set_norm(norm)
2131
+ self._update_guide(
2132
+ lc,
2133
+ colorbar=colorbar,
2134
+ colorbar_kw=colorbar_kw,
2135
+ queue_colorbar=False,
2136
+ )
2128
2137
 
2129
2138
  self.add_collection(lc)
2130
2139
  self.autoscale_view()