ultraplot 2.4.1__tar.gz → 2.5.0__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 (481) hide show
  1. {ultraplot-2.4.1/ultraplot.egg-info → ultraplot-2.5.0}/PKG-INFO +1 -1
  2. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/api.rst +10 -0
  3. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/fonts.py +82 -0
  4. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/insets_panels.py +72 -1
  5. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/projections.py +54 -0
  6. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/subplots.py +8 -0
  7. {ultraplot-2.4.1 → ultraplot-2.5.0}/pyproject.toml +1 -0
  8. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/__init__.py +1 -0
  9. ultraplot-2.5.0/ultraplot/_version.py +1 -0
  10. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/base.py +195 -7
  11. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/geo.py +791 -7
  12. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/colors.py +22 -1
  13. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/figure.py +118 -32
  14. ultraplot-2.5.0/ultraplot/internals/__init__.py +227 -0
  15. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/internals/docstring.py +53 -43
  16. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/internals/fonts.py +83 -2
  17. ultraplot-2.4.1/ultraplot/internals/__init__.py → ultraplot-2.5.0/ultraplot/internals/kwargs.py +59 -202
  18. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/internals/rcsetup.py +63 -0
  19. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_axes.py +44 -0
  20. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_colors.py +72 -1
  21. ultraplot-2.5.0/ultraplot/tests/test_docstring_helpers.py +63 -0
  22. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_figure.py +64 -0
  23. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_fonts.py +180 -0
  24. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_geographic.py +172 -0
  25. ultraplot-2.5.0/ultraplot/tests/test_inset.py +372 -0
  26. ultraplot-2.5.0/ultraplot/tests/test_kwargs_helpers.py +80 -0
  27. ultraplot-2.5.0/ultraplot/tests/test_textalign.py +620 -0
  28. ultraplot-2.5.0/ultraplot/textalign.py +640 -0
  29. {ultraplot-2.4.1 → ultraplot-2.5.0/ultraplot.egg-info}/PKG-INFO +1 -1
  30. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot.egg-info/SOURCES.txt +5 -0
  31. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot.egg-info/scm_file_list.json +405 -400
  32. ultraplot-2.5.0/ultraplot.egg-info/scm_version.json +8 -0
  33. ultraplot-2.4.1/ultraplot/_version.py +0 -1
  34. ultraplot-2.4.1/ultraplot/tests/test_inset.py +0 -29
  35. ultraplot-2.4.1/ultraplot.egg-info/scm_version.json +0 -8
  36. {ultraplot-2.4.1 → ultraplot-2.5.0}/.github/ISSUE_TEMPLATE.md +0 -0
  37. {ultraplot-2.4.1 → ultraplot-2.5.0}/.github/dependabot.yml +0 -0
  38. {ultraplot-2.4.1 → ultraplot-2.5.0}/.github/micromamba-condarc.yml +0 -0
  39. {ultraplot-2.4.1 → ultraplot-2.5.0}/.github/workflows/build-ultraplot.yml +0 -0
  40. {ultraplot-2.4.1 → ultraplot-2.5.0}/.github/workflows/main.yml +0 -0
  41. {ultraplot-2.4.1 → ultraplot-2.5.0}/.github/workflows/publish-pypi.yml +0 -0
  42. {ultraplot-2.4.1 → ultraplot-2.5.0}/.github/workflows/test-map.yml +0 -0
  43. {ultraplot-2.4.1 → ultraplot-2.5.0}/.gitignore +0 -0
  44. {ultraplot-2.4.1 → ultraplot-2.5.0}/.pre-commit-config.yaml +0 -0
  45. {ultraplot-2.4.1 → ultraplot-2.5.0}/.readthedocs.yml +0 -0
  46. {ultraplot-2.4.1 → ultraplot-2.5.0}/.zenodo.json +0 -0
  47. {ultraplot-2.4.1 → ultraplot-2.5.0}/CITATION.cff +0 -0
  48. {ultraplot-2.4.1 → ultraplot-2.5.0}/CODEOFCONDUCT.md +0 -0
  49. {ultraplot-2.4.1 → ultraplot-2.5.0}/CONTRIBUTING.rst +0 -0
  50. {ultraplot-2.4.1 → ultraplot-2.5.0}/INSTALL.rst +0 -0
  51. {ultraplot-2.4.1 → ultraplot-2.5.0}/LICENSE.txt +0 -0
  52. {ultraplot-2.4.1 → ultraplot-2.5.0}/README.rst +0 -0
  53. {ultraplot-2.4.1 → ultraplot-2.5.0}/UltraPlotLogo.svg +0 -0
  54. {ultraplot-2.4.1 → ultraplot-2.5.0}/codecov.yml +0 -0
  55. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/1dplots.py +0 -0
  56. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/2dplots.py +0 -0
  57. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/Makefile +0 -0
  58. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_ext/notoc.py +0 -0
  59. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_scripts/fetch_releases.py +0 -0
  60. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_static/custom.css +0 -0
  61. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_static/custom.js +0 -0
  62. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_static/example_plots/cartesian_example.svg +0 -0
  63. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_static/example_plots/colorbars_legends_example.svg +0 -0
  64. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_static/example_plots/colormaps_example.svg +0 -0
  65. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_static/example_plots/panels_example.svg +0 -0
  66. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_static/example_plots/projection_example.svg +0 -0
  67. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_static/example_plots/subplot_example.svg +0 -0
  68. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_static/logo_blank.svg +0 -0
  69. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_static/logo_long.png +0 -0
  70. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_static/logo_long.svg +0 -0
  71. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_static/logo_social.png +0 -0
  72. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_static/logo_social.svg +0 -0
  73. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_static/logo_square.png +0 -0
  74. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/_templates/whatsnew_sidebar.html +0 -0
  75. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/about.rst +0 -0
  76. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/basics.py +0 -0
  77. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/cartesian.py +0 -0
  78. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/colorbars_legends.py +0 -0
  79. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/colormaps.py +0 -0
  80. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/colors.py +0 -0
  81. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/conf.py +0 -0
  82. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/configuration.rst +0 -0
  83. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/contributing.rst +0 -0
  84. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/cycles.py +0 -0
  85. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/README.txt +0 -0
  86. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/colors/01_cycle_colormap.py +0 -0
  87. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/colors/02_diverging_colormap.py +0 -0
  88. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/colors/README.txt +0 -0
  89. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/geo/01_robin_tracks.py +0 -0
  90. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/geo/02_orthographic_views.py +0 -0
  91. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/geo/03_projections_features.py +0 -0
  92. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/geo/04_choropleth.py +0 -0
  93. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/geo/README.txt +0 -0
  94. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/layouts/01_shared_axes_abc.py +0 -0
  95. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/layouts/02_complex_layout_insets.py +0 -0
  96. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/layouts/03_spanning_labels.py +0 -0
  97. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/layouts/README.txt +0 -0
  98. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/legend_types/01_semantic_legends.py +0 -0
  99. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/legends_colorbars/01_multi_colorbars.py +0 -0
  100. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/legends_colorbars/02_legend_inset_colorbar.py +0 -0
  101. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/legends_colorbars/03_semantic_legends.py +0 -0
  102. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/legends_colorbars/README.txt +0 -0
  103. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/plot_types/01_curved_quiver.py +0 -0
  104. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/plot_types/02_network_graph.py +0 -0
  105. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/plot_types/03_lollipop.py +0 -0
  106. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/plot_types/04_datetime_series.py +0 -0
  107. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/plot_types/05_box_violin.py +0 -0
  108. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/plot_types/06_ridge_plot.py +0 -0
  109. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/plot_types/07_radar.py +0 -0
  110. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/plot_types/07_sankey.py +0 -0
  111. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/plot_types/08_chord_diagram.py +0 -0
  112. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/plot_types/08_ternary.py +0 -0
  113. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/plot_types/09_phylogeny.py +0 -0
  114. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/plot_types/10_circos_bed.py +0 -0
  115. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/plot_types/11_topic_ribbon.py +0 -0
  116. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/plot_types/12_taylor_diagram.py +0 -0
  117. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/examples/plot_types/README.txt +0 -0
  118. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/external-links.rst +0 -0
  119. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/faq.rst +0 -0
  120. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/index.rst +0 -0
  121. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/install.rst +0 -0
  122. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/lazy_loading.rst +0 -0
  123. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/make.bat +0 -0
  124. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/networks.py +0 -0
  125. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/requirements-rtd.txt +0 -0
  126. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/sphinxext/custom_roles.py +0 -0
  127. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/sphinxext/jupytext_cache.py +0 -0
  128. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/stats.py +0 -0
  129. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/ultraplotrc +0 -0
  130. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/usage.rst +0 -0
  131. {ultraplot-2.4.1 → ultraplot-2.5.0}/docs/why.rst +0 -0
  132. {ultraplot-2.4.1 → ultraplot-2.5.0}/environment.yml +0 -0
  133. {ultraplot-2.4.1 → ultraplot-2.5.0}/logo/PermanentMarker-Regular.ttf +0 -0
  134. {ultraplot-2.4.1 → ultraplot-2.5.0}/logo/environment-logo.yml +0 -0
  135. {ultraplot-2.4.1 → ultraplot-2.5.0}/logo/logo.py +0 -0
  136. {ultraplot-2.4.1 → ultraplot-2.5.0}/logo/run-linter.sh +0 -0
  137. {ultraplot-2.4.1 → ultraplot-2.5.0}/logo/webicon.py +0 -0
  138. {ultraplot-2.4.1 → ultraplot-2.5.0}/logo/whyUltraPlot.svg +0 -0
  139. {ultraplot-2.4.1 → ultraplot-2.5.0}/noxfile.py +0 -0
  140. {ultraplot-2.4.1 → ultraplot-2.5.0}/requirements-minimal.txt +0 -0
  141. {ultraplot-2.4.1 → ultraplot-2.5.0}/setup.cfg +0 -0
  142. {ultraplot-2.4.1 → ultraplot-2.5.0}/tools/ci/build_test_map.py +0 -0
  143. {ultraplot-2.4.1 → ultraplot-2.5.0}/tools/ci/select_tests.py +0 -0
  144. {ultraplot-2.4.1 → ultraplot-2.5.0}/tools/ci/version_support.py +0 -0
  145. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/_lazy.py +0 -0
  146. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/_subplots.py +0 -0
  147. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/__init__.py +0 -0
  148. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/_formatting.py +0 -0
  149. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/cartesian.py +0 -0
  150. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/container.py +0 -0
  151. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/plot.py +0 -0
  152. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/plot_types/__init__.py +0 -0
  153. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/plot_types/circlize.py +0 -0
  154. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/plot_types/curved_quiver.py +0 -0
  155. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/plot_types/ribbon.py +0 -0
  156. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/plot_types/sankey.py +0 -0
  157. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/polar.py +0 -0
  158. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/shared.py +0 -0
  159. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/taylor.py +0 -0
  160. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/axes/three.py +0 -0
  161. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Algae.rgb +0 -0
  162. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Amp.rgb +0 -0
  163. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/BR.rgb +0 -0
  164. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Balance.rgb +0 -0
  165. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Blues1_r.xml +0 -0
  166. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Blues2.xml +0 -0
  167. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Blues3.xml +0 -0
  168. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Blues4_r.xml +0 -0
  169. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Blues5.xml +0 -0
  170. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Blues6.xml +0 -0
  171. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Blues7.xml +0 -0
  172. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Blues8.xml +0 -0
  173. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Blues9.xml +0 -0
  174. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Boreal.json +0 -0
  175. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Browns1.xml +0 -0
  176. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Browns2.xml +0 -0
  177. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Browns3.xml +0 -0
  178. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Browns4.xml +0 -0
  179. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Browns5.xml +0 -0
  180. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Browns6.xml +0 -0
  181. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Browns7.xml +0 -0
  182. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Browns8.xml +0 -0
  183. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Browns9.xml +0 -0
  184. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/ColdHot.rgb +0 -0
  185. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Crest.rgb +0 -0
  186. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Curl.rgb +0 -0
  187. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Deep.rgb +0 -0
  188. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Delta.rgb +0 -0
  189. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Dense.rgb +0 -0
  190. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Div.json +0 -0
  191. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/DryWet.json +0 -0
  192. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Dusk.json +0 -0
  193. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Fire.json +0 -0
  194. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Flare.rgb +0 -0
  195. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Glacial.json +0 -0
  196. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Greens1_r.xml +0 -0
  197. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Greens2.xml +0 -0
  198. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Greens3_r.xml +0 -0
  199. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Greens4.xml +0 -0
  200. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Greens5.xml +0 -0
  201. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Greens6_r.xml +0 -0
  202. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Greens7.xml +0 -0
  203. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Greens8.xml +0 -0
  204. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Haline.rgb +0 -0
  205. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Ice.rgb +0 -0
  206. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/IceFire.rgb +0 -0
  207. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Mako.rgb +0 -0
  208. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Marine.json +0 -0
  209. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Matter.rgb +0 -0
  210. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Mono.txt +0 -0
  211. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/MonoCycle.txt +0 -0
  212. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/NegPos.json +0 -0
  213. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Oranges1.xml +0 -0
  214. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Oranges2.xml +0 -0
  215. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Oranges3.xml +0 -0
  216. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Oranges4.xml +0 -0
  217. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Oxy.rgb +0 -0
  218. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Phase.rgb +0 -0
  219. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Purples1_r.xml +0 -0
  220. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Purples2.xml +0 -0
  221. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Purples3.xml +0 -0
  222. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Reds1.xml +0 -0
  223. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Reds2.xml +0 -0
  224. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Reds3.xml +0 -0
  225. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Reds4.xml +0 -0
  226. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Reds5.xml +0 -0
  227. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Rocket.rgb +0 -0
  228. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Solar.rgb +0 -0
  229. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Speed.rgb +0 -0
  230. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Stellar.json +0 -0
  231. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Sunrise.json +0 -0
  232. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Sunset.json +0 -0
  233. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Tempo.rgb +0 -0
  234. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Thermal.rgb +0 -0
  235. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Turbid.rgb +0 -0
  236. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Vivid.xml +0 -0
  237. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Vlag.rgb +0 -0
  238. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Yellows1.xml +0 -0
  239. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Yellows2.xml +0 -0
  240. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Yellows3.xml +0 -0
  241. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/Yellows4.xml +0 -0
  242. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/acton.txt +0 -0
  243. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/bam.txt +0 -0
  244. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/bamO.txt +0 -0
  245. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/bamako.txt +0 -0
  246. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/batlow.txt +0 -0
  247. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/batlowK.txt +0 -0
  248. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/batlowW.txt +0 -0
  249. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/berlin.txt +0 -0
  250. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/bilbao.txt +0 -0
  251. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/broc.txt +0 -0
  252. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/brocO.txt +0 -0
  253. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/buda.txt +0 -0
  254. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/bukavu.txt +0 -0
  255. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/cork.txt +0 -0
  256. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/corkO.txt +0 -0
  257. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/davos.txt +0 -0
  258. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/devon.txt +0 -0
  259. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/fes.txt +0 -0
  260. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/hawaii.txt +0 -0
  261. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/imola.txt +0 -0
  262. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/lajolla.txt +0 -0
  263. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/lapaz.txt +0 -0
  264. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/lisbon.txt +0 -0
  265. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/nuuk.txt +0 -0
  266. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/oleron.txt +0 -0
  267. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/oslo.txt +0 -0
  268. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/roma.txt +0 -0
  269. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/romaO.txt +0 -0
  270. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/tofino.txt +0 -0
  271. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/tokyo.txt +0 -0
  272. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/turku.txt +0 -0
  273. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/vanimo.txt +0 -0
  274. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/vik.txt +0 -0
  275. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cmaps/vikO.txt +0 -0
  276. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/colorbar.py +0 -0
  277. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/colors/opencolor.txt +0 -0
  278. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/colors/xkcd.txt +0 -0
  279. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/config.py +0 -0
  280. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/constructor.py +0 -0
  281. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cycles/538.hex +0 -0
  282. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cycles/FlatUI.hex +0 -0
  283. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cycles/Qual1.rgb +0 -0
  284. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cycles/Qual2.rgb +0 -0
  285. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cycles/bmh.hex +0 -0
  286. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cycles/classic.hex +0 -0
  287. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cycles/colorblind.hex +0 -0
  288. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cycles/colorblind10.hex +0 -0
  289. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cycles/default.hex +0 -0
  290. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cycles/ggplot.hex +0 -0
  291. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cycles/seaborn.hex +0 -0
  292. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/cycles/tableau.hex +0 -0
  293. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/demos.py +0 -0
  294. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/externals/__init__.py +0 -0
  295. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/externals/hsluv.py +0 -0
  296. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraMath-Bold.ttf +0 -0
  297. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraMath-ExtraLight.ttf +0 -0
  298. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraMath-Heavy.ttf +0 -0
  299. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraMath-Light.ttf +0 -0
  300. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraMath-Medium.ttf +0 -0
  301. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraMath-Regular.ttf +0 -0
  302. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraMath-SemiBold.ttf +0 -0
  303. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraMath-UltraLight.ttf +0 -0
  304. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-Black.ttf +0 -0
  305. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-BlackItalic.ttf +0 -0
  306. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-Bold.ttf +0 -0
  307. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-BoldItalic.ttf +0 -0
  308. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-ExtraBold.ttf +0 -0
  309. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-ExtraBoldItalic.ttf +0 -0
  310. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-ExtraLight.ttf +0 -0
  311. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-ExtraLightItalic.ttf +0 -0
  312. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-Italic.ttf +0 -0
  313. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-Light.ttf +0 -0
  314. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-LightItalic.ttf +0 -0
  315. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-Medium.ttf +0 -0
  316. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-MediumItalic.ttf +0 -0
  317. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-Regular.ttf +0 -0
  318. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-SemiBold.ttf +0 -0
  319. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/FiraSans-SemiBoldItalic.ttf +0 -0
  320. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/LICENSE_FIRAMATH.txt +0 -0
  321. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/LICENSE_FIRASANS.txt +0 -0
  322. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/LICENSE_NOTOSANS.txt +0 -0
  323. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/LICENSE_NOTOSERIF.txt +0 -0
  324. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/LICENSE_OPENSANS.txt +0 -0
  325. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/LICENSE_ROBOTO.txt +0 -0
  326. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/LICENSE_SOURCESANS.txt +0 -0
  327. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/LICENSE_SOURCESERIF.txt +0 -0
  328. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/LICENSE_TEXGYRE.txt +0 -0
  329. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/LICENSE_UBUNTU.txt +0 -0
  330. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/NotoSans-Bold.ttf +0 -0
  331. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/NotoSans-BoldItalic.ttf +0 -0
  332. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/NotoSans-Italic.ttf +0 -0
  333. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/NotoSans-Regular.ttf +0 -0
  334. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/NotoSerif-Bold.ttf +0 -0
  335. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/NotoSerif-BoldItalic.ttf +0 -0
  336. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/NotoSerif-Italic.ttf +0 -0
  337. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/NotoSerif-Regular.ttf +0 -0
  338. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/OpenSans-Bold.ttf +0 -0
  339. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/OpenSans-BoldItalic.ttf +0 -0
  340. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/OpenSans-Italic.ttf +0 -0
  341. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/OpenSans-Regular.ttf +0 -0
  342. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/OpenSans-Semibold.ttf +0 -0
  343. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/OpenSans-SemiboldItalic.ttf +0 -0
  344. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Roboto-Black.ttf +0 -0
  345. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Roboto-BlackItalic.ttf +0 -0
  346. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Roboto-Bold.ttf +0 -0
  347. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Roboto-BoldItalic.ttf +0 -0
  348. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Roboto-Italic.ttf +0 -0
  349. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Roboto-Light.ttf +0 -0
  350. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Roboto-LightItalic.ttf +0 -0
  351. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Roboto-Medium.ttf +0 -0
  352. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Roboto-MediumItalic.ttf +0 -0
  353. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Roboto-Regular.ttf +0 -0
  354. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSansPro-Black.ttf +0 -0
  355. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSansPro-BlackItalic.ttf +0 -0
  356. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSansPro-Bold.ttf +0 -0
  357. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSansPro-BoldItalic.ttf +0 -0
  358. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSansPro-ExtraLight.ttf +0 -0
  359. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSansPro-ExtraLightItalic.ttf +0 -0
  360. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSansPro-Italic.ttf +0 -0
  361. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSansPro-Light.ttf +0 -0
  362. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSansPro-LightItalic.ttf +0 -0
  363. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSansPro-Regular.ttf +0 -0
  364. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSansPro-SemiBold.ttf +0 -0
  365. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSansPro-SemiBoldItalic.ttf +0 -0
  366. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSerifPro-Black.ttf +0 -0
  367. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSerifPro-BlackItalic.ttf +0 -0
  368. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSerifPro-Bold.ttf +0 -0
  369. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSerifPro-BoldItalic.ttf +0 -0
  370. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSerifPro-ExtraLight.ttf +0 -0
  371. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSerifPro-ExtraLightItalic.ttf +0 -0
  372. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSerifPro-Italic.ttf +0 -0
  373. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSerifPro-Light.ttf +0 -0
  374. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSerifPro-LightItalic.ttf +0 -0
  375. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSerifPro-Regular.ttf +0 -0
  376. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSerifPro-SemiBold.ttf +0 -0
  377. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/SourceSerifPro-SemiBoldItalic.ttf +0 -0
  378. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Ubuntu-Bold.ttf +0 -0
  379. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Ubuntu-BoldItalic.ttf +0 -0
  380. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Ubuntu-Italic.ttf +0 -0
  381. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Ubuntu-Light.ttf +0 -0
  382. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Ubuntu-LightItalic.ttf +0 -0
  383. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Ubuntu-Medium.ttf +0 -0
  384. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Ubuntu-MediumItalic.ttf +0 -0
  385. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/Ubuntu-Regular.ttf +0 -0
  386. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyreadventor-bold.ttf +0 -0
  387. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyreadventor-bolditalic.ttf +0 -0
  388. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyreadventor-italic.ttf +0 -0
  389. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyreadventor-regular.ttf +0 -0
  390. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyrebonum-bold.ttf +0 -0
  391. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyrebonum-bolditalic.ttf +0 -0
  392. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyrebonum-italic.ttf +0 -0
  393. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyrebonum-regular.ttf +0 -0
  394. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyrechorus-mediumitalic.ttf +0 -0
  395. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyrecursor-bold.ttf +0 -0
  396. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyrecursor-bolditalic.ttf +0 -0
  397. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyrecursor-italic.ttf +0 -0
  398. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyrecursor-regular.ttf +0 -0
  399. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyreheros-bold.ttf +0 -0
  400. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyreheros-bolditalic.ttf +0 -0
  401. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyreheros-italic.ttf +0 -0
  402. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyreheros-regular.ttf +0 -0
  403. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyrepagella-bold.ttf +0 -0
  404. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyrepagella-bolditalic.ttf +0 -0
  405. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyrepagella-italic.ttf +0 -0
  406. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyrepagella-regular.ttf +0 -0
  407. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyreschola-bold.ttf +0 -0
  408. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyreschola-bolditalic.ttf +0 -0
  409. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyreschola-italic.ttf +0 -0
  410. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyreschola-regular.ttf +0 -0
  411. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyretermes-bold.ttf +0 -0
  412. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyretermes-bolditalic.ttf +0 -0
  413. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyretermes-italic.ttf +0 -0
  414. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/fonts/texgyretermes-regular.ttf +0 -0
  415. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/gridspec.py +0 -0
  416. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/internals/benchmarks.py +0 -0
  417. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/internals/context.py +0 -0
  418. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/internals/guides.py +0 -0
  419. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/internals/inputs.py +0 -0
  420. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/internals/labels.py +0 -0
  421. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/internals/versions.py +0 -0
  422. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/internals/warnings.py +0 -0
  423. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/legend.py +0 -0
  424. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/proj.py +0 -0
  425. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/scale.py +0 -0
  426. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/__init__.py +0 -0
  427. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/conftest.py +0 -0
  428. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_1dplots.py +0 -0
  429. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_2dplots.py +0 -0
  430. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_animation.py +0 -0
  431. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_axes_alt_styles.py +0 -0
  432. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_axes_base_colorbar_helpers.py +0 -0
  433. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_base.py +0 -0
  434. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_circlize_integration.py +0 -0
  435. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_colorbar.py +0 -0
  436. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_colorbar_helpers_extra.py +0 -0
  437. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_colormap.py +0 -0
  438. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_colormap_helpers_extra.py +0 -0
  439. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_colors_helpers.py +0 -0
  440. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_config.py +0 -0
  441. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_config_helpers_extra.py +0 -0
  442. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_constructor.py +0 -0
  443. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_constructor_helpers_extra.py +0 -0
  444. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_core_versions.py +0 -0
  445. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_demos.py +0 -0
  446. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_docs.py +0 -0
  447. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_docs_fetch_releases.py +0 -0
  448. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_docs_search.py +0 -0
  449. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_external_axes_container_integration.py +0 -0
  450. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_external_container_edge_cases.py +0 -0
  451. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_external_container_mocked.py +0 -0
  452. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_format.py +0 -0
  453. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_gridspec.py +0 -0
  454. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_handlers.py +0 -0
  455. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_imports.py +0 -0
  456. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_imshow.py +0 -0
  457. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_inputs.py +0 -0
  458. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_inputs_helpers.py +0 -0
  459. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_integration.py +0 -0
  460. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_legend.py +0 -0
  461. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_plot.py +0 -0
  462. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_proj_helpers.py +0 -0
  463. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_projections.py +0 -0
  464. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_rcsetup_helpers.py +0 -0
  465. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_release_metadata.py +0 -0
  466. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_scale_helpers.py +0 -0
  467. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_semantic_legend.py +0 -0
  468. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_statistical_plotting.py +0 -0
  469. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_subplot_manager.py +0 -0
  470. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_subplots.py +0 -0
  471. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_text_helpers.py +0 -0
  472. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_tickers.py +0 -0
  473. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/tests/test_ultralayout.py +0 -0
  474. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/text.py +0 -0
  475. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/ticker.py +0 -0
  476. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/ui.py +0 -0
  477. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/ultralayout.py +0 -0
  478. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot/utils.py +0 -0
  479. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot.egg-info/dependency_links.txt +0 -0
  480. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot.egg-info/requires.txt +0 -0
  481. {ultraplot-2.4.1 → ultraplot-2.5.0}/ultraplot.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultraplot
3
- Version: 2.4.1
3
+ Version: 2.5.0
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>
@@ -133,6 +133,16 @@ Demo functions
133
133
  :toctree: api
134
134
 
135
135
 
136
+ Text alignment
137
+ ==============
138
+
139
+ .. automodule:: ultraplot.textalign
140
+ :no-private-members:
141
+
142
+ .. automodsumm:: ultraplot.textalign
143
+ :toctree: api
144
+
145
+
136
146
  Miscellaneous functions
137
147
  =======================
138
148
 
@@ -100,6 +100,88 @@ fig, axs = uplt.show_fonts(family="tex-gyre")
100
100
  # :rcraw:`mathtext.fontset` back to one of matplotlib's math-specialized font sets
101
101
  # (e.g., ``'stixsans'`` or ``'dejavusans'``).
102
102
  #
103
+ # In short, math fonts can be tailored to taste at three levels, depending on
104
+ # how much of the "LaTeX look" you want:
105
+ #
106
+ # #. **Match the document font** (the default). With the ``'custom'`` font set,
107
+ # math follows the active text font -- including fonts assigned to
108
+ # individual text objects, as demonstrated below.
109
+ # #. **Computer Modern symbols**. Keep the active font for letters and numbers
110
+ # but render ``\mathcal`` and big operators with authentic Computer Modern
111
+ # glyphs by setting :rcraw:`mathtext.cm_symbols` to ``True``
112
+ # (see :ref:`below <ug_fonts_cm>`).
113
+ # #. **Full LaTeX**. Set matplotlib's :rcraw:`text.usetex` to ``True`` to
114
+ # delegate all text rendering to an external LaTeX installation. This gives
115
+ # complete LaTeX typesetting but is much slower and requires TeX on your
116
+ # system -- with the previous two options it is rarely necessary.
117
+ #
118
+ # The example below demonstrates the first level: the same expression rendered
119
+ # with different fonts assigned per text object.
120
+
121
+ # %%
122
+ import ultraplot as uplt
123
+
124
+ expr = (
125
+ r"$\mathcal{ABCXYZ}\quad"
126
+ r"\sum_{i=0}^{n}\quad"
127
+ r"\prod_{j=1}^{m}\quad"
128
+ r"\int_a^b\quad"
129
+ r"\oint_C$"
130
+ )
131
+
132
+ fig, axs = uplt.subplots(nrows=3, refwidth=6, refheight=1.1, share=False, span=False)
133
+ for ax, font in zip(axs, ("TeX Gyre Heros", "Fira Math", "DejaVu Sans")):
134
+ ax.text(0.02, 0.5, expr, transform="axes", va="center", fontsize=24, fontname=font)
135
+ ax.format(title=font, titleloc="left")
136
+ axs.format(xlocator="null", ylocator="null", xspineloc="none", yspineloc="none")
137
+
138
+ # %% [raw] raw_mimetype="text/restructuredtext"
139
+ #
140
+ # .. _ug_fonts_cm:
141
+ #
142
+ # Computer Modern symbols
143
+ # ^^^^^^^^^^^^^^^^^^^^^^^
144
+ #
145
+ # If you want to retain the active alphabet and number fonts while using
146
+ # Computer Modern for selected LaTeX-style symbols, set :rcraw:`mathtext.cm_symbols`
147
+ # to ``True``. This routes ``\mathcal`` through ``cmsy10`` and big operators like
148
+ # ``\sum``, ``\prod``, ``\int``, ``\oint``, ``\bigcup``, and ``\bigoplus`` through
149
+ # ``cmex10``. This does not affect ordinary letters and numbers, and it does not
150
+ # provide a Computer Modern ``\mathfrak`` font because matplotlib's bundled
151
+ # mathtext fonts do not include one. Note that math text is parsed when the
152
+ # figure is *drawn*, so the setting must be active at draw time -- assign it
153
+ # globally rather than wrapping plotting commands in a context block.
154
+
155
+ # %%
156
+ fig, ax = uplt.subplots(refwidth=6, refheight=1.1)
157
+ ax.text(0.02, 0.5, expr, transform="axes", va="center", fontsize=24)
158
+ ax.format(
159
+ title="Default custom math text",
160
+ titleloc="left",
161
+ xlocator="null",
162
+ ylocator="null",
163
+ xspineloc="none",
164
+ yspineloc="none",
165
+ )
166
+
167
+ # %%
168
+ uplt.rc["mathtext.cm_symbols"] = True
169
+ fig, ax = uplt.subplots(refwidth=6, refheight=1.1)
170
+ ax.text(0.02, 0.5, expr, transform="axes", va="center", fontsize=24)
171
+ ax.format(
172
+ title="Computer Modern math symbols",
173
+ titleloc="left",
174
+ xlocator="null",
175
+ ylocator="null",
176
+ xspineloc="none",
177
+ yspineloc="none",
178
+ )
179
+
180
+ # %%
181
+ uplt.rc["mathtext.cm_symbols"] = False # restore the default
182
+
183
+ # %% [raw] raw_mimetype="text/restructuredtext"
184
+ #
103
185
  # A table of math text containing the sans-serif fonts packaged with UltraPlot is shown
104
186
  # below. The dummy glyph "¤" is shown where a given math character is unavailable
105
187
  # for a particular font (in practice, the fallback font :rc:`mathtext.fallback` is used
@@ -88,8 +88,8 @@ fig.format(
88
88
  )
89
89
 
90
90
  # %%
91
- import ultraplot as uplt
92
91
  import numpy as np
92
+ import ultraplot as uplt
93
93
 
94
94
  state = np.random.RandomState(51423)
95
95
  data = (state.rand(20, 20) - 0.48).cumsum(axis=1).cumsum(axis=0)
@@ -192,3 +192,74 @@ ix = ax.inset(
192
192
  )
193
193
  ix.format(xlim=(2, 4), ylim=(2, 4), color="red8", linewidth=1.5, ticklabelweight="bold")
194
194
  ix.pcolormesh(data, cmap="Grays", levels=N, inbounds=False)
195
+
196
+ # %% [raw] raw_mimetype="text/restructuredtext"
197
+ # Hawkeye map insets
198
+ # ~~~~~~~~~~~~~~~~~~
199
+ #
200
+ # :class:`~ultraplot.axes.GeoAxes` adds :meth:`~ultraplot.axes.GeoAxes.hawkeye`
201
+ # for geographic callout maps. The inset is anchored at ``xy`` in a parent coordinate
202
+ # system, and its ``size`` is a fraction of the parent axes. Supply ``extent`` to set
203
+ # the inset map scope and draw a matching indicator and optional connectors on the
204
+ # parent map. Hawkeyes are excluded from automatic layout, so they can extend beyond
205
+ # the parent axes without reserving subplot space.
206
+ #
207
+ # Rectangular hawkeyes preserve both the requested extent and projection scale. A
208
+ # circular frame cannot simultaneously preserve projection scale and display an exact
209
+ # non-square extent. Circular hawkeyes therefore expand the shorter projected dimension
210
+ # to retain the projection; use a square extent when the exact circular map scope is
211
+ # important, or pass ``aspect='auto'`` to fit the exact extent with distortion.
212
+ #
213
+ # The following dependency-free example shows a Singapore city locator on a world map.
214
+ # The returned inset is an ordinary geographic axes, so optional geospatial libraries
215
+ # can draw external data inside it. For example, `OSMnx <https://osmnx.readthedocs.io/>`__
216
+ # can provide street geometry when it is installed separately:
217
+ #
218
+ # .. code-block:: python
219
+ #
220
+ # import osmnx as ox
221
+ # from cartopy import crs as ccrs
222
+ #
223
+ # network = ox.graph_from_point((1.3521, 103.8198), dist=8_000, network_type="drive")
224
+ # streets = ox.graph_to_gdfs(network, nodes=False)
225
+ # streets.plot(ax=inax, color="0.3", linewidth=0.4, transform=ccrs.PlateCarree())
226
+ #
227
+ # The data download and OpenStreetMap attribution are the responsibility of the
228
+ # application using that optional integration.
229
+
230
+ # %%
231
+ singapore = (103.8198, 1.3521)
232
+ fig, ax = uplt.subplots(proj="robin", refwidth=4)
233
+ ax.format(land=True, landcolor="gray8", oceancolor="blue9")
234
+ ax.plot(
235
+ *singapore,
236
+ marker="o",
237
+ color="red",
238
+ markeredgecolor="white",
239
+ markeredgewidth=0.8,
240
+ ms=5,
241
+ transform="cyl",
242
+ )
243
+ ax.text(106, 4, "Singapore", color="red", size=7, transform="map")
244
+ inax = ax.hawkeye(
245
+ (0.97, 0.97),
246
+ size=0.23,
247
+ anchor="ur",
248
+ proj="merc",
249
+ extent=(103.76, 103.90, 1.27, 1.41),
250
+ shape="circle",
251
+ target="circle",
252
+ connector="line",
253
+ color="red",
254
+ indicator_kw={"linewidth": 1.5},
255
+ )
256
+ inax.format(land=True, landcolor="gray9", oceancolor="blue9")
257
+ inax.plot(
258
+ *singapore,
259
+ marker="o",
260
+ color="red",
261
+ markeredgecolor="white",
262
+ markeredgewidth=0.8,
263
+ ms=5,
264
+ transform="cyl",
265
+ )
@@ -516,6 +516,60 @@ fig.format(
516
516
  )
517
517
 
518
518
 
519
+ # %% [raw] raw_mimetype="text/restructuredtext"
520
+ # .. _ug_geo_layout:
521
+ #
522
+ # Geographic axes in mixed subplot layouts
523
+ # -----------------------------------------
524
+ #
525
+ # Geographic axes preserve the aspect ratio required by their projection. This is
526
+ # important for interpreting distances and shapes correctly, but it creates a layout
527
+ # choice when a map shares a GridSpec with Cartesian axes or maps that have a different
528
+ # natural aspect ratio. A fixed-aspect map cannot both fill a differently shaped subplot
529
+ # slot *and* preserve its projection geometry.
530
+ #
531
+ # By default, UltraPlot preserves the map aspect. If the slot is a different shape, the
532
+ # visible map is centered inside it. This keeps the map accurate, but decorations attached
533
+ # to the visible map boundary can stop lining up with decorations on neighboring subplots.
534
+ # For example, the following uses ``abcanchor='slot'`` to attach the map's a-b-c label to
535
+ # its unadjusted GridSpec slot instead. The map itself remains aspect-faithful.
536
+
537
+ # %%
538
+ import ultraplot as uplt
539
+
540
+ layout = [[1, 1, 1, 2, 2, 2], [3, 3, 4, 4, 5, 5]]
541
+ fig, axs = uplt.subplots(layout, refwidth=2.4, proj={4: "cyl"}, share=False)
542
+ axs[3].format(
543
+ lonlim=(0, 1),
544
+ latlim=(0, 1),
545
+ abcanchor="slot", # align its a-b-c label with the Cartesian subplot slots
546
+ )
547
+ fig.format(abc="A.", abcloc="left")
548
+
549
+
550
+ # %% [raw] raw_mimetype="text/restructuredtext"
551
+ # ``abcanchor`` has two modes:
552
+ #
553
+ # * ``'axes'`` (the default) attaches the label to the visible map boundary. This is
554
+ # usually best when the map is the visual focus.
555
+ # * ``'slot'`` attaches it to the original GridSpec slot. This is useful when labels
556
+ # should form a regular grid across mixed subplot types.
557
+ #
558
+ # There are two other deliberate trade-offs, depending on what the figure needs:
559
+ #
560
+ # * Use ``aspect='auto'`` with :meth:`~ultraplot.axes.GeoAxes.format` to stretch a map
561
+ # to fill its slot. This preserves the GridSpec geometry but distorts the projection,
562
+ # so it is generally unsuitable when geographic shape or scale matters.
563
+ # * Make the map the layout reference with ``ref=4`` in the above call to
564
+ # :func:`~ultraplot.ui.subplots`. UltraPlot then resizes the overall figure so that
565
+ # the map fills its slot while retaining its aspect. This is useful when the map,
566
+ # rather than the Cartesian axes, should determine the figure geometry.
567
+ #
568
+ # If none of these trade-offs is appropriate, change the map extent so that its natural
569
+ # aspect better matches the intended GridSpec slot. That preserves projection geometry,
570
+ # but necessarily changes the plotted geographic domain.
571
+
572
+
519
573
  # %% [raw] raw_mimetype="text/restructuredtext"
520
574
  # .. _ug_zoom:
521
575
  #
@@ -395,6 +395,14 @@ for (name1, equal), (name2, group) in zip(equals, groups):
395
395
  # Explicit sharing levels still force sharing attempts and may warn when
396
396
  # incompatible axes are encountered.
397
397
  #
398
+ # When figure-level row or column labels and a shared spanning axis label use
399
+ # the same side, the row or column labels are placed nearer the axes and the
400
+ # spanning label is placed outside them. Control this gap with the
401
+ # :rc:`leftlabel.sharedpad`, :rc:`rightlabel.sharedpad`,
402
+ # :rc:`bottomlabel.sharedpad`, and :rc:`toplabel.sharedpad` settings. These
403
+ # can also be passed to ``format`` without periods; for example,
404
+ # ``fig.format(leftlabelsharedpad='2em')``.
405
+ #
398
406
  # The below examples demonstrate the effect of various axis and label sharing
399
407
  # settings on the appearance of several subplot grids.
400
408
 
@@ -66,6 +66,7 @@ exclude = ["**/*.ipynb"]
66
66
 
67
67
  [tool.pytest.ini_options]
68
68
  filterwarnings = [
69
+ "ignore:'parseString' deprecated - use 'parse_string':DeprecationWarning:matplotlib._fontconfig_pattern",
69
70
  "ignore:'resetCache' deprecated - use 'reset_cache':DeprecationWarning:matplotlib._fontconfig_pattern",
70
71
  ]
71
72
  mpl-default-style = { axes.prop_cycle = "cycler('color', ['#4c72b0ff', '#55a868ff', '#c44e52ff', '#8172b2ff', '#ccb974ff', '#64b5cdff'])" }
@@ -101,6 +101,7 @@ if TYPE_CHECKING:
101
101
  from .scale import SineLatitudeScale as SineLatitudeScale
102
102
  from .scale import SymmetricalLogScale as SymmetricalLogScale
103
103
  from .text import CurvedText as CurvedText
104
+ from .textalign import align_text as align_text
104
105
  from .ultralayout import ColorbarLayoutSolver as ColorbarLayoutSolver
105
106
  from .ultralayout import compute_ultra_positions as compute_ultra_positions
106
107
  from .ultralayout import get_grid_positions_ultra as get_grid_positions_ultra
@@ -0,0 +1 @@
1
+ __version__ = '2.5.0'
@@ -4,6 +4,7 @@ The first-level axes subclass used for all ultraplot figures.
4
4
  Implements basic shared functionality.
5
5
  """
6
6
 
7
+ import contextlib
7
8
  import copy
8
9
  import inspect
9
10
  import re
@@ -165,8 +166,9 @@ This is similar to `matplotlib.axes.Axes.inset_axes`.
165
166
 
166
167
  Parameters
167
168
  -----------
168
- bounds : 4-tuple of float
169
- The (left, bottom, width, height) coordinates for the axes.
169
+ bounds : 4-tuple of float or (4-tuple, transform)
170
+ The (left, bottom, width, height) coordinates for the axes. To specify the
171
+ coordinate system alongside the coordinates, pass ``(bounds, transform)``.
170
172
  %(axes.transform)s
171
173
  Default is to use the same projection as the current axes.
172
174
  %(axes.proj)s
@@ -382,6 +384,11 @@ leftlabelpad, toplabelpad, rightlabelpad, bottomlabelpad : float or unit-spec, d
382
384
  : :rc:`leftlabel.pad`, :rc:`toplabel.pad`, :rc:`rightlabel.pad`, :rc:`bottomlabel.pad`
383
385
  The padding between the labels and the axes content.
384
386
  %(units.pt)s
387
+ leftlabelsharedpad, toplabelsharedpad, rightlabelsharedpad, bottomlabelsharedpad : float or unit-spec, default
388
+ : :rc:`leftlabel.sharedpad`, :rc:`toplabel.sharedpad`, :rc:`rightlabel.sharedpad`, :rc:`bottomlabel.sharedpad`
389
+ The padding between side labels and a shared spanning axis label on the
390
+ same side. The spanning label is placed outside the side labels.
391
+ %(units.pt)s
385
392
  leftlabels_kw, toplabels_kw, rightlabels_kw, bottomlabels_kw : dict-like, optional
386
393
  Additional settings used to update the labels with ``text.update()``.
387
394
  figtitle
@@ -744,6 +751,20 @@ class _TransformedBoundsLocator:
744
751
  return bbox
745
752
 
746
753
 
754
+ class _AspectAwareTransformedBoundsLocator(_TransformedBoundsLocator):
755
+ """Preserve an inset's lower-left anchor after box-aspect adjustment."""
756
+
757
+ def __call__(self, ax, renderer):
758
+ bbox = super().__call__(ax, renderer)
759
+ aspect = ax.get_aspect()
760
+ if aspect == "auto" or ax.get_adjustable() != "box":
761
+ return bbox
762
+ box_aspect = float(aspect) * ax.get_data_ratio()
763
+ fig_bbox = ax.figure.bbox
764
+ fig_aspect = fig_bbox.height / fig_bbox.width
765
+ return bbox.shrunk_to_aspect(box_aspect, bbox, fig_aspect)
766
+
767
+
747
768
  class _SideColorbarLocator:
748
769
  """Position a side colorbar beyond its parent axes decorations."""
749
770
 
@@ -957,6 +978,7 @@ class Axes(_ExternalModeMixin, maxes.Axes):
957
978
  self._active_cycle = rc["axes.prop_cycle"]
958
979
  self._auto_format = None # manipulated by wrapper functions
959
980
  self._abc_border_kwargs = {}
981
+ self._abc_anchor = "axes"
960
982
  self._abc_loc = None
961
983
  self._abc_pad = 0 # User's horizontal offset for abc label (in points)
962
984
  self._abc_title_pad = rc[
@@ -970,6 +992,10 @@ class Axes(_ExternalModeMixin, maxes.Axes):
970
992
  self._altx_parent = None # for cartesian axes only
971
993
  self._alty_parent = None
972
994
  self._colorbar_fill = None
995
+ self._align_texts = [] # texts registered for overlap avoidance
996
+ self._align_kwargs = {} # solver settings from auto_align_text()
997
+ self._align_arrows = [] # connectors drawn back to displaced anchors
998
+ self._align_cache = None # last solve, reused while its inputs hold
973
999
  self._inset_parent = None
974
1000
  self._inset_bounds = None # for introspection ony
975
1001
  self._inset_zoom = False
@@ -1046,9 +1072,10 @@ class Axes(_ExternalModeMixin, maxes.Axes):
1046
1072
  """
1047
1073
  Add an inset axes using arbitrary projection.
1048
1074
  """
1049
- # Converting transform to figure-relative coordinates
1050
- transform = self._get_transform(transform, "axes")
1051
- locator = self._make_inset_locator(bounds, transform)
1075
+ # Convert coordinates to figure-relative coordinates while retaining the
1076
+ # original bounds for aspect-aware geographic inset locators.
1077
+ bounds_input, transform = self._parse_anchor(bounds, transform, default="axes")
1078
+ locator = self._make_inset_locator(bounds_input, transform)
1052
1079
  bounds = locator(self, None).bounds
1053
1080
  label = kwargs.pop("label", "inset_axes")
1054
1081
  zorder = _not_none(zorder, 4)
@@ -1066,6 +1093,8 @@ class Axes(_ExternalModeMixin, maxes.Axes):
1066
1093
  # automatically if we used data coords. Called by ax.apply_aspect()
1067
1094
  cls = mproj.get_projection_class(kwargs.pop("projection"))
1068
1095
  ax = cls(self.figure, bounds, zorder=zorder, label=label, **kwargs)
1096
+ if ax._name in ("cartopy", "basemap"):
1097
+ locator = _AspectAwareTransformedBoundsLocator(bounds_input, transform)
1069
1098
  ax.set_axes_locator(locator)
1070
1099
  ax._inset_parent = self
1071
1100
  ax._inset_bounds = bounds
@@ -1737,6 +1766,22 @@ class Axes(_ExternalModeMixin, maxes.Axes):
1737
1766
  else:
1738
1767
  raise ValueError(f"Unknown transform {transform!r}.")
1739
1768
 
1769
+ def _parse_anchor(self, coordinates, transform=None, default="data"):
1770
+ """
1771
+ Parse coordinates and their transform.
1772
+
1773
+ Coordinates can be passed with the transform separately or packaged as
1774
+ a ``(coordinates, transform)`` tuple. The latter is useful for APIs
1775
+ that accept a single anchor argument, such as ``inset_axes``.
1776
+ """
1777
+ if (
1778
+ transform is None
1779
+ and isinstance(coordinates, tuple)
1780
+ and len(coordinates) == 2
1781
+ ):
1782
+ coordinates, transform = coordinates
1783
+ return coordinates, self._get_transform(transform, default)
1784
+
1740
1785
  def _register_guide(self, guide, obj, key, **kwargs):
1741
1786
  """
1742
1787
  Queue up or replace objects for legends and list-of-artist style colorbars.
@@ -3071,8 +3116,15 @@ class Axes(_ExternalModeMixin, maxes.Axes):
3071
3116
  self.transAxes.inverted()
3072
3117
  )
3073
3118
  ax0, ax1 = abc_bbox.x0, abc_bbox.x1
3119
+ ay0, ay1 = abc_bbox.y0, abc_bbox.y1
3074
3120
  tx0, tx1 = title_bbox.x0, title_bbox.x1
3075
- if tx0 < ax1 + abc_title_sep and tx1 > ax0 - abc_title_sep:
3121
+ ty0, ty1 = title_bbox.y0, title_bbox.y1
3122
+ if (
3123
+ tx0 < ax1 + abc_title_sep
3124
+ and tx1 > ax0 - abc_title_sep
3125
+ and ty0 < ay1
3126
+ and ty1 > ay0
3127
+ ):
3076
3128
  base_x = title_obj.get_position()[0]
3077
3129
  ha = title_obj.get_ha()
3078
3130
  max_width = 0
@@ -3380,6 +3432,7 @@ class Axes(_ExternalModeMixin, maxes.Axes):
3380
3432
  self._colorbar_fill.update_ticks(manual_only=True) # only if needed
3381
3433
  if self._inset_parent is not None and self._inset_zoom:
3382
3434
  self.indicate_inset_zoom()
3435
+ self._apply_align_text(renderer)
3383
3436
  needs_inset_reflow = bool(getattr(self, "_inset_colorbar_needs_reflow", False))
3384
3437
  has_inset_frame = bool(
3385
3438
  getattr(self, "_inset_colorbar_frame", None) is not None
@@ -3417,6 +3470,7 @@ class Axes(_ExternalModeMixin, maxes.Axes):
3417
3470
  self._colorbar_fill.update_ticks(manual_only=True) # only if needed
3418
3471
  if self._inset_parent is not None and self._inset_zoom:
3419
3472
  self.indicate_inset_zoom()
3473
+ self._apply_align_text(renderer)
3420
3474
  bbox = super().get_tightbbox(renderer, *args, **kwargs)
3421
3475
  fig = self.figure
3422
3476
  if (
@@ -4047,6 +4101,7 @@ class Axes(_ExternalModeMixin, maxes.Axes):
4047
4101
  def text(
4048
4102
  self,
4049
4103
  *args,
4104
+ avoid_overlap=None,
4050
4105
  border=False,
4051
4106
  bbox=False,
4052
4107
  bordercolor="w",
@@ -4074,6 +4129,10 @@ class Axes(_ExternalModeMixin, maxes.Axes):
4074
4129
 
4075
4130
  Other parameters
4076
4131
  ----------------
4132
+ avoid_overlap : bool, default: :rc:`text.align`
4133
+ Whether to automatically nudge this text at draw time so it does not
4134
+ overlap other auto-aligned text or the plotted data. See
4135
+ `~ultraplot.axes.Axes.auto_align_text` for the solver settings.
4077
4136
  border : bool, default: False
4078
4137
  Whether to draw border around text.
4079
4138
  borderwidth : float, default: 2
@@ -4103,6 +4162,7 @@ class Axes(_ExternalModeMixin, maxes.Axes):
4103
4162
  See also
4104
4163
  --------
4105
4164
  matplotlib.axes.Axes.text
4165
+ ultraplot.axes.Axes.auto_align_text
4106
4166
  """
4107
4167
  # Translate positional args
4108
4168
  # Audo-redirect to text2D for 3D axes if not enough arguments passed
@@ -4171,8 +4231,127 @@ class Axes(_ExternalModeMixin, maxes.Axes):
4171
4231
  "bboxpad": bboxpad,
4172
4232
  }
4173
4233
  )
4234
+ self._register_align_text(obj, avoid_overlap)
4235
+ return obj
4236
+
4237
+ def _register_align_text(self, obj, avoid_overlap=None):
4238
+ """
4239
+ Queue a text object for draw-time overlap avoidance, or release it.
4240
+ """
4241
+ # The solver moves a label by inverting its transform, which only means
4242
+ # anything for text that its transform actually positions. A Text3D is
4243
+ # placed by the 3D projection instead, and its stored position is the data
4244
+ # coordinate that feeds it, so a display-space nudge would not move the
4245
+ # label -- it would rewrite the data point.
4246
+ if hasattr(obj, "get_position_3d"):
4247
+ return obj
4248
+ # An explicit avoid_overlap=False beats the rc setting, so opting out is
4249
+ # always available. Releasing a label also puts it back where the user
4250
+ # asked for it, rather than stranding it wherever the solver left it.
4251
+ if _not_none(avoid_overlap, rc["text.align"]):
4252
+ if obj not in self._align_texts:
4253
+ self._align_texts.append(obj)
4254
+ else:
4255
+ if obj in self._align_texts:
4256
+ self._align_texts.remove(obj)
4257
+ from ..textalign import _reset_label
4258
+
4259
+ if hasattr(obj, "_uplt_align_anchor"):
4260
+ _reset_label(obj)
4261
+ self.stale = True
4174
4262
  return obj
4175
4263
 
4264
+ def auto_align_text(self, *objs, **kwargs):
4265
+ """
4266
+ Automatically reposition text so that it does not overlap.
4267
+
4268
+ Labels are relaxed away from each other, from the plotted data and from
4269
+ the axes edges at draw time, then pulled back towards where you put them.
4270
+ Because the solver runs on every draw, the layout stays valid when the
4271
+ figure is resized or the data limits change.
4272
+
4273
+ Parameters
4274
+ ----------
4275
+ *objs : `~matplotlib.text.Text`, optional
4276
+ The text or annotation objects to align. Default is every text
4277
+ created with ``avoid_overlap=True`` plus, if none were, all the text
4278
+ you added to the axes.
4279
+ pad : float, default: :rc:`text.align.pad`
4280
+ Padding in points kept around each label.
4281
+ avoid_points : bool, default: True
4282
+ Whether labels also repel the data points of lines and scatter plots.
4283
+ avoid : sequence of `~matplotlib.artist.Artist`, optional
4284
+ Extra artists whose bounding boxes the labels must stay clear of.
4285
+ only_move : {'xy', 'x', 'y'}, default: 'xy'
4286
+ Restrict movement to one axis. Use ``'y'`` when the horizontal
4287
+ position of a label carries meaning, as on a time series.
4288
+ max_iter : int, default: :rc:`text.align.maxiter`
4289
+ Maximum number of relaxation iterations.
4290
+ spring : float, default: 0.05
4291
+ Strength of the pull back towards the original position. Larger
4292
+ values keep labels closer to their anchors at the cost of overlap.
4293
+ step : float, default: 0.6
4294
+ Damping applied to each iteration's displacement.
4295
+ clip : bool, default: True
4296
+ Whether to keep labels inside the axes.
4297
+ arrows : bool or dict, default: :rc:`text.align.arrows`
4298
+ Whether to draw a connector from each displaced label back to the
4299
+ point it labels. A dict is passed to `~matplotlib.patches.FancyArrowPatch`.
4300
+ min_arrow_dist : float, default: 8.0
4301
+ Only draw connectors for labels displaced further than this, in points.
4302
+
4303
+ Examples
4304
+ --------
4305
+ >>> import ultraplot as uplt
4306
+ >>> fig, ax = uplt.subplots()
4307
+ >>> ax.scatter(x, y)
4308
+ >>> for xi, yi, name in zip(x, y, names):
4309
+ ... ax.text(xi, yi, name)
4310
+ >>> ax.auto_align_text()
4311
+
4312
+ See also
4313
+ --------
4314
+ ultraplot.axes.Axes.text
4315
+ ultraplot.axes.Axes.annotate
4316
+ """
4317
+ objs = [obj for arg in objs for obj in (arg if np.iterable(arg) else (arg,))]
4318
+ if objs:
4319
+ self._align_texts = list(objs)
4320
+ elif not self._align_texts:
4321
+ # Titles and a-b-c labels live in self.texts but are positioned by the
4322
+ # layout engine, so they are not ours to move.
4323
+ titles = set(map(id, self._title_dict.values()))
4324
+ self._align_texts = [
4325
+ t for t in self.texts if id(t) not in titles and t.get_text().strip()
4326
+ ]
4327
+ self._align_kwargs = kwargs
4328
+ self.stale = True
4329
+ return self._align_texts
4330
+
4331
+ def _apply_align_text(self, renderer):
4332
+ """
4333
+ Run the overlap solver for this axes (called on every draw).
4334
+ """
4335
+ if not self._align_texts:
4336
+ # Every label was released; take their connectors with them
4337
+ for patch in self._align_arrows:
4338
+ with contextlib.suppress(Exception):
4339
+ patch.remove()
4340
+ self._align_arrows = []
4341
+ return
4342
+ from ..textalign import align_text
4343
+
4344
+ kwargs = {
4345
+ "pad": rc["text.align.pad"],
4346
+ "max_iter": rc["text.align.maxiter"],
4347
+ "arrows": rc["text.align.arrows"],
4348
+ **self._align_kwargs,
4349
+ }
4350
+ try:
4351
+ align_text(self, self._align_texts, renderer=renderer, **kwargs)
4352
+ except Exception as err: # never let label polish break a render
4353
+ warnings._warn_ultraplot(f"Failed to auto-align text: {err}")
4354
+
4176
4355
  @docstring._concatenate_inherited
4177
4356
  def annotate(
4178
4357
  self,
@@ -4190,16 +4369,24 @@ class Axes(_ExternalModeMixin, maxes.Axes):
4190
4369
  textcoords: Optional[Union[str, mtransforms.Transform]] = None,
4191
4370
  arrowprops: Optional[dict[str, Any]] = None,
4192
4371
  annotation_clip: Optional[bool] = None,
4372
+ avoid_overlap: Optional[bool] = None,
4193
4373
  **kwargs: Any,
4194
4374
  ) -> Union[mtext.Annotation, "CurvedText"]:
4195
4375
  """
4196
4376
  Add an annotation. If `xy` is a pair of 1D arrays, draw curved text.
4197
4377
 
4198
4378
  For curved input with `arrowprops`, the arrow points to the curve center.
4379
+
4380
+ Parameters
4381
+ ----------
4382
+ avoid_overlap : bool, default: :rc:`text.align`
4383
+ Whether to automatically nudge this annotation at draw time so it
4384
+ does not overlap other auto-aligned text or the plotted data. See
4385
+ `~ultraplot.axes.Axes.auto_align_text`.
4199
4386
  """
4200
4387
  curve_xy = self._coerce_curve_xy_from_xy_arg(xy)
4201
4388
  if curve_xy is None:
4202
- return super().annotate(
4389
+ obj = super().annotate(
4203
4390
  text,
4204
4391
  xy=xy,
4205
4392
  xytext=xytext,
@@ -4209,6 +4396,7 @@ class Axes(_ExternalModeMixin, maxes.Axes):
4209
4396
  annotation_clip=annotation_clip,
4210
4397
  **kwargs,
4211
4398
  )
4399
+ return self._register_align_text(obj, avoid_overlap)
4212
4400
 
4213
4401
  x_curve, y_curve = curve_xy
4214
4402
  try: