ultraplot 2.7.0__tar.gz → 2.7.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 (524) hide show
  1. {ultraplot-2.7.0 → ultraplot-2.7.3}/.github/workflows/build-ultraplot.yml +13 -4
  2. {ultraplot-2.7.0 → ultraplot-2.7.3}/.gitignore +10 -0
  3. {ultraplot-2.7.0 → ultraplot-2.7.3}/.pre-commit-config.yaml +2 -2
  4. {ultraplot-2.7.0 → ultraplot-2.7.3}/.readthedocs.yml +2 -0
  5. ultraplot-2.7.3/MANIFEST.in +2 -0
  6. {ultraplot-2.7.0/ultraplot.egg-info → ultraplot-2.7.3}/PKG-INFO +2 -2
  7. ultraplot-2.7.3/docs/_ext/drawio-lazy.js +94 -0
  8. ultraplot-2.7.3/docs/_ext/drawio.py +162 -0
  9. ultraplot-2.7.3/docs/_scripts/build_plot_types.py +34 -0
  10. ultraplot-2.7.3/docs/_static/plot_types/raincloud.png +0 -0
  11. ultraplot-2.7.3/docs/cheatsheet.rst +49 -0
  12. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/conf.py +9 -0
  13. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/plot_types/05_box_violin.py +0 -1
  14. ultraplot-2.7.3/docs/examples/plot_types/13_raincloud.py +53 -0
  15. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/index.rst +2 -0
  16. ultraplot-2.7.3/docs/plot_types.rst +524 -0
  17. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/projections.py +31 -1
  18. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/stats.py +24 -2
  19. {ultraplot-2.7.0 → ultraplot-2.7.3}/pyproject.toml +10 -4
  20. ultraplot-2.7.3/tools/ci/collect_failed_comparisons.py +197 -0
  21. ultraplot-2.7.3/tools/ci/failed_comparisons_template.html +168 -0
  22. ultraplot-2.7.3/tools/ci/test_collect_failed_comparisons.py +136 -0
  23. {ultraplot-2.7.0 → ultraplot-2.7.3}/tools/expand_docstrings.py +3 -2
  24. ultraplot-2.7.3/ultraplot/_version.py +1 -0
  25. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/base.py +1 -2
  26. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/geo.py +39 -17
  27. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/plot.py +195 -9
  28. ultraplot-2.7.3/ultraplot/axes/plot_types/raincloud.py +516 -0
  29. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/colors.py +36 -8
  30. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/figure.py +1 -1
  31. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/internals/rcsetup.py +62 -0
  32. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_colormap.py +14 -1
  33. ultraplot-2.7.3/ultraplot/tests/test_docstrings.py +64 -0
  34. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_geographic.py +106 -0
  35. ultraplot-2.7.3/ultraplot/tests/test_raincloud.py +564 -0
  36. {ultraplot-2.7.0 → ultraplot-2.7.3/ultraplot.egg-info}/PKG-INFO +2 -2
  37. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot.egg-info/SOURCES.txt +14 -0
  38. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot.egg-info/requires.txt +1 -1
  39. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot.egg-info/scm_file_list.json +26 -0
  40. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot.egg-info/top_level.txt +0 -1
  41. ultraplot-2.7.0/ultraplot/_version.py +0 -1
  42. {ultraplot-2.7.0 → ultraplot-2.7.3}/.github/ISSUE_TEMPLATE.md +0 -0
  43. {ultraplot-2.7.0 → ultraplot-2.7.3}/.github/dependabot.yml +0 -0
  44. {ultraplot-2.7.0 → ultraplot-2.7.3}/.github/micromamba-condarc.yml +0 -0
  45. {ultraplot-2.7.0 → ultraplot-2.7.3}/.github/workflows/black.yml +0 -0
  46. {ultraplot-2.7.0 → ultraplot-2.7.3}/.github/workflows/main.yml +0 -0
  47. {ultraplot-2.7.0 → ultraplot-2.7.3}/.github/workflows/publish-pypi.yml +0 -0
  48. {ultraplot-2.7.0 → ultraplot-2.7.3}/.github/workflows/test-map.yml +0 -0
  49. {ultraplot-2.7.0 → ultraplot-2.7.3}/.zenodo.json +0 -0
  50. {ultraplot-2.7.0 → ultraplot-2.7.3}/CITATION.cff +0 -0
  51. {ultraplot-2.7.0 → ultraplot-2.7.3}/CODEOFCONDUCT.md +0 -0
  52. {ultraplot-2.7.0 → ultraplot-2.7.3}/CONTRIBUTING.rst +0 -0
  53. {ultraplot-2.7.0 → ultraplot-2.7.3}/INSTALL.rst +0 -0
  54. {ultraplot-2.7.0 → ultraplot-2.7.3}/LICENSE.txt +0 -0
  55. {ultraplot-2.7.0 → ultraplot-2.7.3}/README.rst +0 -0
  56. {ultraplot-2.7.0 → ultraplot-2.7.3}/UltraPlotLogo.svg +0 -0
  57. {ultraplot-2.7.0 → ultraplot-2.7.3}/codecov.yml +0 -0
  58. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/1dplots.py +0 -0
  59. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/2dplots.py +0 -0
  60. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/Makefile +0 -0
  61. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_ext/notoc.py +0 -0
  62. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_scripts/fetch_releases.py +0 -0
  63. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/alias-explorer-v3.css +0 -0
  64. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/alias-explorer-v3.js +0 -0
  65. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/alias-map.svg +0 -0
  66. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/custom.css +0 -0
  67. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/custom.js +0 -0
  68. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/example_plots/cartesian_example.svg +0 -0
  69. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/example_plots/colorbars_legends_example.svg +0 -0
  70. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/example_plots/colormaps_example.svg +0 -0
  71. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/example_plots/data_aware_example.svg +0 -0
  72. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/example_plots/panels_example.svg +0 -0
  73. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/example_plots/projection_example.svg +0 -0
  74. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/example_plots/subplot_example.svg +0 -0
  75. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/logo_blank.svg +0 -0
  76. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/logo_long.png +0 -0
  77. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/logo_long.svg +0 -0
  78. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/logo_social.png +0 -0
  79. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/logo_social.svg +0 -0
  80. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_static/logo_square.png +0 -0
  81. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/_templates/whatsnew_sidebar.html +0 -0
  82. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/about.rst +0 -0
  83. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/aliases.rst +0 -0
  84. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/api.rst +0 -0
  85. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/basics.py +0 -0
  86. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/cartesian.py +0 -0
  87. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/colorbars_legends.py +0 -0
  88. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/colormaps.py +0 -0
  89. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/colors.py +0 -0
  90. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/configuration.rst +0 -0
  91. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/contributing.rst +0 -0
  92. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/cycles.py +0 -0
  93. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/data_aware.py +0 -0
  94. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/README.txt +0 -0
  95. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/colors/01_cycle_colormap.py +0 -0
  96. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/colors/02_diverging_colormap.py +0 -0
  97. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/colors/README.txt +0 -0
  98. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/geo/01_robin_tracks.py +0 -0
  99. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/geo/02_orthographic_views.py +0 -0
  100. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/geo/03_projections_features.py +0 -0
  101. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/geo/04_choropleth.py +0 -0
  102. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/geo/README.txt +0 -0
  103. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/layouts/01_shared_axes_abc.py +0 -0
  104. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/layouts/02_complex_layout_insets.py +0 -0
  105. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/layouts/03_spanning_labels.py +0 -0
  106. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/layouts/README.txt +0 -0
  107. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/legend_types/01_semantic_legends.py +0 -0
  108. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/legends_colorbars/01_multi_colorbars.py +0 -0
  109. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/legends_colorbars/02_legend_inset_colorbar.py +0 -0
  110. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/legends_colorbars/03_semantic_legends.py +0 -0
  111. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/legends_colorbars/README.txt +0 -0
  112. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/plot_types/01_curved_quiver.py +0 -0
  113. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/plot_types/02_network_graph.py +0 -0
  114. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/plot_types/03_lollipop.py +0 -0
  115. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/plot_types/04_datetime_series.py +0 -0
  116. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/plot_types/06_ridge_plot.py +0 -0
  117. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/plot_types/07_radar.py +0 -0
  118. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/plot_types/07_sankey.py +0 -0
  119. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/plot_types/08_chord_diagram.py +0 -0
  120. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/plot_types/08_ternary.py +0 -0
  121. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/plot_types/09_phylogeny.py +0 -0
  122. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/plot_types/10_circos_bed.py +0 -0
  123. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/plot_types/11_topic_ribbon.py +0 -0
  124. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/plot_types/12_taylor_diagram.py +0 -0
  125. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/examples/plot_types/README.txt +0 -0
  126. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/external-links.rst +0 -0
  127. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/faq.rst +0 -0
  128. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/first_figure.py +0 -0
  129. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/fonts.py +0 -0
  130. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/insets_panels.py +0 -0
  131. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/install.rst +0 -0
  132. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/keyword_aliases.rst +0 -0
  133. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/lazy_loading.rst +0 -0
  134. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/make.bat +0 -0
  135. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/networks.py +0 -0
  136. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/recipes.py +0 -0
  137. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/requirements-rtd.txt +0 -0
  138. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/sphinxext/custom_roles.py +0 -0
  139. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/sphinxext/jupytext_cache.py +0 -0
  140. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/subplots.py +0 -0
  141. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/ultraplotrc +0 -0
  142. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/usage.rst +0 -0
  143. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/why.rst +0 -0
  144. {ultraplot-2.7.0 → ultraplot-2.7.3}/docs/why_ultraplot.py +0 -0
  145. {ultraplot-2.7.0 → ultraplot-2.7.3}/environment.yml +0 -0
  146. {ultraplot-2.7.0 → ultraplot-2.7.3}/logo/PermanentMarker-Regular.ttf +0 -0
  147. {ultraplot-2.7.0 → ultraplot-2.7.3}/logo/environment-logo.yml +0 -0
  148. {ultraplot-2.7.0 → ultraplot-2.7.3}/logo/logo.py +0 -0
  149. {ultraplot-2.7.0 → ultraplot-2.7.3}/logo/run-linter.sh +0 -0
  150. {ultraplot-2.7.0 → ultraplot-2.7.3}/logo/webicon.py +0 -0
  151. {ultraplot-2.7.0 → ultraplot-2.7.3}/logo/whyUltraPlot.svg +0 -0
  152. {ultraplot-2.7.0 → ultraplot-2.7.3}/noxfile.py +0 -0
  153. {ultraplot-2.7.0 → ultraplot-2.7.3}/requirements-minimal.txt +0 -0
  154. {ultraplot-2.7.0 → ultraplot-2.7.3}/setup.cfg +0 -0
  155. {ultraplot-2.7.0 → ultraplot-2.7.3}/setup.py +0 -0
  156. {ultraplot-2.7.0 → ultraplot-2.7.3}/tools/ci/build_test_map.py +0 -0
  157. {ultraplot-2.7.0 → ultraplot-2.7.3}/tools/ci/check_installed_docstrings.py +0 -0
  158. {ultraplot-2.7.0 → ultraplot-2.7.3}/tools/ci/select_tests.py +0 -0
  159. {ultraplot-2.7.0 → ultraplot-2.7.3}/tools/ci/static_consumer.py +0 -0
  160. {ultraplot-2.7.0 → ultraplot-2.7.3}/tools/ci/version_support.py +0 -0
  161. {ultraplot-2.7.0 → ultraplot-2.7.3}/tools/generate_alias_figure.py +0 -0
  162. {ultraplot-2.7.0 → ultraplot-2.7.3}/tools/generate_alias_reference.py +0 -0
  163. {ultraplot-2.7.0 → ultraplot-2.7.3}/tools/serve_alias_docs.py +0 -0
  164. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/.opencode/goals/state.json.lock +0 -0
  165. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/.opencode/goals/state.json.sessions/.migration-v1-complete +0 -0
  166. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/.opencode/goals/state.json.sessions/cc3e983cb1eb34ad9f66e65e9ff9910c47ddb4f26523966e07d6a8bf3bc830eb/state.json +0 -0
  167. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/.opencode/goals/state.json.sessions/cc3e983cb1eb34ad9f66e65e9ff9910c47ddb4f26523966e07d6a8bf3bc830eb/state.json.lock +0 -0
  168. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/__init__.py +0 -0
  169. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/_animation.py +0 -0
  170. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/_interaction.py +0 -0
  171. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/_layout.py +0 -0
  172. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/_lazy.py +0 -0
  173. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/_sharing.py +0 -0
  174. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/_subplots.py +0 -0
  175. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/animation.py +0 -0
  176. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/__init__.py +0 -0
  177. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/_formatting.py +0 -0
  178. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/cartesian.py +0 -0
  179. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/container.py +0 -0
  180. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/plot_types/__init__.py +0 -0
  181. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/plot_types/circlize.py +0 -0
  182. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/plot_types/curved_quiver.py +0 -0
  183. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/plot_types/ribbon.py +0 -0
  184. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/plot_types/sankey.py +0 -0
  185. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/polar.py +0 -0
  186. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/shared.py +0 -0
  187. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/taylor.py +0 -0
  188. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/axes/three.py +0 -0
  189. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Algae.rgb +0 -0
  190. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Amp.rgb +0 -0
  191. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/BR.rgb +0 -0
  192. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Balance.rgb +0 -0
  193. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Blues1_r.xml +0 -0
  194. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Blues2.xml +0 -0
  195. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Blues3.xml +0 -0
  196. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Blues4_r.xml +0 -0
  197. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Blues5.xml +0 -0
  198. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Blues6.xml +0 -0
  199. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Blues7.xml +0 -0
  200. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Blues8.xml +0 -0
  201. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Blues9.xml +0 -0
  202. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Boreal.json +0 -0
  203. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Browns1.xml +0 -0
  204. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Browns2.xml +0 -0
  205. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Browns3.xml +0 -0
  206. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Browns4.xml +0 -0
  207. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Browns5.xml +0 -0
  208. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Browns6.xml +0 -0
  209. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Browns7.xml +0 -0
  210. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Browns8.xml +0 -0
  211. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Browns9.xml +0 -0
  212. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/ColdHot.rgb +0 -0
  213. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Crest.rgb +0 -0
  214. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Curl.rgb +0 -0
  215. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Deep.rgb +0 -0
  216. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Delta.rgb +0 -0
  217. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Dense.rgb +0 -0
  218. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Div.json +0 -0
  219. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/DryWet.json +0 -0
  220. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Dusk.json +0 -0
  221. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Fire.json +0 -0
  222. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Flare.rgb +0 -0
  223. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Glacial.json +0 -0
  224. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Greens1_r.xml +0 -0
  225. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Greens2.xml +0 -0
  226. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Greens3_r.xml +0 -0
  227. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Greens4.xml +0 -0
  228. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Greens5.xml +0 -0
  229. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Greens6_r.xml +0 -0
  230. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Greens7.xml +0 -0
  231. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Greens8.xml +0 -0
  232. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Haline.rgb +0 -0
  233. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Ice.rgb +0 -0
  234. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/IceFire.rgb +0 -0
  235. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Mako.rgb +0 -0
  236. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Marine.json +0 -0
  237. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Matter.rgb +0 -0
  238. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Mono.txt +0 -0
  239. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/MonoCycle.txt +0 -0
  240. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/NegPos.json +0 -0
  241. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Oranges1.xml +0 -0
  242. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Oranges2.xml +0 -0
  243. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Oranges3.xml +0 -0
  244. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Oranges4.xml +0 -0
  245. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Oxy.rgb +0 -0
  246. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Phase.rgb +0 -0
  247. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Purples1_r.xml +0 -0
  248. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Purples2.xml +0 -0
  249. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Purples3.xml +0 -0
  250. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Reds1.xml +0 -0
  251. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Reds2.xml +0 -0
  252. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Reds3.xml +0 -0
  253. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Reds4.xml +0 -0
  254. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Reds5.xml +0 -0
  255. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Rocket.rgb +0 -0
  256. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Solar.rgb +0 -0
  257. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Speed.rgb +0 -0
  258. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Stellar.json +0 -0
  259. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Sunrise.json +0 -0
  260. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Sunset.json +0 -0
  261. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Tempo.rgb +0 -0
  262. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Thermal.rgb +0 -0
  263. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Turbid.rgb +0 -0
  264. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Vivid.xml +0 -0
  265. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Vlag.rgb +0 -0
  266. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Yellows1.xml +0 -0
  267. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Yellows2.xml +0 -0
  268. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Yellows3.xml +0 -0
  269. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/Yellows4.xml +0 -0
  270. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/acton.txt +0 -0
  271. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/bam.txt +0 -0
  272. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/bamO.txt +0 -0
  273. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/bamako.txt +0 -0
  274. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/batlow.txt +0 -0
  275. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/batlowK.txt +0 -0
  276. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/batlowW.txt +0 -0
  277. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/berlin.txt +0 -0
  278. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/bilbao.txt +0 -0
  279. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/broc.txt +0 -0
  280. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/brocO.txt +0 -0
  281. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/buda.txt +0 -0
  282. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/bukavu.txt +0 -0
  283. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/cork.txt +0 -0
  284. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/corkO.txt +0 -0
  285. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/davos.txt +0 -0
  286. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/devon.txt +0 -0
  287. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/fes.txt +0 -0
  288. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/hawaii.txt +0 -0
  289. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/imola.txt +0 -0
  290. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/lajolla.txt +0 -0
  291. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/lapaz.txt +0 -0
  292. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/lisbon.txt +0 -0
  293. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/nuuk.txt +0 -0
  294. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/oleron.txt +0 -0
  295. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/oslo.txt +0 -0
  296. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/roma.txt +0 -0
  297. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/romaO.txt +0 -0
  298. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/tofino.txt +0 -0
  299. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/tokyo.txt +0 -0
  300. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/turku.txt +0 -0
  301. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/vanimo.txt +0 -0
  302. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/vik.txt +0 -0
  303. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cmaps/vikO.txt +0 -0
  304. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/colorbar.py +0 -0
  305. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/colors/opencolor.txt +0 -0
  306. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/colors/xkcd.txt +0 -0
  307. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/config.py +0 -0
  308. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/constructor.py +0 -0
  309. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cycles/538.hex +0 -0
  310. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cycles/FlatUI.hex +0 -0
  311. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cycles/Qual1.rgb +0 -0
  312. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cycles/Qual2.rgb +0 -0
  313. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cycles/bmh.hex +0 -0
  314. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cycles/classic.hex +0 -0
  315. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cycles/colorblind.hex +0 -0
  316. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cycles/colorblind10.hex +0 -0
  317. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cycles/default.hex +0 -0
  318. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cycles/ggplot.hex +0 -0
  319. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cycles/seaborn.hex +0 -0
  320. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/cycles/tableau.hex +0 -0
  321. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/demos.py +0 -0
  322. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/externals/__init__.py +0 -0
  323. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/externals/hsluv.py +0 -0
  324. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraMath-Bold.ttf +0 -0
  325. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraMath-ExtraLight.ttf +0 -0
  326. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraMath-Heavy.ttf +0 -0
  327. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraMath-Light.ttf +0 -0
  328. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraMath-Medium.ttf +0 -0
  329. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraMath-Regular.ttf +0 -0
  330. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraMath-SemiBold.ttf +0 -0
  331. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraMath-UltraLight.ttf +0 -0
  332. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-Black.ttf +0 -0
  333. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-BlackItalic.ttf +0 -0
  334. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-Bold.ttf +0 -0
  335. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-BoldItalic.ttf +0 -0
  336. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-ExtraBold.ttf +0 -0
  337. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-ExtraBoldItalic.ttf +0 -0
  338. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-ExtraLight.ttf +0 -0
  339. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-ExtraLightItalic.ttf +0 -0
  340. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-Italic.ttf +0 -0
  341. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-Light.ttf +0 -0
  342. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-LightItalic.ttf +0 -0
  343. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-Medium.ttf +0 -0
  344. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-MediumItalic.ttf +0 -0
  345. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-Regular.ttf +0 -0
  346. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-SemiBold.ttf +0 -0
  347. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/FiraSans-SemiBoldItalic.ttf +0 -0
  348. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/LICENSE_FIRAMATH.txt +0 -0
  349. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/LICENSE_FIRASANS.txt +0 -0
  350. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/LICENSE_NOTOSANS.txt +0 -0
  351. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/LICENSE_NOTOSERIF.txt +0 -0
  352. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/LICENSE_OPENSANS.txt +0 -0
  353. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/LICENSE_ROBOTO.txt +0 -0
  354. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/LICENSE_SOURCESANS.txt +0 -0
  355. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/LICENSE_SOURCESERIF.txt +0 -0
  356. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/LICENSE_TEXGYRE.txt +0 -0
  357. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/LICENSE_UBUNTU.txt +0 -0
  358. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/NotoSans-Bold.ttf +0 -0
  359. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/NotoSans-BoldItalic.ttf +0 -0
  360. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/NotoSans-Italic.ttf +0 -0
  361. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/NotoSans-Regular.ttf +0 -0
  362. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/NotoSerif-Bold.ttf +0 -0
  363. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/NotoSerif-BoldItalic.ttf +0 -0
  364. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/NotoSerif-Italic.ttf +0 -0
  365. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/NotoSerif-Regular.ttf +0 -0
  366. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/OpenSans-Bold.ttf +0 -0
  367. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/OpenSans-BoldItalic.ttf +0 -0
  368. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/OpenSans-Italic.ttf +0 -0
  369. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/OpenSans-Regular.ttf +0 -0
  370. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/OpenSans-Semibold.ttf +0 -0
  371. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/OpenSans-SemiboldItalic.ttf +0 -0
  372. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Roboto-Black.ttf +0 -0
  373. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Roboto-BlackItalic.ttf +0 -0
  374. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Roboto-Bold.ttf +0 -0
  375. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Roboto-BoldItalic.ttf +0 -0
  376. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Roboto-Italic.ttf +0 -0
  377. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Roboto-Light.ttf +0 -0
  378. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Roboto-LightItalic.ttf +0 -0
  379. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Roboto-Medium.ttf +0 -0
  380. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Roboto-MediumItalic.ttf +0 -0
  381. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Roboto-Regular.ttf +0 -0
  382. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSansPro-Black.ttf +0 -0
  383. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSansPro-BlackItalic.ttf +0 -0
  384. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSansPro-Bold.ttf +0 -0
  385. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSansPro-BoldItalic.ttf +0 -0
  386. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSansPro-ExtraLight.ttf +0 -0
  387. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSansPro-ExtraLightItalic.ttf +0 -0
  388. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSansPro-Italic.ttf +0 -0
  389. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSansPro-Light.ttf +0 -0
  390. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSansPro-LightItalic.ttf +0 -0
  391. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSansPro-Regular.ttf +0 -0
  392. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSansPro-SemiBold.ttf +0 -0
  393. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSansPro-SemiBoldItalic.ttf +0 -0
  394. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSerifPro-Black.ttf +0 -0
  395. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSerifPro-BlackItalic.ttf +0 -0
  396. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSerifPro-Bold.ttf +0 -0
  397. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSerifPro-BoldItalic.ttf +0 -0
  398. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSerifPro-ExtraLight.ttf +0 -0
  399. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSerifPro-ExtraLightItalic.ttf +0 -0
  400. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSerifPro-Italic.ttf +0 -0
  401. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSerifPro-Light.ttf +0 -0
  402. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSerifPro-LightItalic.ttf +0 -0
  403. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSerifPro-Regular.ttf +0 -0
  404. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSerifPro-SemiBold.ttf +0 -0
  405. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/SourceSerifPro-SemiBoldItalic.ttf +0 -0
  406. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Ubuntu-Bold.ttf +0 -0
  407. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Ubuntu-BoldItalic.ttf +0 -0
  408. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Ubuntu-Italic.ttf +0 -0
  409. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Ubuntu-Light.ttf +0 -0
  410. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Ubuntu-LightItalic.ttf +0 -0
  411. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Ubuntu-Medium.ttf +0 -0
  412. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Ubuntu-MediumItalic.ttf +0 -0
  413. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/Ubuntu-Regular.ttf +0 -0
  414. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyreadventor-bold.ttf +0 -0
  415. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyreadventor-bolditalic.ttf +0 -0
  416. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyreadventor-italic.ttf +0 -0
  417. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyreadventor-regular.ttf +0 -0
  418. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyrebonum-bold.ttf +0 -0
  419. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyrebonum-bolditalic.ttf +0 -0
  420. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyrebonum-italic.ttf +0 -0
  421. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyrebonum-regular.ttf +0 -0
  422. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyrechorus-mediumitalic.ttf +0 -0
  423. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyrecursor-bold.ttf +0 -0
  424. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyrecursor-bolditalic.ttf +0 -0
  425. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyrecursor-italic.ttf +0 -0
  426. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyrecursor-regular.ttf +0 -0
  427. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyreheros-bold.ttf +0 -0
  428. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyreheros-bolditalic.ttf +0 -0
  429. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyreheros-italic.ttf +0 -0
  430. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyreheros-regular.ttf +0 -0
  431. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyrepagella-bold.ttf +0 -0
  432. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyrepagella-bolditalic.ttf +0 -0
  433. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyrepagella-italic.ttf +0 -0
  434. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyrepagella-regular.ttf +0 -0
  435. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyreschola-bold.ttf +0 -0
  436. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyreschola-bolditalic.ttf +0 -0
  437. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyreschola-italic.ttf +0 -0
  438. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyreschola-regular.ttf +0 -0
  439. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyretermes-bold.ttf +0 -0
  440. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyretermes-bolditalic.ttf +0 -0
  441. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyretermes-italic.ttf +0 -0
  442. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/fonts/texgyretermes-regular.ttf +0 -0
  443. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/gridspec.py +0 -0
  444. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/internals/__init__.py +0 -0
  445. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/internals/benchmarks.py +0 -0
  446. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/internals/context.py +0 -0
  447. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/internals/docstring.py +0 -0
  448. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/internals/fonts.py +0 -0
  449. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/internals/guides.py +0 -0
  450. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/internals/inputs.py +0 -0
  451. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/internals/kwargs.py +0 -0
  452. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/internals/labels.py +0 -0
  453. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/internals/versions.py +0 -0
  454. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/internals/warnings.py +0 -0
  455. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/legend.py +0 -0
  456. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/mcp.py +0 -0
  457. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/proj.py +0 -0
  458. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/py.typed +0 -0
  459. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/scale.py +0 -0
  460. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/__init__.py +0 -0
  461. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/conftest.py +0 -0
  462. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_1dplots.py +0 -0
  463. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_2dplots.py +0 -0
  464. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_alias_signatures.py +0 -0
  465. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_animation.py +0 -0
  466. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_axes.py +0 -0
  467. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_axes_alt_styles.py +0 -0
  468. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_axes_base_colorbar_helpers.py +0 -0
  469. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_base.py +0 -0
  470. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_circlize_integration.py +0 -0
  471. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_colorbar.py +0 -0
  472. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_colorbar_helpers_extra.py +0 -0
  473. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_colormap_helpers_extra.py +0 -0
  474. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_colors.py +0 -0
  475. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_colors_helpers.py +0 -0
  476. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_config.py +0 -0
  477. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_config_helpers_extra.py +0 -0
  478. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_constructor.py +0 -0
  479. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_constructor_helpers_extra.py +0 -0
  480. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_core_versions.py +0 -0
  481. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_demos.py +0 -0
  482. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_docs.py +0 -0
  483. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_docs_fetch_releases.py +0 -0
  484. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_docs_search.py +0 -0
  485. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_docstring_helpers.py +0 -0
  486. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_external_axes_container_integration.py +0 -0
  487. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_external_container_edge_cases.py +0 -0
  488. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_external_container_mocked.py +0 -0
  489. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_figure.py +0 -0
  490. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_fonts.py +0 -0
  491. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_format.py +0 -0
  492. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_gridspec.py +0 -0
  493. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_handlers.py +0 -0
  494. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_imports.py +0 -0
  495. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_imshow.py +0 -0
  496. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_inputs.py +0 -0
  497. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_inputs_helpers.py +0 -0
  498. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_inset.py +0 -0
  499. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_integration.py +0 -0
  500. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_kwargs_helpers.py +0 -0
  501. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_legend.py +0 -0
  502. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_mcp.py +0 -0
  503. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_plot.py +0 -0
  504. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_proj_helpers.py +0 -0
  505. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_projections.py +0 -0
  506. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_rcsetup_helpers.py +0 -0
  507. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_release_metadata.py +0 -0
  508. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_scale_helpers.py +0 -0
  509. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_semantic_legend.py +0 -0
  510. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_statistical_plotting.py +0 -0
  511. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_subplot_manager.py +0 -0
  512. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_subplots.py +0 -0
  513. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_text_helpers.py +0 -0
  514. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_textalign.py +0 -0
  515. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_tickers.py +0 -0
  516. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/tests/test_ultralayout.py +0 -0
  517. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/text.py +0 -0
  518. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/textalign.py +0 -0
  519. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/ticker.py +0 -0
  520. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/ui.py +0 -0
  521. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/ultralayout.py +0 -0
  522. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot/utils.py +0 -0
  523. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot.egg-info/dependency_links.txt +0 -0
  524. {ultraplot-2.7.0 → ultraplot-2.7.3}/ultraplot.egg-info/entry_points.txt +0 -0
@@ -299,7 +299,7 @@ jobs:
299
299
  --mpl \
300
300
  --mpl-baseline-path=./ultraplot/tests/baseline \
301
301
  --mpl-results-path=./results/ \
302
- --mpl-generate-summary=html \
302
+ --mpl-generate-summary=json \
303
303
  --mpl-default-style="./ultraplot.yml" \
304
304
  --junitxml=./results/junit.xml \
305
305
  "${FILTERED_NODEIDS[@]}"
@@ -333,7 +333,7 @@ jobs:
333
333
  --mpl \
334
334
  --mpl-baseline-path=./ultraplot/tests/baseline \
335
335
  --mpl-results-path=./results/ \
336
- --mpl-generate-summary=html \
336
+ --mpl-generate-summary=json \
337
337
  --mpl-default-style="./ultraplot.yml" \
338
338
  --junitxml=./results/junit.xml \
339
339
  ultraplot/tests
@@ -360,11 +360,20 @@ jobs:
360
360
  exit "$status"
361
361
  fi
362
362
 
363
- # Return the html output of the comparison even if failed
363
+ # Validate the standalone report rendering on each CI environment.
364
+ - name: Test failed-comparison report generator
365
+ if: always() && steps.baseline-support.outputs.baseline-supported == 'true'
366
+ run: python -m unittest discover -s tools/ci -p 'test_collect_failed_comparisons.py'
367
+
368
+ # JSON mode does not save images for passing comparisons.
369
+ - name: Collect failed image comparisons
370
+ if: always() && steps.baseline-support.outputs.baseline-supported == 'true'
371
+ run: python tools/ci/collect_failed_comparisons.py --results results --output failed-comparisons
372
+
364
373
  - name: Upload comparison failures
365
374
  if: always()
366
375
  uses: actions/upload-artifact@v7
367
376
  with:
368
377
  name: failed-comparisons-${{ inputs.python-version }}-${{ inputs.matplotlib-version }}-${{ github.sha }}
369
- path: results/*
378
+ path: failed-comparisons/
370
379
  if-no-files-found: ignore
@@ -64,3 +64,13 @@ ultraplot/_version.py
64
64
 
65
65
  # Nox build directories
66
66
  .nox/*
67
+
68
+ # Generated docs and draw.io assets. The edited diagram remains a repository asset.
69
+ tools/cheatsheet/assets/
70
+ docs/_static/plot_types/
71
+ tools/cheatsheet/ultraplot_cheatsheet.png
72
+ tools/cheatsheet/ultraplot_cheatsheet-code.png
73
+ tools/cheatsheet/ultraplot_cheatsheet-reference.png
74
+ tools/cheatsheet/ultraplot_cheatsheet-beginner.png
75
+ tools/cheatsheet/ultraplot_cheatsheet-intermediate.png
76
+ tools/cheatsheet/ultraplot_cheatsheet-advanced.png
@@ -11,12 +11,12 @@ ci:
11
11
 
12
12
  repos:
13
13
  - repo: https://github.com/psf/black-pre-commit-mirror
14
- rev: 26.5.1
14
+ rev: 26.10.0
15
15
  hooks:
16
16
  - id: black
17
17
 
18
18
  - repo: https://github.com/tombi-toml/tombi-pre-commit
19
- rev: v1.5.2
19
+ rev: v1.7.2
20
20
  hooks:
21
21
  - id: tombi-format
22
22
  args: ["--offline"]
@@ -5,6 +5,8 @@ version: 2
5
5
  # Set the OS and build tools
6
6
  build:
7
7
  os: ubuntu-22.04
8
+ apt_packages:
9
+ - xvfb
8
10
  tools:
9
11
  python: "mambaforge-latest"
10
12
 
@@ -0,0 +1,2 @@
1
+ # Cheatsheet sources and exports are repository assets, not pip distribution files.
2
+ prune tools/cheatsheet
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultraplot
3
- Version: 2.7.0
3
+ Version: 2.7.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>
@@ -49,7 +49,7 @@ Requires-Dist: mcp<3,>=2.1; extra == "mcp"
49
49
  Provides-Extra: stats
50
50
  Requires-Dist: scipy; extra == "stats"
51
51
  Provides-Extra: typing
52
- Requires-Dist: basedpyright==1.31.4; extra == "typing"
52
+ Requires-Dist: basedpyright==1.40.2; extra == "typing"
53
53
  Dynamic: license-file
54
54
 
55
55
  .. image:: https://raw.githubusercontent.com/Ultraplot/ultraplot/refs/heads/main/UltraPlotLogo.svg
@@ -0,0 +1,94 @@
1
+ /* Fetch SVG-heavy draw.io pages only when they approach the viewport. */
2
+ (() => {
3
+ "use strict";
4
+ let viewerPromise;
5
+ function viewer() {
6
+ if (window.GraphViewer && window.DOMPurify && window.pako) return Promise.resolve();
7
+ if (!viewerPromise) {
8
+ viewerPromise = new Promise((resolve, reject) => {
9
+ const script = document.createElement("script");
10
+ // The standalone viewer bundles DOMPurify, pako and Spinner as UMD
11
+ // libraries but consumes their browser globals. Sphinx's RequireJS
12
+ // otherwise captures them as anonymous AMD modules instead.
13
+ const define = window.define;
14
+ const amd = define && define.amd;
15
+ if (amd) define.amd = undefined;
16
+ const restoreAMD = () => {
17
+ if (amd) define.amd = amd;
18
+ };
19
+ script.src = "https://viewer.diagrams.net/js/viewer-static.min.js";
20
+ script.onload = () => {
21
+ restoreAMD();
22
+ if (window.GraphViewer && window.DOMPurify && window.pako) resolve();
23
+ else reject(new Error("Viewer dependencies unavailable"));
24
+ };
25
+ script.onerror = () => {
26
+ restoreAMD();
27
+ script.remove();
28
+ reject(new Error("Viewer download failed"));
29
+ };
30
+ document.head.appendChild(script);
31
+ }).catch(error => {
32
+ viewerPromise = undefined;
33
+ throw error;
34
+ });
35
+ }
36
+ return viewerPromise;
37
+ }
38
+
39
+ async function load(element) {
40
+ if (element.dataset.loading) return;
41
+ element.dataset.loading = "true";
42
+ element.setAttribute("aria-busy", "true");
43
+ try {
44
+ const [xml] = await Promise.all([
45
+ fetch(element.dataset.drawioUrl).then(response => {
46
+ if (!response.ok) throw new Error(`Diagram download failed (${response.status})`);
47
+ return response.text();
48
+ }),
49
+ viewer(),
50
+ ]);
51
+ element.setAttribute("data-mxgraph", JSON.stringify({
52
+ xml, resize: true, fit: true, nav: false, lightbox: true,
53
+ toolbar: "zoom lightbox", "toolbar-nohide": true, editable: false,
54
+ }));
55
+ element.replaceChildren();
56
+ window.GraphViewer.createViewerForElement(element);
57
+ element.removeAttribute("data-mxgraph");
58
+ element.style.minHeight = "";
59
+ element.setAttribute("aria-busy", "false");
60
+ } catch (error) {
61
+ delete element.dataset.loading;
62
+ element.setAttribute("aria-busy", "false");
63
+ const button = document.createElement("button");
64
+ button.type = "button";
65
+ button.textContent = "Diagram could not be loaded. Retry";
66
+ button.addEventListener("click", () => load(element));
67
+ element.replaceChildren(button);
68
+ console.warn("Draw.io diagram:", error);
69
+ }
70
+ }
71
+
72
+ function init() {
73
+ const elements = document.querySelectorAll(".drawio-lazy");
74
+ const observer = "IntersectionObserver" in window ? new IntersectionObserver(entries => {
75
+ for (const entry of entries) {
76
+ if (entry.isIntersecting) {
77
+ observer.unobserve(entry.target);
78
+ load(entry.target);
79
+ }
80
+ }
81
+ }, { rootMargin: "300px" }) : null;
82
+ for (const element of elements) {
83
+ element.querySelector("a").addEventListener("click", event => {
84
+ event.preventDefault();
85
+ if (observer) observer.unobserve(element);
86
+ load(element);
87
+ });
88
+ if (observer) observer.observe(element);
89
+ else load(element);
90
+ }
91
+ }
92
+ if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", init);
93
+ else init();
94
+ })();
@@ -0,0 +1,162 @@
1
+ from __future__ import annotations
2
+
3
+ import base64
4
+ import hashlib
5
+ import html
6
+ from pathlib import Path
7
+ import urllib.parse
8
+ import xml.etree.ElementTree as ET
9
+ import zlib
10
+
11
+ from docutils import nodes
12
+ from docutils.parsers.rst import Directive, directives
13
+ from sphinx.util.osutil import relative_uri
14
+
15
+
16
+ def _decode_diagram(diagram: ET.Element) -> str:
17
+ """Return an mxGraphModel XML string from a <diagram> element."""
18
+
19
+ # Uncompressed draw.io files can contain mxGraphModel directly.
20
+ graph = diagram.find("mxGraphModel")
21
+ if graph is not None:
22
+ return ET.tostring(graph, encoding="unicode")
23
+
24
+ # Normal compressed draw.io representation:
25
+ # base64 -> raw DEFLATE -> URL decode
26
+ encoded = (diagram.text or "").strip()
27
+
28
+ if not encoded:
29
+ raise ValueError("Draw.io diagram contains no data")
30
+
31
+ compressed = base64.b64decode(encoded)
32
+ inflated = zlib.decompress(compressed, -15).decode("utf-8")
33
+
34
+ return urllib.parse.unquote(inflated)
35
+
36
+
37
+ def _get_page(path: Path, selector: str | None) -> str:
38
+ root = ET.parse(path).getroot()
39
+ diagrams = root.findall("diagram")
40
+
41
+ if not diagrams:
42
+ raise ValueError(f"No diagrams found in {path}")
43
+
44
+ # Default to first page.
45
+ if selector is None:
46
+ return _decode_diagram(diagrams[0])
47
+
48
+ # Numeric selector = page index.
49
+ try:
50
+ index = int(selector)
51
+ except ValueError:
52
+ index = None
53
+
54
+ if index is not None:
55
+ try:
56
+ return _decode_diagram(diagrams[index])
57
+ except IndexError:
58
+ raise ValueError(
59
+ f"Page index {index} does not exist in {path}"
60
+ ) from None
61
+
62
+ # Otherwise treat selector as page name.
63
+ for diagram in diagrams:
64
+ if diagram.get("name") == selector:
65
+ return _decode_diagram(diagram)
66
+
67
+ names = [d.get("name", "<unnamed>") for d in diagrams]
68
+ raise ValueError(
69
+ f"Page {selector!r} not found in {path}. "
70
+ f"Available pages: {', '.join(names)}"
71
+ )
72
+
73
+
74
+ class drawio_node(nodes.General, nodes.Element):
75
+ pass
76
+
77
+
78
+ def _visit_drawio_html(self, node):
79
+ # Write at HTML translation time so cached doctrees also recreate assets
80
+ # when the output directory is cleaned. Content hashes allow browser caching.
81
+ xml = node["xml"]
82
+ digest = hashlib.sha256(xml.encode("utf-8")).hexdigest()
83
+ asset = f"_drawio/{digest}.xml"
84
+ path = Path(self.builder.outdir) / asset
85
+ path.parent.mkdir(parents=True, exist_ok=True)
86
+ if not path.exists():
87
+ path.write_text(xml, encoding="utf-8")
88
+ url = relative_uri(self.builder.get_target_uri(self.builder.current_docname), asset)
89
+ classes = html.escape(" ".join(["drawio-lazy", *node["classes"]]), quote=True)
90
+ url = html.escape(url, quote=True)
91
+ self.body.append(
92
+ f'<div class="{classes}" data-drawio-url="{url}" '
93
+ 'style="min-height:24rem" aria-busy="true">'
94
+ f'<a href="{url}">Load diagram</a>'
95
+ '<noscript> (JavaScript is required to view this diagram.)</noscript>'
96
+ '</div>'
97
+ )
98
+ raise nodes.SkipNode
99
+
100
+
101
+ def _skip_drawio(self, node):
102
+ raise nodes.SkipNode
103
+
104
+
105
+ class DrawioDirective(Directive):
106
+ required_arguments = 1
107
+ has_content = False
108
+
109
+ option_spec = {
110
+ "page": directives.unchanged,
111
+ "class": directives.class_option,
112
+ }
113
+
114
+ def run(self):
115
+ env = self.state.document.settings.env
116
+
117
+ # Resolve relative to the .rst file containing the directive.
118
+ source = Path(env.doc2path(env.docname)).resolve()
119
+ path = (source.parent / self.arguments[0]).resolve()
120
+
121
+ if not path.exists():
122
+ raise self.error(f"Draw.io file not found: {path}")
123
+
124
+ # Tell Sphinx that changes to the .drawio file should rebuild this page.
125
+ env.note_dependency(str(path))
126
+
127
+ try:
128
+ xml = _get_page(path, self.options.get("page"))
129
+ except (ET.ParseError, ValueError) as exc:
130
+ raise self.error(str(exc)) from exc
131
+
132
+ node = drawio_node()
133
+ node["xml"] = xml
134
+ node["classes"] = self.options.get("class", [])
135
+ return [node]
136
+
137
+
138
+ def _copy_loader(app, exception):
139
+ if exception is None and app.builder.format == "html":
140
+ target = Path(app.outdir) / "_static" / "drawio-lazy.js"
141
+ target.parent.mkdir(parents=True, exist_ok=True)
142
+ target.write_bytes(Path(__file__).with_name("drawio-lazy.js").read_bytes())
143
+
144
+
145
+ def setup(app):
146
+ app.add_directive("drawio", DrawioDirective)
147
+
148
+ app.add_node(
149
+ drawio_node,
150
+ html=(_visit_drawio_html, None),
151
+ latex=(_skip_drawio, None),
152
+ text=(_skip_drawio, None),
153
+ )
154
+ # Copy our loader without requiring changes to html_static_path.
155
+ app.connect("build-finished", _copy_loader)
156
+ app.add_js_file("drawio-lazy.js", loading_method="defer")
157
+
158
+ return {
159
+ "version": "2.0",
160
+ "parallel_read_safe": True,
161
+ "parallel_write_safe": True,
162
+ }
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Regenerate the visual plot-type index before a documentation build.
4
+
5
+ Run from ``conf.py`` the same way ``fetch_releases.py`` is: the page and its
6
+ thumbnails are generated artefacts, so a clean checkout builds them rather than
7
+ carrying 60-odd PNGs in the repository. Rendering is skipped when the icons are
8
+ already present, so a local rebuild costs nothing.
9
+ """
10
+
11
+ import os
12
+ import sys
13
+
14
+ HERE = os.path.dirname(os.path.abspath(__file__))
15
+ ROOT = os.path.dirname(os.path.dirname(HERE))
16
+ GENERATOR = os.path.join(ROOT, "tools", "cheatsheet")
17
+
18
+ sys.path.insert(0, GENERATOR)
19
+
20
+
21
+ def main():
22
+ try:
23
+ import docs_index
24
+ except ImportError as error: # the tools folder is not shipped in sdists
25
+ print(f"plot-type index skipped: {error}")
26
+ return
27
+ try:
28
+ docs_index.main()
29
+ except Exception as error: # never fail the docs build over a thumbnail
30
+ print(f"plot-type index skipped: {type(error).__name__}: {error}")
31
+
32
+
33
+ if __name__ == "__main__":
34
+ main()
@@ -0,0 +1,49 @@
1
+ Cheat Sheet
2
+ ===========
3
+
4
+ They say don't change a winning team. With UltraPlot we use Matplotlib's object orientated syntax, and
5
+ add to it essential quality of life improvements to make high quality publication ready plots.
6
+ To highlight the capabilities in a bird's eye view, we have included a few Matplotlib style cheat sheets below.
7
+
8
+ Use the expand icon in each sheet's toolbar to open a full-screen view, then
9
+ zoom in to read the details. Press :kbd:`Esc` or use the close icon to return.
10
+
11
+
12
+ ================
13
+ General Overview
14
+ ================
15
+
16
+ .. drawio:: ../tools/cheatsheet/ultraplot_cheatsheet.drawio
17
+ :page: UltraPlot cheatsheet
18
+
19
+ =================
20
+ Every day recipes
21
+ =================
22
+ .. drawio:: ../tools/cheatsheet/ultraplot_cheatsheet.drawio
23
+ :page: UltraPlot code recipes
24
+
25
+
26
+ ===============
27
+ Quick Reference
28
+ ===============
29
+ .. drawio:: ../tools/cheatsheet/ultraplot_cheatsheet.drawio
30
+ :page: UltraPlot quick reference
31
+
32
+ =========
33
+ Beginners
34
+ =========
35
+ .. drawio:: ../tools/cheatsheet/ultraplot_cheatsheet.drawio
36
+ :page: Beginner · start here
37
+
38
+ ============
39
+ Intermediate
40
+ ============
41
+ .. drawio:: ../tools/cheatsheet/ultraplot_cheatsheet.drawio
42
+ :page: Intermediate · layout & guides
43
+
44
+
45
+ ======
46
+ Expert
47
+ ======
48
+ .. drawio:: ../tools/cheatsheet/ultraplot_cheatsheet.drawio
49
+ :page: Advanced · specialist tools
@@ -66,6 +66,8 @@ FAST_PREVIEW = os.environ.get("UPLT_DOCS_FAST_PREVIEW", "").strip().lower() in {
66
66
  }
67
67
  if not FAST_PREVIEW:
68
68
  run([sys.executable, "_scripts/fetch_releases.py"], check=False)
69
+ # Visual plot-type index: thumbnails plus the page that arranges them.
70
+ run([sys.executable, "_scripts/build_plot_types.py"], check=False)
69
71
 
70
72
  # Docs theme selector. Default to Shibuya, but keep env override for A/B checks.
71
73
  DOCS_THEME = os.environ.get("UPLT_DOCS_THEME", "shibuya").strip().lower()
@@ -245,9 +247,16 @@ extensions = [
245
247
  "sphinx_automodapi.automodapi", # fork of automodapi
246
248
  "sphinx_copybutton", # add copy button to code
247
249
  "_ext.notoc",
250
+ "_ext.drawio",
248
251
  "nbsphinx", # parse rst books
249
252
  "sphinx_gallery.gen_gallery",
250
253
  ]
254
+
255
+ drawio_headless = "auto"
256
+ drawio_builder_export_format = {
257
+ "html": "svg",
258
+ }
259
+
251
260
  if not FAST_PREVIEW:
252
261
  extensions.append("sphinx_sitemap")
253
262
  if HAVE_ULTRAPLOT_THEME_EXT:
@@ -35,5 +35,4 @@ axs[1].violinplot(data.T, lw=1, cycle="flatui")
35
35
  axs[1].format(title="Violin plot", xlabel="Distribution", ylabel="Value")
36
36
 
37
37
  axs.format(suptitle="Statistical distributions")
38
- uplt.show(block=1)
39
38
  fig.show()
@@ -0,0 +1,53 @@
1
+ """
2
+ Raincloud plots
3
+ ===============
4
+
5
+ These synthetic samples have exactly the same sample mean and standard
6
+ deviation, but different shapes. Half violins reveal the shapes, points show
7
+ the observations, and boxes show the median and interquartile range.
8
+ """
9
+
10
+ import numpy as np
11
+
12
+ import ultraplot as uplt
13
+
14
+ # Fixed seeds make both the observations and the point positions reproducible.
15
+ rng = np.random.default_rng(42)
16
+ data = np.column_stack(
17
+ [
18
+ rng.normal(size=100),
19
+ rng.lognormal(mean=0, sigma=0.65, size=100),
20
+ np.r_[rng.normal(-1.2, 0.3, 50), rng.normal(1.2, 0.3, 50)],
21
+ ]
22
+ )
23
+ data = (data - data.mean(axis=0)) / data.std(axis=0, ddof=1)
24
+ labels = ["Normal", "Right-skewed", "Bimodal"]
25
+ colors = ["#4477AA", "#228833", "#AA3377"]
26
+ limits = (np.floor(data.min()), np.ceil(data.max()))
27
+
28
+ fig, axs = uplt.subplots(ncols=2, refwidth=3.8, refaspect=1.1, share=False)
29
+
30
+ artists = axs[0].raincloud(
31
+ data,
32
+ labels=labels,
33
+ orientation="horizontal",
34
+ cycle=colors,
35
+ seed=7,
36
+ )
37
+ axs[0].format(
38
+ title="Horizontal raincloud",
39
+ xlabel="Standardised value",
40
+ yreverse=True,
41
+ xlim=limits,
42
+ grid=False,
43
+ )
44
+
45
+ axs[1].raincloud(data, labels=labels, cycle=colors, side="low", seed=7)
46
+ axs[1].format(
47
+ title="Vertical raincloud · cloud on low side",
48
+ ylabel="Standardised value",
49
+ ylim=limits,
50
+ grid=False,
51
+ )
52
+ axs.format(suptitle="Same mean and standard deviation, different distributions")
53
+ fig.show()
@@ -139,6 +139,7 @@ For details, see the full :doc:`User guide <usage>` and
139
139
  usage
140
140
  recipes
141
141
  gallery/index
142
+ cheatsheet
142
143
 
143
144
  .. toctree::
144
145
  :maxdepth: 1
@@ -146,6 +147,7 @@ For details, see the full :doc:`User guide <usage>` and
146
147
  :hidden:
147
148
 
148
149
  basics
150
+ plot_types
149
151
  subplots
150
152
  cartesian
151
153
  data_aware