ultraplot 2.1.0__tar.gz → 2.1.3__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 (446) hide show
  1. {ultraplot-2.1.0 → ultraplot-2.1.3}/.github/workflows/build-ultraplot.yml +1 -1
  2. {ultraplot-2.1.0 → ultraplot-2.1.3}/.github/workflows/publish-pypi.yml +3 -3
  3. {ultraplot-2.1.0/ultraplot.egg-info → ultraplot-2.1.3}/PKG-INFO +1 -1
  4. {ultraplot-2.1.0 → ultraplot-2.1.3}/codecov.yml +2 -0
  5. ultraplot-2.1.3/ultraplot/_version.py +1 -0
  6. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/axes/base.py +98 -14
  7. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/axes/plot.py +49 -14
  8. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/axes/three.py +8 -0
  9. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/colorbar.py +10 -2
  10. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/gridspec.py +3 -1
  11. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/internals/__init__.py +37 -11
  12. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/legend.py +103 -33
  13. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_2dplots.py +121 -0
  14. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_colorbar.py +47 -0
  15. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_gridspec.py +19 -0
  16. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_legend.py +21 -0
  17. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_plot.py +16 -0
  18. {ultraplot-2.1.0 → ultraplot-2.1.3/ultraplot.egg-info}/PKG-INFO +1 -1
  19. ultraplot-2.1.0/ultraplot/_version.py +0 -1
  20. {ultraplot-2.1.0 → ultraplot-2.1.3}/.github/ISSUE_TEMPLATE.md +0 -0
  21. {ultraplot-2.1.0 → ultraplot-2.1.3}/.github/dependabot.yml +0 -0
  22. {ultraplot-2.1.0 → ultraplot-2.1.3}/.github/micromamba-condarc.yml +0 -0
  23. {ultraplot-2.1.0 → ultraplot-2.1.3}/.github/workflows/main.yml +0 -0
  24. {ultraplot-2.1.0 → ultraplot-2.1.3}/.github/workflows/test-map.yml +0 -0
  25. {ultraplot-2.1.0 → ultraplot-2.1.3}/.gitignore +0 -0
  26. {ultraplot-2.1.0 → ultraplot-2.1.3}/.pre-commit-config.yaml +0 -0
  27. {ultraplot-2.1.0 → ultraplot-2.1.3}/.readthedocs.yml +0 -0
  28. {ultraplot-2.1.0 → ultraplot-2.1.3}/.zenodo.json +0 -0
  29. {ultraplot-2.1.0 → ultraplot-2.1.3}/CITATION.cff +0 -0
  30. {ultraplot-2.1.0 → ultraplot-2.1.3}/CODEOFCONDUCT.md +0 -0
  31. {ultraplot-2.1.0 → ultraplot-2.1.3}/CONTRIBUTING.rst +0 -0
  32. {ultraplot-2.1.0 → ultraplot-2.1.3}/INSTALL.rst +0 -0
  33. {ultraplot-2.1.0 → ultraplot-2.1.3}/LICENSE.txt +0 -0
  34. {ultraplot-2.1.0 → ultraplot-2.1.3}/README.rst +0 -0
  35. {ultraplot-2.1.0 → ultraplot-2.1.3}/UltraPlotLogo.svg +0 -0
  36. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/1dplots.py +0 -0
  37. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/2dplots.py +0 -0
  38. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/Makefile +0 -0
  39. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_ext/notoc.py +0 -0
  40. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_scripts/fetch_releases.py +0 -0
  41. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_static/custom.css +0 -0
  42. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_static/custom.js +0 -0
  43. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_static/example_plots/cartesian_example.svg +0 -0
  44. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_static/example_plots/colorbars_legends_example.svg +0 -0
  45. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_static/example_plots/colormaps_example.svg +0 -0
  46. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_static/example_plots/panels_example.svg +0 -0
  47. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_static/example_plots/projection_example.svg +0 -0
  48. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_static/example_plots/subplot_example.svg +0 -0
  49. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_static/logo_blank.svg +0 -0
  50. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_static/logo_long.png +0 -0
  51. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_static/logo_long.svg +0 -0
  52. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_static/logo_social.png +0 -0
  53. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_static/logo_social.svg +0 -0
  54. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_static/logo_square.png +0 -0
  55. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/_templates/whatsnew_sidebar.html +0 -0
  56. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/about.rst +0 -0
  57. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/api.rst +0 -0
  58. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/basics.py +0 -0
  59. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/cartesian.py +0 -0
  60. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/colorbars_legends.py +0 -0
  61. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/colormaps.py +0 -0
  62. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/colors.py +0 -0
  63. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/conf.py +0 -0
  64. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/configuration.rst +0 -0
  65. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/contributing.rst +0 -0
  66. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/cycles.py +0 -0
  67. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/README.txt +0 -0
  68. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/colors/01_cycle_colormap.py +0 -0
  69. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/colors/02_diverging_colormap.py +0 -0
  70. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/colors/README.txt +0 -0
  71. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/geo/01_robin_tracks.py +0 -0
  72. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/geo/02_orthographic_views.py +0 -0
  73. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/geo/03_projections_features.py +0 -0
  74. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/geo/README.txt +0 -0
  75. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/layouts/01_shared_axes_abc.py +0 -0
  76. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/layouts/02_complex_layout_insets.py +0 -0
  77. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/layouts/03_spanning_labels.py +0 -0
  78. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/layouts/README.txt +0 -0
  79. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/legends_colorbars/01_multi_colorbars.py +0 -0
  80. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/legends_colorbars/02_legend_inset_colorbar.py +0 -0
  81. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/legends_colorbars/03_semantic_legends.py +0 -0
  82. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/legends_colorbars/README.txt +0 -0
  83. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/plot_types/01_curved_quiver.py +0 -0
  84. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/plot_types/02_network_graph.py +0 -0
  85. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/plot_types/03_lollipop.py +0 -0
  86. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/plot_types/04_datetime_series.py +0 -0
  87. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/plot_types/05_box_violin.py +0 -0
  88. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/plot_types/06_ridge_plot.py +0 -0
  89. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/plot_types/07_radar.py +0 -0
  90. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/plot_types/07_sankey.py +0 -0
  91. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/plot_types/08_chord_diagram.py +0 -0
  92. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/plot_types/08_ternary.py +0 -0
  93. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/plot_types/09_phylogeny.py +0 -0
  94. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/plot_types/10_circos_bed.py +0 -0
  95. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/plot_types/11_topic_ribbon.py +0 -0
  96. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/examples/plot_types/README.txt +0 -0
  97. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/external-links.rst +0 -0
  98. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/faq.rst +0 -0
  99. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/fonts.py +0 -0
  100. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/index.rst +0 -0
  101. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/insets_panels.py +0 -0
  102. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/install.rst +0 -0
  103. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/lazy_loading.rst +0 -0
  104. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/make.bat +0 -0
  105. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/networks.py +0 -0
  106. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/projections.py +0 -0
  107. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/requirements-rtd.txt +0 -0
  108. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/sphinxext/custom_roles.py +0 -0
  109. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/stats.py +0 -0
  110. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/subplots.py +0 -0
  111. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/ultraplotrc +0 -0
  112. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/usage.rst +0 -0
  113. {ultraplot-2.1.0 → ultraplot-2.1.3}/docs/why.rst +0 -0
  114. {ultraplot-2.1.0 → ultraplot-2.1.3}/environment.yml +0 -0
  115. {ultraplot-2.1.0 → ultraplot-2.1.3}/logo/PermanentMarker-Regular.ttf +0 -0
  116. {ultraplot-2.1.0 → ultraplot-2.1.3}/logo/environment-logo.yml +0 -0
  117. {ultraplot-2.1.0 → ultraplot-2.1.3}/logo/logo.py +0 -0
  118. {ultraplot-2.1.0 → ultraplot-2.1.3}/logo/run-linter.sh +0 -0
  119. {ultraplot-2.1.0 → ultraplot-2.1.3}/logo/webicon.py +0 -0
  120. {ultraplot-2.1.0 → ultraplot-2.1.3}/logo/whyUltraPlot.svg +0 -0
  121. {ultraplot-2.1.0 → ultraplot-2.1.3}/noxfile.py +0 -0
  122. {ultraplot-2.1.0 → ultraplot-2.1.3}/pyproject.toml +0 -0
  123. {ultraplot-2.1.0 → ultraplot-2.1.3}/requirements-minimal.txt +0 -0
  124. {ultraplot-2.1.0 → ultraplot-2.1.3}/setup.cfg +0 -0
  125. {ultraplot-2.1.0 → ultraplot-2.1.3}/tools/ci/build_test_map.py +0 -0
  126. {ultraplot-2.1.0 → ultraplot-2.1.3}/tools/ci/select_tests.py +0 -0
  127. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/__init__.py +0 -0
  128. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/_lazy.py +0 -0
  129. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/axes/__init__.py +0 -0
  130. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/axes/cartesian.py +0 -0
  131. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/axes/container.py +0 -0
  132. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/axes/geo.py +0 -0
  133. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/axes/plot_types/__init__.py +0 -0
  134. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/axes/plot_types/circlize.py +0 -0
  135. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/axes/plot_types/curved_quiver.py +0 -0
  136. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/axes/plot_types/ribbon.py +0 -0
  137. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/axes/plot_types/sankey.py +0 -0
  138. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/axes/polar.py +0 -0
  139. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/axes/shared.py +0 -0
  140. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Algae.rgb +0 -0
  141. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Amp.rgb +0 -0
  142. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/BR.rgb +0 -0
  143. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Balance.rgb +0 -0
  144. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Blues1_r.xml +0 -0
  145. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Blues2.xml +0 -0
  146. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Blues3.xml +0 -0
  147. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Blues4_r.xml +0 -0
  148. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Blues5.xml +0 -0
  149. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Blues6.xml +0 -0
  150. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Blues7.xml +0 -0
  151. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Blues8.xml +0 -0
  152. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Blues9.xml +0 -0
  153. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Boreal.json +0 -0
  154. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Browns1.xml +0 -0
  155. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Browns2.xml +0 -0
  156. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Browns3.xml +0 -0
  157. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Browns4.xml +0 -0
  158. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Browns5.xml +0 -0
  159. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Browns6.xml +0 -0
  160. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Browns7.xml +0 -0
  161. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Browns8.xml +0 -0
  162. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Browns9.xml +0 -0
  163. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/ColdHot.rgb +0 -0
  164. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Crest.rgb +0 -0
  165. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Curl.rgb +0 -0
  166. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Deep.rgb +0 -0
  167. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Delta.rgb +0 -0
  168. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Dense.rgb +0 -0
  169. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Div.json +0 -0
  170. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/DryWet.json +0 -0
  171. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Dusk.json +0 -0
  172. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Fire.json +0 -0
  173. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Flare.rgb +0 -0
  174. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Glacial.json +0 -0
  175. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Greens1_r.xml +0 -0
  176. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Greens2.xml +0 -0
  177. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Greens3_r.xml +0 -0
  178. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Greens4.xml +0 -0
  179. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Greens5.xml +0 -0
  180. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Greens6_r.xml +0 -0
  181. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Greens7.xml +0 -0
  182. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Greens8.xml +0 -0
  183. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Haline.rgb +0 -0
  184. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Ice.rgb +0 -0
  185. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/IceFire.rgb +0 -0
  186. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Mako.rgb +0 -0
  187. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Marine.json +0 -0
  188. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Matter.rgb +0 -0
  189. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Mono.txt +0 -0
  190. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/MonoCycle.txt +0 -0
  191. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/NegPos.json +0 -0
  192. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Oranges1.xml +0 -0
  193. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Oranges2.xml +0 -0
  194. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Oranges3.xml +0 -0
  195. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Oranges4.xml +0 -0
  196. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Oxy.rgb +0 -0
  197. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Phase.rgb +0 -0
  198. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Purples1_r.xml +0 -0
  199. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Purples2.xml +0 -0
  200. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Purples3.xml +0 -0
  201. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Reds1.xml +0 -0
  202. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Reds2.xml +0 -0
  203. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Reds3.xml +0 -0
  204. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Reds4.xml +0 -0
  205. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Reds5.xml +0 -0
  206. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Rocket.rgb +0 -0
  207. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Solar.rgb +0 -0
  208. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Speed.rgb +0 -0
  209. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Stellar.json +0 -0
  210. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Sunrise.json +0 -0
  211. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Sunset.json +0 -0
  212. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Tempo.rgb +0 -0
  213. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Thermal.rgb +0 -0
  214. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Turbid.rgb +0 -0
  215. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Vivid.xml +0 -0
  216. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Vlag.rgb +0 -0
  217. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Yellows1.xml +0 -0
  218. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Yellows2.xml +0 -0
  219. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Yellows3.xml +0 -0
  220. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/Yellows4.xml +0 -0
  221. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/acton.txt +0 -0
  222. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/bam.txt +0 -0
  223. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/bamO.txt +0 -0
  224. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/bamako.txt +0 -0
  225. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/batlow.txt +0 -0
  226. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/batlowK.txt +0 -0
  227. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/batlowW.txt +0 -0
  228. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/berlin.txt +0 -0
  229. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/bilbao.txt +0 -0
  230. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/broc.txt +0 -0
  231. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/brocO.txt +0 -0
  232. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/buda.txt +0 -0
  233. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/bukavu.txt +0 -0
  234. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/cork.txt +0 -0
  235. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/corkO.txt +0 -0
  236. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/davos.txt +0 -0
  237. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/devon.txt +0 -0
  238. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/fes.txt +0 -0
  239. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/hawaii.txt +0 -0
  240. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/imola.txt +0 -0
  241. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/lajolla.txt +0 -0
  242. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/lapaz.txt +0 -0
  243. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/lisbon.txt +0 -0
  244. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/nuuk.txt +0 -0
  245. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/oleron.txt +0 -0
  246. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/oslo.txt +0 -0
  247. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/roma.txt +0 -0
  248. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/romaO.txt +0 -0
  249. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/tofino.txt +0 -0
  250. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/tokyo.txt +0 -0
  251. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/turku.txt +0 -0
  252. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/vanimo.txt +0 -0
  253. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/vik.txt +0 -0
  254. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cmaps/vikO.txt +0 -0
  255. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/colors/opencolor.txt +0 -0
  256. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/colors/xkcd.txt +0 -0
  257. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/colors.py +0 -0
  258. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/config.py +0 -0
  259. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/constructor.py +0 -0
  260. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cycles/538.hex +0 -0
  261. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cycles/FlatUI.hex +0 -0
  262. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cycles/Qual1.rgb +0 -0
  263. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cycles/Qual2.rgb +0 -0
  264. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cycles/bmh.hex +0 -0
  265. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cycles/classic.hex +0 -0
  266. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cycles/colorblind.hex +0 -0
  267. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cycles/colorblind10.hex +0 -0
  268. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cycles/default.hex +0 -0
  269. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cycles/ggplot.hex +0 -0
  270. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cycles/seaborn.hex +0 -0
  271. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/cycles/tableau.hex +0 -0
  272. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/demos.py +0 -0
  273. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/externals/__init__.py +0 -0
  274. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/externals/hsluv.py +0 -0
  275. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/figure.py +0 -0
  276. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraMath-Bold.ttf +0 -0
  277. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraMath-ExtraLight.ttf +0 -0
  278. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraMath-Heavy.ttf +0 -0
  279. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraMath-Light.ttf +0 -0
  280. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraMath-Medium.ttf +0 -0
  281. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraMath-Regular.ttf +0 -0
  282. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraMath-SemiBold.ttf +0 -0
  283. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraMath-UltraLight.ttf +0 -0
  284. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-Black.ttf +0 -0
  285. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-BlackItalic.ttf +0 -0
  286. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-Bold.ttf +0 -0
  287. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-BoldItalic.ttf +0 -0
  288. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-ExtraBold.ttf +0 -0
  289. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-ExtraBoldItalic.ttf +0 -0
  290. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-ExtraLight.ttf +0 -0
  291. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-ExtraLightItalic.ttf +0 -0
  292. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-Italic.ttf +0 -0
  293. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-Light.ttf +0 -0
  294. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-LightItalic.ttf +0 -0
  295. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-Medium.ttf +0 -0
  296. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-MediumItalic.ttf +0 -0
  297. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-Regular.ttf +0 -0
  298. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-SemiBold.ttf +0 -0
  299. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/FiraSans-SemiBoldItalic.ttf +0 -0
  300. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/LICENSE_FIRAMATH.txt +0 -0
  301. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/LICENSE_FIRASANS.txt +0 -0
  302. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/LICENSE_NOTOSANS.txt +0 -0
  303. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/LICENSE_NOTOSERIF.txt +0 -0
  304. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/LICENSE_OPENSANS.txt +0 -0
  305. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/LICENSE_ROBOTO.txt +0 -0
  306. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/LICENSE_SOURCESANS.txt +0 -0
  307. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/LICENSE_SOURCESERIF.txt +0 -0
  308. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/LICENSE_TEXGYRE.txt +0 -0
  309. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/LICENSE_UBUNTU.txt +0 -0
  310. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/NotoSans-Bold.ttf +0 -0
  311. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/NotoSans-BoldItalic.ttf +0 -0
  312. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/NotoSans-Italic.ttf +0 -0
  313. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/NotoSans-Regular.ttf +0 -0
  314. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/NotoSerif-Bold.ttf +0 -0
  315. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/NotoSerif-BoldItalic.ttf +0 -0
  316. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/NotoSerif-Italic.ttf +0 -0
  317. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/NotoSerif-Regular.ttf +0 -0
  318. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/OpenSans-Bold.ttf +0 -0
  319. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/OpenSans-BoldItalic.ttf +0 -0
  320. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/OpenSans-Italic.ttf +0 -0
  321. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/OpenSans-Regular.ttf +0 -0
  322. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/OpenSans-Semibold.ttf +0 -0
  323. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/OpenSans-SemiboldItalic.ttf +0 -0
  324. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Roboto-Black.ttf +0 -0
  325. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Roboto-BlackItalic.ttf +0 -0
  326. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Roboto-Bold.ttf +0 -0
  327. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Roboto-BoldItalic.ttf +0 -0
  328. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Roboto-Italic.ttf +0 -0
  329. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Roboto-Light.ttf +0 -0
  330. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Roboto-LightItalic.ttf +0 -0
  331. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Roboto-Medium.ttf +0 -0
  332. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Roboto-MediumItalic.ttf +0 -0
  333. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Roboto-Regular.ttf +0 -0
  334. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSansPro-Black.ttf +0 -0
  335. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSansPro-BlackItalic.ttf +0 -0
  336. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSansPro-Bold.ttf +0 -0
  337. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSansPro-BoldItalic.ttf +0 -0
  338. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSansPro-ExtraLight.ttf +0 -0
  339. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSansPro-ExtraLightItalic.ttf +0 -0
  340. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSansPro-Italic.ttf +0 -0
  341. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSansPro-Light.ttf +0 -0
  342. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSansPro-LightItalic.ttf +0 -0
  343. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSansPro-Regular.ttf +0 -0
  344. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSansPro-SemiBold.ttf +0 -0
  345. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSansPro-SemiBoldItalic.ttf +0 -0
  346. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSerifPro-Black.ttf +0 -0
  347. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSerifPro-BlackItalic.ttf +0 -0
  348. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSerifPro-Bold.ttf +0 -0
  349. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSerifPro-BoldItalic.ttf +0 -0
  350. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSerifPro-ExtraLight.ttf +0 -0
  351. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSerifPro-ExtraLightItalic.ttf +0 -0
  352. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSerifPro-Italic.ttf +0 -0
  353. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSerifPro-Light.ttf +0 -0
  354. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSerifPro-LightItalic.ttf +0 -0
  355. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSerifPro-Regular.ttf +0 -0
  356. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSerifPro-SemiBold.ttf +0 -0
  357. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/SourceSerifPro-SemiBoldItalic.ttf +0 -0
  358. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Ubuntu-Bold.ttf +0 -0
  359. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Ubuntu-BoldItalic.ttf +0 -0
  360. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Ubuntu-Italic.ttf +0 -0
  361. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Ubuntu-Light.ttf +0 -0
  362. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Ubuntu-LightItalic.ttf +0 -0
  363. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Ubuntu-Medium.ttf +0 -0
  364. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Ubuntu-MediumItalic.ttf +0 -0
  365. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/Ubuntu-Regular.ttf +0 -0
  366. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyreadventor-bold.ttf +0 -0
  367. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyreadventor-bolditalic.ttf +0 -0
  368. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyreadventor-italic.ttf +0 -0
  369. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyreadventor-regular.ttf +0 -0
  370. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyrebonum-bold.ttf +0 -0
  371. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyrebonum-bolditalic.ttf +0 -0
  372. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyrebonum-italic.ttf +0 -0
  373. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyrebonum-regular.ttf +0 -0
  374. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyrechorus-mediumitalic.ttf +0 -0
  375. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyrecursor-bold.ttf +0 -0
  376. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyrecursor-bolditalic.ttf +0 -0
  377. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyrecursor-italic.ttf +0 -0
  378. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyrecursor-regular.ttf +0 -0
  379. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyreheros-bold.ttf +0 -0
  380. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyreheros-bolditalic.ttf +0 -0
  381. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyreheros-italic.ttf +0 -0
  382. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyreheros-regular.ttf +0 -0
  383. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyrepagella-bold.ttf +0 -0
  384. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyrepagella-bolditalic.ttf +0 -0
  385. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyrepagella-italic.ttf +0 -0
  386. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyrepagella-regular.ttf +0 -0
  387. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyreschola-bold.ttf +0 -0
  388. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyreschola-bolditalic.ttf +0 -0
  389. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyreschola-italic.ttf +0 -0
  390. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyreschola-regular.ttf +0 -0
  391. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyretermes-bold.ttf +0 -0
  392. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyretermes-bolditalic.ttf +0 -0
  393. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyretermes-italic.ttf +0 -0
  394. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/fonts/texgyretermes-regular.ttf +0 -0
  395. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/internals/benchmarks.py +0 -0
  396. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/internals/context.py +0 -0
  397. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/internals/docstring.py +0 -0
  398. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/internals/fonts.py +0 -0
  399. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/internals/guides.py +0 -0
  400. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/internals/inputs.py +0 -0
  401. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/internals/labels.py +0 -0
  402. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/internals/rcsetup.py +0 -0
  403. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/internals/versions.py +0 -0
  404. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/internals/warnings.py +0 -0
  405. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/proj.py +0 -0
  406. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/scale.py +0 -0
  407. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/__init__.py +0 -0
  408. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/conftest.py +0 -0
  409. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_1dplots.py +0 -0
  410. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_animation.py +0 -0
  411. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_axes.py +0 -0
  412. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_base.py +0 -0
  413. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_circlize_integration.py +0 -0
  414. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_colormap.py +0 -0
  415. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_colors.py +0 -0
  416. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_config.py +0 -0
  417. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_constructor.py +0 -0
  418. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_demos.py +0 -0
  419. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_docs.py +0 -0
  420. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_external_axes_container_integration.py +0 -0
  421. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_external_container_edge_cases.py +0 -0
  422. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_external_container_mocked.py +0 -0
  423. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_figure.py +0 -0
  424. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_fonts.py +0 -0
  425. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_format.py +0 -0
  426. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_geographic.py +0 -0
  427. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_handlers.py +0 -0
  428. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_imports.py +0 -0
  429. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_imshow.py +0 -0
  430. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_inputs.py +0 -0
  431. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_inset.py +0 -0
  432. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_integration.py +0 -0
  433. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_projections.py +0 -0
  434. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_statistical_plotting.py +0 -0
  435. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_subplots.py +0 -0
  436. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_tickers.py +0 -0
  437. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/tests/test_ultralayout.py +0 -0
  438. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/text.py +0 -0
  439. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/ticker.py +0 -0
  440. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/ui.py +0 -0
  441. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/ultralayout.py +0 -0
  442. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot/utils.py +0 -0
  443. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot.egg-info/SOURCES.txt +0 -0
  444. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot.egg-info/dependency_links.txt +0 -0
  445. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot.egg-info/requires.txt +0 -0
  446. {ultraplot-2.1.0 → ultraplot-2.1.3}/ultraplot.egg-info/top_level.txt +0 -0
@@ -327,7 +327,7 @@ jobs:
327
327
  # Return the html output of the comparison even if failed
328
328
  - name: Upload comparison failures
329
329
  if: always()
330
- uses: actions/upload-artifact@v6
330
+ uses: actions/upload-artifact@v7
331
331
  with:
332
332
  name: failed-comparisons-${{ inputs.python-version }}-${{ inputs.matplotlib-version }}-${{ github.sha }}
333
333
  path: results/*
@@ -54,7 +54,7 @@ jobs:
54
54
  shell: bash
55
55
 
56
56
  - name: Upload artifacts
57
- uses: actions/upload-artifact@v6
57
+ uses: actions/upload-artifact@v7
58
58
  with:
59
59
  name: dist-${{ github.sha }}-${{ github.run_id }}-${{ github.run_number }}
60
60
  path: dist/*
@@ -73,7 +73,7 @@ jobs:
73
73
  contents: read
74
74
  steps:
75
75
  - name: Download artifacts
76
- uses: actions/download-artifact@v7
76
+ uses: actions/download-artifact@v8
77
77
  with:
78
78
  name: dist-${{ github.sha }}-${{ github.run_id }}-${{ github.run_number }}
79
79
  path: dist
@@ -105,7 +105,7 @@ jobs:
105
105
  contents: read
106
106
  steps:
107
107
  - name: Download artifacts
108
- uses: actions/download-artifact@v7
108
+ uses: actions/download-artifact@v8
109
109
  with:
110
110
  name: dist-${{ github.sha }}-${{ github.run_id }}-${{ github.run_number }}
111
111
  path: dist
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultraplot
3
- Version: 2.1.0
3
+ Version: 2.1.3
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>
@@ -23,6 +23,8 @@ coverage:
23
23
  - "!logo/*"
24
24
  - "!docs/*"
25
25
  - "!ultraplot/tests/*"
26
+ - "!ultraplot/demos.py"
27
+
26
28
 
27
29
  tests:
28
30
  target: 95.0%
@@ -0,0 +1 @@
1
+ __version__ = '2.1.3'
@@ -515,9 +515,12 @@ format, formatter, ticklabels : formatter-spec, optional
515
515
  constructor function.
516
516
  formatter_kw : dict-like, optional
517
517
  Keyword arguments passed to `matplotlib.ticker.Formatter` class.
518
- frame, frameon : bool, default: :rc:`colorbar.frameon`
519
- For inset colorbars only. Indicates whether to draw a "frame",
520
- just like `~matplotlib.axes.Axes.legend`.
518
+ frame, frameon : bool, optional
519
+ For inset colorbars, indicates whether to draw a background "frame",
520
+ just like `~matplotlib.axes.Axes.legend`. Defaults to
521
+ :rc:`colorbar.frameon` for inset colorbars. For outer colorbars, this is a
522
+ backwards-compatible alias for `outline`; when omitted, outer colorbars
523
+ still default to :rc:`colorbar.outline`.
521
524
  tickminor : bool, optional
522
525
  Whether to add minor ticks using `~matplotlib.colorbar.ColorbarBase.minorticks_on`.
523
526
  tickloc, ticklocation : {'bottom', 'top', 'left', 'right'}, optional
@@ -553,7 +556,9 @@ rasterize : bool, default: :rc:`colorbar.rasterized`
553
556
  but ultraplot changes this to ``False`` since rasterization can cause misalignment
554
557
  between the color patches and the colorbar outline.
555
558
  outline : bool, None default : None
556
- Controls the visibility of the frame. When set to False, the spines of the colorbar are hidden. If set to `None` it uses the `rc['colorbar.outline']` value.
559
+ Controls the visibility of the outer colorbar outline. When set to False,
560
+ the spines of the colorbar are hidden. If set to `None` it uses the
561
+ `rc['colorbar.outline']` value.
557
562
  labelrotation : str, float, default: None
558
563
  Controls the rotation of the colorbar label. When set to None it takes on the value of `rc["colorbar.labelrotation"]`. When set to auto it produces a sensible default where the rotation is adjusted to where the colorbar is located. For example, a horizontal colorbar with a label to the left or right will match the horizontal alignment and rotate the label to 0 degrees. Users can provide a float to rotate to any arbitrary angle.
559
564
 
@@ -1130,6 +1135,8 @@ class Axes(_ExternalModeMixin, maxes.Axes):
1130
1135
  linewidth=None,
1131
1136
  edgefix=None,
1132
1137
  rasterized=None,
1138
+ frame: Optional[bool] = None,
1139
+ frameon: Optional[bool] = None,
1133
1140
  outline: Union[bool, None] = None,
1134
1141
  labelrotation: Union[str, float] = None,
1135
1142
  center_levels=None,
@@ -1191,6 +1198,8 @@ class Axes(_ExternalModeMixin, maxes.Axes):
1191
1198
  linewidth=linewidth,
1192
1199
  edgefix=edgefix,
1193
1200
  rasterized=rasterized,
1201
+ frame=frame,
1202
+ frameon=frameon,
1194
1203
  outline=outline,
1195
1204
  labelrotation=labelrotation,
1196
1205
  center_levels=center_levels,
@@ -1903,7 +1912,9 @@ class Axes(_ExternalModeMixin, maxes.Axes):
1903
1912
  Return the axes and adjusted keyword args for an inset colorbar.
1904
1913
  """
1905
1914
  # Basic colorbar properties
1906
- frame = _not_none(frame=frame, frameon=frameon, default=rc["colorbar.frameon"])
1915
+ frame_enabled = _not_none(
1916
+ frame=frame, frameon=frameon, default=rc["colorbar.frameon"]
1917
+ )
1907
1918
  length = _not_none(
1908
1919
  length=length, shrink=shrink, default=rc["colorbar.insetlength"]
1909
1920
  ) # noqa: E501
@@ -1967,8 +1978,9 @@ class Axes(_ExternalModeMixin, maxes.Axes):
1967
1978
  ax.set_axes_locator(locator)
1968
1979
  self.add_child_axes(ax)
1969
1980
  kw_frame, kwargs = self._parse_frame("colorbar", **kwargs)
1970
- if frame:
1971
- frame = self._add_guide_frame(
1981
+ frame_artist = None
1982
+ if frame_enabled:
1983
+ frame_artist = self._add_guide_frame(
1972
1984
  *bounds_frame, fontsize=tick_fontsize, **kw_frame
1973
1985
  )
1974
1986
  ax._inset_colorbar_layout = {
@@ -1984,7 +1996,7 @@ class Axes(_ExternalModeMixin, maxes.Axes):
1984
1996
  "pad_raw": pad_raw,
1985
1997
  }
1986
1998
  ax._inset_colorbar_parent = self
1987
- ax._inset_colorbar_frame = frame
1999
+ ax._inset_colorbar_frame = frame_artist
1988
2000
 
1989
2001
  kwargs.update({"orientation": orientation, "ticklocation": ticklocation})
1990
2002
  return ax, kwargs
@@ -3149,19 +3161,31 @@ class Axes(_ExternalModeMixin, maxes.Axes):
3149
3161
  self._colorbar_fill.update_ticks(manual_only=True) # only if needed
3150
3162
  if self._inset_parent is not None and self._inset_zoom:
3151
3163
  self.indicate_inset_zoom()
3164
+ needs_inset_reflow = bool(getattr(self, "_inset_colorbar_needs_reflow", False))
3165
+ has_inset_frame = bool(
3166
+ getattr(self, "_inset_colorbar_frame", None) is not None
3167
+ and getattr(self, "_inset_colorbar_obj", None)
3168
+ )
3152
3169
  super().draw(renderer, *args, **kwargs)
3153
- if getattr(self, "_inset_colorbar_obj", None) and getattr(
3154
- self, "_inset_colorbar_needs_reflow", False
3155
- ):
3156
- self._inset_colorbar_needs_reflow = False
3170
+ if has_inset_frame:
3171
+ if not needs_inset_reflow:
3172
+ needs_inset_reflow = _inset_colorbar_frame_needs_reflow(
3173
+ self._inset_colorbar_obj,
3174
+ labelloc=getattr(self, "_inset_colorbar_labelloc", None),
3175
+ renderer=renderer,
3176
+ )
3177
+ if has_inset_frame and needs_inset_reflow:
3157
3178
  _reflow_inset_colorbar_frame(
3158
3179
  self._inset_colorbar_obj,
3159
3180
  labelloc=getattr(self, "_inset_colorbar_labelloc", None),
3160
3181
  ticklen=getattr(
3161
3182
  self, "_inset_colorbar_ticklen", units(rc["tick.len"], "pt")
3162
3183
  ),
3184
+ renderer=renderer,
3163
3185
  )
3164
- self.figure.canvas.draw_idle()
3186
+ self._inset_colorbar_needs_reflow = False
3187
+ # Re-draw synchronously so the current render pass sees reflowed bounds.
3188
+ super().draw(renderer, *args, **kwargs)
3165
3189
 
3166
3190
  def get_tightbbox(self, renderer, *args, **kwargs):
3167
3191
  # Perform extra post-processing steps
@@ -4581,11 +4605,71 @@ def _apply_inset_colorbar_layout(
4581
4605
  frame.set_bounds(*bounds_frame)
4582
4606
 
4583
4607
 
4608
+ def _inset_colorbar_frame_needs_reflow(colorbar, *, labelloc: str, renderer) -> bool:
4609
+ cax = colorbar.ax
4610
+ layout = getattr(cax, "_inset_colorbar_layout", None)
4611
+ frame = getattr(cax, "_inset_colorbar_frame", None)
4612
+ if not layout or frame is None:
4613
+ return False
4614
+
4615
+ orientation = layout["orientation"]
4616
+ loc = layout["loc"]
4617
+ ticklocation = layout["ticklocation"]
4618
+ labelloc_layout = labelloc if isinstance(labelloc, str) else ticklocation
4619
+ bboxes = []
4620
+
4621
+ longaxis = _get_colorbar_long_axis(colorbar)
4622
+ try:
4623
+ bbox = longaxis.get_tightbbox(renderer)
4624
+ except Exception:
4625
+ bbox = None
4626
+ if bbox is not None:
4627
+ bboxes.append(bbox)
4628
+
4629
+ label_axis = _get_axis_for(
4630
+ labelloc_layout, loc, orientation=orientation, ax=colorbar
4631
+ )
4632
+ if label_axis.label.get_text():
4633
+ try:
4634
+ bboxes.append(label_axis.label.get_window_extent(renderer=renderer))
4635
+ except Exception:
4636
+ pass
4637
+
4638
+ for artist in (
4639
+ getattr(colorbar, "outline", None),
4640
+ getattr(colorbar, "solids", None),
4641
+ getattr(colorbar, "dividers", None),
4642
+ ):
4643
+ if artist is None:
4644
+ continue
4645
+ try:
4646
+ bboxes.append(artist.get_window_extent(renderer=renderer))
4647
+ except Exception:
4648
+ pass
4649
+
4650
+ if not bboxes:
4651
+ return False
4652
+
4653
+ x0 = min(bbox.x0 for bbox in bboxes)
4654
+ y0 = min(bbox.y0 for bbox in bboxes)
4655
+ x1 = max(bbox.x1 for bbox in bboxes)
4656
+ y1 = max(bbox.y1 for bbox in bboxes)
4657
+ frame_bbox = frame.get_window_extent(renderer=renderer)
4658
+ tol = 1.0
4659
+ return (
4660
+ frame_bbox.x0 > x0 + tol
4661
+ or frame_bbox.y0 > y0 + tol
4662
+ or frame_bbox.x1 < x1 - tol
4663
+ or frame_bbox.y1 < y1 - tol
4664
+ )
4665
+
4666
+
4584
4667
  def _reflow_inset_colorbar_frame(
4585
4668
  colorbar,
4586
4669
  *,
4587
4670
  labelloc: str,
4588
4671
  ticklen: float,
4672
+ renderer=None,
4589
4673
  ):
4590
4674
  cax = colorbar.ax
4591
4675
  layout = getattr(cax, "_inset_colorbar_layout", None)
@@ -4623,7 +4707,7 @@ def _reflow_inset_colorbar_frame(
4623
4707
  cb_width = width
4624
4708
  cb_height = length
4625
4709
 
4626
- renderer = cax.figure._get_renderer()
4710
+ renderer = renderer or cax.figure._get_renderer()
4627
4711
  if hasattr(colorbar, "update_ticks"):
4628
4712
  colorbar.update_ticks(manual_only=True)
4629
4713
  bboxes = []
@@ -4141,6 +4141,7 @@ class PlotAxes(base.Axes):
4141
4141
  # NOTE: Unlike xarray, but like matplotlib, vmin and vmax only approximately
4142
4142
  # determine level range. Levels are selected with Locator.tick_values().
4143
4143
  levels = None # unused
4144
+ explicit_limits = False
4144
4145
  isdiverging = False
4145
4146
  if not discrete and not skip_autolev:
4146
4147
  vmin, vmax, kwargs = self._parse_level_lim(
@@ -4150,7 +4151,15 @@ class PlotAxes(base.Axes):
4150
4151
  if abs(np.sign(vmax) - np.sign(vmin)) == 2:
4151
4152
  isdiverging = True
4152
4153
  if discrete:
4153
- levels, vmin, vmax, norm, norm_kw, kwargs = self._parse_level_vals(
4154
+ (
4155
+ levels,
4156
+ vmin,
4157
+ vmax,
4158
+ norm,
4159
+ norm_kw,
4160
+ explicit_limits,
4161
+ kwargs,
4162
+ ) = self._parse_level_vals(
4154
4163
  *args,
4155
4164
  vmin=vmin,
4156
4165
  vmax=vmax,
@@ -4199,6 +4208,7 @@ class PlotAxes(base.Axes):
4199
4208
  center_levels=center_levels,
4200
4209
  extend=extend,
4201
4210
  min_levels=min_levels,
4211
+ explicit_limits=explicit_limits,
4202
4212
  **kwargs,
4203
4213
  )
4204
4214
  params = _pop_params(kwargs, *self._level_parsers, ignore_internal=True)
@@ -4462,7 +4472,6 @@ class PlotAxes(base.Axes):
4462
4472
  center_levels = _not_none(center_levels, rc["colorbar.center_levels"])
4463
4473
  vmin = _not_none(vmin=vmin, norm_kw_vmin=norm_kw.pop("vmin", None))
4464
4474
  vmax = _not_none(vmax=vmax, norm_kw_vmax=norm_kw.pop("vmax", None))
4465
- norm = constructor.Norm(norm or "linear", **norm_kw)
4466
4475
  symmetric = _not_none(
4467
4476
  symmetric=symmetric,
4468
4477
  locator_kw_symmetric=locator_kw.pop("symmetric", None),
@@ -4555,6 +4564,8 @@ class PlotAxes(base.Axes):
4555
4564
  nozero=False,
4556
4565
  norm=None,
4557
4566
  norm_kw=None,
4567
+ vmin=None,
4568
+ vmax=None,
4558
4569
  skip_autolev=False,
4559
4570
  min_levels=None,
4560
4571
  center_levels=None,
@@ -4577,7 +4588,9 @@ class PlotAxes(base.Axes):
4577
4588
  Whether to remove out non-positive, non-negative, and zero-valued
4578
4589
  levels. The latter is useful for single-color contour plots.
4579
4590
  norm, norm_kw : optional
4580
- Passed to `Norm`. Used to possbily infer levels or to convert values.
4591
+ Passed to `Norm`. Used to possibly infer levels or to convert values.
4592
+ vmin, vmax : float, optional
4593
+ The user input normalization range.
4581
4594
  skip_autolev : bool, optional
4582
4595
  Whether to skip automatic level generation.
4583
4596
  min_levels : int, optional
@@ -4587,6 +4600,8 @@ class PlotAxes(base.Axes):
4587
4600
  -------
4588
4601
  levels : list of float
4589
4602
  The level edges.
4603
+ explicit_limits : bool
4604
+ Whether the user explicitly provided `vmin` and/or `vmax`.
4590
4605
  **kwargs
4591
4606
  Unused arguments.
4592
4607
  """
@@ -4625,7 +4640,9 @@ class PlotAxes(base.Axes):
4625
4640
  return array
4626
4641
 
4627
4642
  # Parse input arguments and resolve incompatibilities
4628
- vmin = vmax = None
4643
+ explicit_limits = vmin is not None or vmax is not None
4644
+ line_contours = min_levels == 1
4645
+ keep_explicit_line_limits = line_contours and explicit_limits
4629
4646
  levels = _not_none(N=N, levels=levels, norm_kw_levs=norm_kw.pop("levels", None))
4630
4647
  if positive and negative:
4631
4648
  warnings._warn_ultraplot(
@@ -4684,6 +4701,8 @@ class PlotAxes(base.Axes):
4684
4701
  levels, kwargs = self._parse_level_num(
4685
4702
  *args,
4686
4703
  levels=levels,
4704
+ vmin=vmin,
4705
+ vmax=vmax,
4687
4706
  norm=norm,
4688
4707
  norm_kw=norm_kw,
4689
4708
  extend=extend,
@@ -4696,8 +4715,8 @@ class PlotAxes(base.Axes):
4696
4715
  levels = values = None
4697
4716
 
4698
4717
  # Determine default colorbar locator and norm and apply filters
4699
- # NOTE: DiscreteNorm does not currently support vmin and
4700
- # vmax different from level list minimum and maximum.
4718
+ # NOTE: Preserve explicit vmin/vmax only for line contours, where levels
4719
+ # represent contour values rather than filled bins.
4701
4720
  # NOTE: The level restriction should have no effect if levels were generated
4702
4721
  # automatically. However want to apply these to manual-input levels as well.
4703
4722
  if levels is not None:
@@ -4705,15 +4724,21 @@ class PlotAxes(base.Axes):
4705
4724
  if len(levels) == 0: # skip
4706
4725
  pass
4707
4726
  elif len(levels) == 1: # use central colormap color
4708
- vmin, vmax = levels[0] - 1, levels[0] + 1
4727
+ if not keep_explicit_line_limits or vmin is None:
4728
+ vmin = levels[0] - 1
4729
+ if not keep_explicit_line_limits or vmax is None:
4730
+ vmax = levels[0] + 1
4709
4731
  else: # use minimum and maximum
4710
- vmin, vmax = np.min(levels), np.max(levels)
4732
+ if not keep_explicit_line_limits or vmin is None:
4733
+ vmin = np.min(levels)
4734
+ if not keep_explicit_line_limits or vmax is None:
4735
+ vmax = np.max(levels)
4711
4736
  if not np.allclose(levels[1] - levels[0], np.diff(levels)):
4712
4737
  norm = _not_none(norm, "segmented")
4713
4738
  if norm in ("segments", "segmented"):
4714
4739
  norm_kw["levels"] = levels
4715
4740
 
4716
- return levels, vmin, vmax, norm, norm_kw, kwargs
4741
+ return levels, vmin, vmax, norm, norm_kw, explicit_limits, kwargs
4717
4742
 
4718
4743
  @staticmethod
4719
4744
  def _parse_level_norm(
@@ -4726,6 +4751,7 @@ class PlotAxes(base.Axes):
4726
4751
  discrete_ticks=None,
4727
4752
  discrete_labels=None,
4728
4753
  center_levels=None,
4754
+ explicit_limits=False,
4729
4755
  **kwargs,
4730
4756
  ):
4731
4757
  """
@@ -4748,11 +4774,14 @@ class PlotAxes(base.Axes):
4748
4774
  The colorbar locations to tick.
4749
4775
  discrete_labels : array-like, optional
4750
4776
  The colorbar tick labels.
4777
+ explicit_limits : bool, optional
4778
+ Whether `vmin`/`vmax` were explicitly provided by the user.
4751
4779
 
4752
4780
  Returns
4753
4781
  -------
4754
- norm : `~ultraplot.colors.DiscreteNorm`
4755
- The discrete normalizer.
4782
+ norm : `~ultraplot.colors.DiscreteNorm` or `~matplotlib.colors.Normalize`
4783
+ The discrete normalizer, or the original continuous normalizer when
4784
+ line contours have explicit limits or use qualitative color lists.
4756
4785
  cmap : `~matplotlib.colors.Colormap`
4757
4786
  The possibly-modified colormap.
4758
4787
  kwargs
@@ -4814,10 +4843,16 @@ class PlotAxes(base.Axes):
4814
4843
  elif extend == "max":
4815
4844
  unique = "neither"
4816
4845
 
4817
- # Generate DiscreteNorm and update "child" norm with vmin and vmax from
4818
- # levels. This lets the colorbar set tick locations properly!
4846
+ # Generate DiscreteNorm for filled-contour style bins. For line contours
4847
+ # with explicit limits or qualitative color lists, keep the continuous
4848
+ # normalizer to preserve one-to-one value->color mapping.
4819
4849
  center_levels = _not_none(center_levels, rc["colorbar.center_levels"])
4820
- if not isinstance(norm, mcolors.BoundaryNorm) and len(levels) > 1:
4850
+ preserve_line_mapping = min_levels == 1 and (explicit_limits or qualitative)
4851
+ if (
4852
+ not preserve_line_mapping
4853
+ and not isinstance(norm, mcolors.BoundaryNorm)
4854
+ and len(levels) > 1
4855
+ ):
4821
4856
  norm = pcolors.DiscreteNorm(
4822
4857
  levels,
4823
4858
  norm=norm,
@@ -33,3 +33,11 @@ class ThreeAxes(shared._SharedAxes, base.Axes, Axes3D):
33
33
 
34
34
  kwargs.setdefault("alpha", 0.0)
35
35
  super().__init__(*args, **kwargs)
36
+
37
+ def graph(self, *args, **kwargs):
38
+ """
39
+ Draw network graphs on 3D projections.
40
+ """
41
+ from .plot import PlotAxes
42
+
43
+ return PlotAxes.graph(self, *args, **kwargs)
@@ -99,6 +99,8 @@ class UltraColorbar:
99
99
  linewidth: Optional[Union[float, str]] = None,
100
100
  edgefix: Optional[bool] = None,
101
101
  rasterized: Optional[bool] = None,
102
+ frame: Optional[bool] = None,
103
+ frameon: Optional[bool] = None,
102
104
  outline: Union[bool, None] = None,
103
105
  labelrotation: Optional[Union[str, float]] = None,
104
106
  center_levels: Optional[bool] = None,
@@ -160,7 +162,9 @@ class UltraColorbar:
160
162
  # Generate and prepare the colorbar axes
161
163
  # NOTE: The inset axes function needs 'label' to know how to pad the box
162
164
  # TODO: Use seperate keywords for frame properties vs. colorbar edge properties?
165
+ frame = _not_none(frame=frame, frameon=frameon)
163
166
  if loc in ("fill", "left", "right", "top", "bottom"):
167
+ outline = _not_none(outline=outline, frame=frame)
164
168
  length = _not_none(length, rc["colorbar.length"]) # for _add_guide_panel
165
169
  kwargs.update({"align": align, "length": length})
166
170
  extendsize = _not_none(extendsize, rc["colorbar.extend"])
@@ -183,6 +187,7 @@ class UltraColorbar:
183
187
  extendsize = _not_none(extendsize, rc["colorbar.insetextend"])
184
188
  cax, kwargs = ax._parse_colorbar_inset(
185
189
  loc=loc,
190
+ frame=frame,
186
191
  labelloc=labelloc,
187
192
  labelrotation=labelrotation,
188
193
  labelsize=labelsize,
@@ -347,7 +352,9 @@ class UltraColorbar:
347
352
  cax._inset_colorbar_obj = obj
348
353
  cax._inset_colorbar_labelloc = labelloc
349
354
  cax._inset_colorbar_ticklen = ticklen
350
- _register_inset_colorbar_reflow(ax.figure)
355
+ has_frame = getattr(cax, "_inset_colorbar_frame", None) is not None
356
+ if has_frame:
357
+ _register_inset_colorbar_reflow(ax.figure)
351
358
  kw_outline = {"edgecolor": color, "linewidth": linewidth}
352
359
  if obj.outline is not None:
353
360
  obj.outline.update(kw_outline)
@@ -958,6 +965,7 @@ def _reflow_inset_colorbar_frame(
958
965
  *,
959
966
  labelloc: Optional[str],
960
967
  ticklen: float,
968
+ renderer=None,
961
969
  ):
962
970
  cax = colorbar.ax
963
971
  layout = getattr(cax, "_inset_colorbar_layout", None)
@@ -995,7 +1003,7 @@ def _reflow_inset_colorbar_frame(
995
1003
  cb_width = width
996
1004
  cb_height = length
997
1005
 
998
- renderer = cax.figure._get_renderer()
1006
+ renderer = renderer or cax.figure._get_renderer()
999
1007
  if hasattr(colorbar, "update_ticks"):
1000
1008
  colorbar.update_ticks(manual_only=True)
1001
1009
  bboxes = []
@@ -1988,9 +1988,11 @@ class SubplotGrid(MutableSequence, list):
1988
1988
  elif not isinstance(objs, list):
1989
1989
  objs = [objs]
1990
1990
 
1991
+ # Spanning subplots can appear more than once in the sliced slot grid.
1992
+ # De-duplicate while preserving order so method dispatch does not repeat.
1993
+ objs = list(dict.fromkeys(objs))
1991
1994
  if len(objs) == 1:
1992
1995
  return objs[0]
1993
- objs = [obj for obj in objs if obj is not None]
1994
1996
  return SubplotGrid(objs)
1995
1997
 
1996
1998
  def __setitem__(self, key, value):
@@ -4,6 +4,7 @@ Internal utilities.
4
4
  """
5
5
 
6
6
  # Import statements
7
+ import functools
7
8
  import inspect
8
9
  from importlib import import_module
9
10
  from numbers import Integral, Real
@@ -155,6 +156,40 @@ _alias_maps = {
155
156
  },
156
157
  }
157
158
 
159
+
160
+ _INTERNAL_POP_PARAMS = frozenset(
161
+ {
162
+ "default_cmap",
163
+ "default_discrete",
164
+ "inbounds",
165
+ "plot_contours",
166
+ "plot_lines",
167
+ "skip_autolev",
168
+ "to_centers",
169
+ }
170
+ )
171
+
172
+
173
+ @functools.lru_cache(maxsize=256)
174
+ def _signature_cached(func):
175
+ """
176
+ Cache inspect.signature lookups for hot utility paths.
177
+ """
178
+ return inspect.signature(func)
179
+
180
+
181
+ def _get_signature(func):
182
+ """
183
+ Return a signature, normalizing bound methods to their underlying function.
184
+ """
185
+ key = getattr(func, "__func__", func)
186
+ try:
187
+ return _signature_cached(key)
188
+ except TypeError:
189
+ # Some callable objects may be unhashable for lru_cache keys.
190
+ return inspect.signature(func)
191
+
192
+
158
193
  _LAZY_ATTRS = {
159
194
  "benchmarks": ("benchmarks", None),
160
195
  "context": ("context", None),
@@ -224,28 +259,19 @@ def _pop_params(kwargs, *funcs, ignore_internal=False):
224
259
  """
225
260
  Pop parameters of the input functions or methods.
226
261
  """
227
- internal_params = {
228
- "default_cmap",
229
- "default_discrete",
230
- "inbounds",
231
- "plot_contours",
232
- "plot_lines",
233
- "skip_autolev",
234
- "to_centers",
235
- }
236
262
  output = {}
237
263
  for func in funcs:
238
264
  if isinstance(func, inspect.Signature):
239
265
  sig = func
240
266
  elif callable(func):
241
- sig = inspect.signature(func)
267
+ sig = _get_signature(func)
242
268
  elif func is None:
243
269
  continue
244
270
  else:
245
271
  raise RuntimeError(f"Internal error. Invalid function {func!r}.")
246
272
  for key in sig.parameters:
247
273
  value = kwargs.pop(key, None)
248
- if ignore_internal and key in internal_params:
274
+ if ignore_internal and key in _INTERNAL_POP_PARAMS:
249
275
  continue
250
276
  if value is not None:
251
277
  output[key] = value