ultraplot 2.7.1__tar.gz → 2.7.4__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 (526) hide show
  1. {ultraplot-2.7.1 → ultraplot-2.7.4}/.github/workflows/build-ultraplot.yml +13 -4
  2. {ultraplot-2.7.1 → ultraplot-2.7.4}/.gitignore +10 -0
  3. {ultraplot-2.7.1 → ultraplot-2.7.4}/.pre-commit-config.yaml +2 -2
  4. {ultraplot-2.7.1 → ultraplot-2.7.4}/.readthedocs.yml +2 -0
  5. ultraplot-2.7.4/MANIFEST.in +2 -0
  6. {ultraplot-2.7.1/ultraplot.egg-info → ultraplot-2.7.4}/PKG-INFO +4 -112
  7. {ultraplot-2.7.1 → ultraplot-2.7.4}/README.rst +2 -110
  8. ultraplot-2.7.4/docs/_ext/drawio-lazy.js +94 -0
  9. ultraplot-2.7.4/docs/_ext/drawio.py +162 -0
  10. ultraplot-2.7.4/docs/_scripts/build_plot_types.py +34 -0
  11. ultraplot-2.7.4/docs/_static/plot_types/raincloud.png +0 -0
  12. ultraplot-2.7.4/docs/cheatsheet.rst +49 -0
  13. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/conf.py +9 -0
  14. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/plot_types/05_box_violin.py +0 -1
  15. ultraplot-2.7.4/docs/examples/plot_types/13_raincloud.py +53 -0
  16. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/index.rst +6 -0
  17. ultraplot-2.7.4/docs/mcp.rst +105 -0
  18. ultraplot-2.7.4/docs/plot_types.rst +524 -0
  19. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/projections.py +31 -1
  20. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/stats.py +24 -2
  21. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/subplots.py +4 -0
  22. {ultraplot-2.7.1 → ultraplot-2.7.4}/pyproject.toml +10 -4
  23. ultraplot-2.7.4/tools/ci/collect_failed_comparisons.py +197 -0
  24. ultraplot-2.7.4/tools/ci/failed_comparisons_template.html +168 -0
  25. ultraplot-2.7.4/tools/ci/test_collect_failed_comparisons.py +136 -0
  26. {ultraplot-2.7.1 → ultraplot-2.7.4}/tools/expand_docstrings.py +3 -2
  27. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/__init__.py +14 -35
  28. ultraplot-2.7.1/ultraplot/config.py → ultraplot-2.7.4/ultraplot/_config.py +31 -1
  29. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/_interaction.py +1 -1
  30. ultraplot-2.7.4/ultraplot/_version.py +1 -0
  31. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/base.py +2 -3
  32. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/cartesian.py +1 -1
  33. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/container.py +1 -1
  34. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/geo.py +1 -1
  35. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/plot.py +196 -10
  36. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/plot_types/circlize.py +12 -11
  37. ultraplot-2.7.4/ultraplot/axes/plot_types/raincloud.py +516 -0
  38. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/plot_types/sankey.py +1 -1
  39. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/polar.py +1 -1
  40. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/shared.py +1 -1
  41. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/taylor.py +1 -1
  42. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/colorbar.py +1 -1
  43. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/colors.py +12 -6
  44. ultraplot-2.7.4/ultraplot/config.py +36 -0
  45. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/constructor.py +14 -5
  46. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/demos.py +1 -1
  47. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/figure.py +2 -2
  48. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/gridspec.py +72 -25
  49. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/internals/fonts.py +1 -1
  50. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/internals/inputs.py +2 -2
  51. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/internals/labels.py +1 -1
  52. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/internals/rcsetup.py +62 -0
  53. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/legend.py +1 -1
  54. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/scale.py +2 -2
  55. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_axes.py +4 -0
  56. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_circlize_integration.py +30 -7
  57. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_config.py +121 -8
  58. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_config_helpers_extra.py +1 -1
  59. ultraplot-2.7.4/ultraplot/tests/test_docstrings.py +64 -0
  60. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_figure.py +47 -8
  61. ultraplot-2.7.4/ultraplot/tests/test_raincloud.py +564 -0
  62. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_ultralayout.py +217 -0
  63. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/ticker.py +1 -1
  64. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/ultralayout.py +124 -118
  65. {ultraplot-2.7.1 → ultraplot-2.7.4/ultraplot.egg-info}/PKG-INFO +4 -112
  66. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot.egg-info/SOURCES.txt +16 -0
  67. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot.egg-info/requires.txt +1 -1
  68. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot.egg-info/scm_file_list.json +28 -0
  69. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot.egg-info/top_level.txt +0 -1
  70. ultraplot-2.7.1/ultraplot/_version.py +0 -1
  71. {ultraplot-2.7.1 → ultraplot-2.7.4}/.github/ISSUE_TEMPLATE.md +0 -0
  72. {ultraplot-2.7.1 → ultraplot-2.7.4}/.github/dependabot.yml +0 -0
  73. {ultraplot-2.7.1 → ultraplot-2.7.4}/.github/micromamba-condarc.yml +0 -0
  74. {ultraplot-2.7.1 → ultraplot-2.7.4}/.github/workflows/black.yml +0 -0
  75. {ultraplot-2.7.1 → ultraplot-2.7.4}/.github/workflows/main.yml +0 -0
  76. {ultraplot-2.7.1 → ultraplot-2.7.4}/.github/workflows/publish-pypi.yml +0 -0
  77. {ultraplot-2.7.1 → ultraplot-2.7.4}/.github/workflows/test-map.yml +0 -0
  78. {ultraplot-2.7.1 → ultraplot-2.7.4}/.zenodo.json +0 -0
  79. {ultraplot-2.7.1 → ultraplot-2.7.4}/CITATION.cff +0 -0
  80. {ultraplot-2.7.1 → ultraplot-2.7.4}/CODEOFCONDUCT.md +0 -0
  81. {ultraplot-2.7.1 → ultraplot-2.7.4}/CONTRIBUTING.rst +0 -0
  82. {ultraplot-2.7.1 → ultraplot-2.7.4}/INSTALL.rst +0 -0
  83. {ultraplot-2.7.1 → ultraplot-2.7.4}/LICENSE.txt +0 -0
  84. {ultraplot-2.7.1 → ultraplot-2.7.4}/UltraPlotLogo.svg +0 -0
  85. {ultraplot-2.7.1 → ultraplot-2.7.4}/codecov.yml +0 -0
  86. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/1dplots.py +0 -0
  87. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/2dplots.py +0 -0
  88. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/Makefile +0 -0
  89. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_ext/notoc.py +0 -0
  90. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_scripts/fetch_releases.py +0 -0
  91. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/alias-explorer-v3.css +0 -0
  92. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/alias-explorer-v3.js +0 -0
  93. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/alias-map.svg +0 -0
  94. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/custom.css +0 -0
  95. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/custom.js +0 -0
  96. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/example_plots/cartesian_example.svg +0 -0
  97. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/example_plots/colorbars_legends_example.svg +0 -0
  98. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/example_plots/colormaps_example.svg +0 -0
  99. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/example_plots/data_aware_example.svg +0 -0
  100. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/example_plots/panels_example.svg +0 -0
  101. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/example_plots/projection_example.svg +0 -0
  102. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/example_plots/subplot_example.svg +0 -0
  103. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/logo_blank.svg +0 -0
  104. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/logo_long.png +0 -0
  105. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/logo_long.svg +0 -0
  106. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/logo_social.png +0 -0
  107. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/logo_social.svg +0 -0
  108. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_static/logo_square.png +0 -0
  109. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/_templates/whatsnew_sidebar.html +0 -0
  110. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/about.rst +0 -0
  111. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/aliases.rst +0 -0
  112. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/api.rst +0 -0
  113. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/basics.py +0 -0
  114. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/cartesian.py +0 -0
  115. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/colorbars_legends.py +0 -0
  116. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/colormaps.py +0 -0
  117. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/colors.py +0 -0
  118. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/configuration.rst +0 -0
  119. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/contributing.rst +0 -0
  120. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/cycles.py +0 -0
  121. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/data_aware.py +0 -0
  122. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/README.txt +0 -0
  123. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/colors/01_cycle_colormap.py +0 -0
  124. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/colors/02_diverging_colormap.py +0 -0
  125. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/colors/README.txt +0 -0
  126. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/geo/01_robin_tracks.py +0 -0
  127. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/geo/02_orthographic_views.py +0 -0
  128. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/geo/03_projections_features.py +0 -0
  129. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/geo/04_choropleth.py +0 -0
  130. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/geo/README.txt +0 -0
  131. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/layouts/01_shared_axes_abc.py +0 -0
  132. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/layouts/02_complex_layout_insets.py +0 -0
  133. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/layouts/03_spanning_labels.py +0 -0
  134. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/layouts/README.txt +0 -0
  135. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/legend_types/01_semantic_legends.py +0 -0
  136. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/legends_colorbars/01_multi_colorbars.py +0 -0
  137. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/legends_colorbars/02_legend_inset_colorbar.py +0 -0
  138. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/legends_colorbars/03_semantic_legends.py +0 -0
  139. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/legends_colorbars/README.txt +0 -0
  140. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/plot_types/01_curved_quiver.py +0 -0
  141. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/plot_types/02_network_graph.py +0 -0
  142. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/plot_types/03_lollipop.py +0 -0
  143. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/plot_types/04_datetime_series.py +0 -0
  144. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/plot_types/06_ridge_plot.py +0 -0
  145. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/plot_types/07_radar.py +0 -0
  146. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/plot_types/07_sankey.py +0 -0
  147. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/plot_types/08_chord_diagram.py +0 -0
  148. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/plot_types/08_ternary.py +0 -0
  149. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/plot_types/09_phylogeny.py +0 -0
  150. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/plot_types/10_circos_bed.py +0 -0
  151. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/plot_types/11_topic_ribbon.py +0 -0
  152. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/plot_types/12_taylor_diagram.py +0 -0
  153. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/examples/plot_types/README.txt +0 -0
  154. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/external-links.rst +0 -0
  155. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/faq.rst +0 -0
  156. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/first_figure.py +0 -0
  157. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/fonts.py +0 -0
  158. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/insets_panels.py +0 -0
  159. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/install.rst +0 -0
  160. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/keyword_aliases.rst +0 -0
  161. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/lazy_loading.rst +0 -0
  162. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/make.bat +0 -0
  163. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/networks.py +0 -0
  164. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/recipes.py +0 -0
  165. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/requirements-rtd.txt +0 -0
  166. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/sphinxext/custom_roles.py +0 -0
  167. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/sphinxext/jupytext_cache.py +0 -0
  168. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/ultraplotrc +0 -0
  169. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/usage.rst +0 -0
  170. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/why.rst +0 -0
  171. {ultraplot-2.7.1 → ultraplot-2.7.4}/docs/why_ultraplot.py +0 -0
  172. {ultraplot-2.7.1 → ultraplot-2.7.4}/environment.yml +0 -0
  173. {ultraplot-2.7.1 → ultraplot-2.7.4}/logo/PermanentMarker-Regular.ttf +0 -0
  174. {ultraplot-2.7.1 → ultraplot-2.7.4}/logo/environment-logo.yml +0 -0
  175. {ultraplot-2.7.1 → ultraplot-2.7.4}/logo/logo.py +0 -0
  176. {ultraplot-2.7.1 → ultraplot-2.7.4}/logo/run-linter.sh +0 -0
  177. {ultraplot-2.7.1 → ultraplot-2.7.4}/logo/webicon.py +0 -0
  178. {ultraplot-2.7.1 → ultraplot-2.7.4}/logo/whyUltraPlot.svg +0 -0
  179. {ultraplot-2.7.1 → ultraplot-2.7.4}/noxfile.py +0 -0
  180. {ultraplot-2.7.1 → ultraplot-2.7.4}/requirements-minimal.txt +0 -0
  181. {ultraplot-2.7.1 → ultraplot-2.7.4}/setup.cfg +0 -0
  182. {ultraplot-2.7.1 → ultraplot-2.7.4}/setup.py +0 -0
  183. {ultraplot-2.7.1 → ultraplot-2.7.4}/tools/ci/build_test_map.py +0 -0
  184. {ultraplot-2.7.1 → ultraplot-2.7.4}/tools/ci/check_installed_docstrings.py +0 -0
  185. {ultraplot-2.7.1 → ultraplot-2.7.4}/tools/ci/select_tests.py +0 -0
  186. {ultraplot-2.7.1 → ultraplot-2.7.4}/tools/ci/static_consumer.py +0 -0
  187. {ultraplot-2.7.1 → ultraplot-2.7.4}/tools/ci/version_support.py +0 -0
  188. {ultraplot-2.7.1 → ultraplot-2.7.4}/tools/generate_alias_figure.py +0 -0
  189. {ultraplot-2.7.1 → ultraplot-2.7.4}/tools/generate_alias_reference.py +0 -0
  190. {ultraplot-2.7.1 → ultraplot-2.7.4}/tools/serve_alias_docs.py +0 -0
  191. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/.opencode/goals/state.json.lock +0 -0
  192. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/.opencode/goals/state.json.sessions/.migration-v1-complete +0 -0
  193. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/.opencode/goals/state.json.sessions/cc3e983cb1eb34ad9f66e65e9ff9910c47ddb4f26523966e07d6a8bf3bc830eb/state.json +0 -0
  194. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/.opencode/goals/state.json.sessions/cc3e983cb1eb34ad9f66e65e9ff9910c47ddb4f26523966e07d6a8bf3bc830eb/state.json.lock +0 -0
  195. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/_animation.py +0 -0
  196. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/_layout.py +0 -0
  197. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/_lazy.py +0 -0
  198. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/_sharing.py +0 -0
  199. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/_subplots.py +0 -0
  200. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/animation.py +0 -0
  201. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/__init__.py +0 -0
  202. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/_formatting.py +0 -0
  203. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/plot_types/__init__.py +0 -0
  204. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/plot_types/curved_quiver.py +0 -0
  205. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/plot_types/ribbon.py +0 -0
  206. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/axes/three.py +0 -0
  207. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Algae.rgb +0 -0
  208. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Amp.rgb +0 -0
  209. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/BR.rgb +0 -0
  210. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Balance.rgb +0 -0
  211. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Blues1_r.xml +0 -0
  212. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Blues2.xml +0 -0
  213. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Blues3.xml +0 -0
  214. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Blues4_r.xml +0 -0
  215. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Blues5.xml +0 -0
  216. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Blues6.xml +0 -0
  217. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Blues7.xml +0 -0
  218. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Blues8.xml +0 -0
  219. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Blues9.xml +0 -0
  220. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Boreal.json +0 -0
  221. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Browns1.xml +0 -0
  222. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Browns2.xml +0 -0
  223. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Browns3.xml +0 -0
  224. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Browns4.xml +0 -0
  225. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Browns5.xml +0 -0
  226. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Browns6.xml +0 -0
  227. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Browns7.xml +0 -0
  228. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Browns8.xml +0 -0
  229. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Browns9.xml +0 -0
  230. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/ColdHot.rgb +0 -0
  231. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Crest.rgb +0 -0
  232. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Curl.rgb +0 -0
  233. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Deep.rgb +0 -0
  234. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Delta.rgb +0 -0
  235. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Dense.rgb +0 -0
  236. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Div.json +0 -0
  237. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/DryWet.json +0 -0
  238. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Dusk.json +0 -0
  239. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Fire.json +0 -0
  240. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Flare.rgb +0 -0
  241. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Glacial.json +0 -0
  242. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Greens1_r.xml +0 -0
  243. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Greens2.xml +0 -0
  244. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Greens3_r.xml +0 -0
  245. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Greens4.xml +0 -0
  246. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Greens5.xml +0 -0
  247. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Greens6_r.xml +0 -0
  248. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Greens7.xml +0 -0
  249. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Greens8.xml +0 -0
  250. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Haline.rgb +0 -0
  251. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Ice.rgb +0 -0
  252. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/IceFire.rgb +0 -0
  253. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Mako.rgb +0 -0
  254. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Marine.json +0 -0
  255. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Matter.rgb +0 -0
  256. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Mono.txt +0 -0
  257. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/MonoCycle.txt +0 -0
  258. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/NegPos.json +0 -0
  259. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Oranges1.xml +0 -0
  260. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Oranges2.xml +0 -0
  261. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Oranges3.xml +0 -0
  262. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Oranges4.xml +0 -0
  263. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Oxy.rgb +0 -0
  264. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Phase.rgb +0 -0
  265. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Purples1_r.xml +0 -0
  266. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Purples2.xml +0 -0
  267. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Purples3.xml +0 -0
  268. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Reds1.xml +0 -0
  269. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Reds2.xml +0 -0
  270. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Reds3.xml +0 -0
  271. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Reds4.xml +0 -0
  272. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Reds5.xml +0 -0
  273. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Rocket.rgb +0 -0
  274. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Solar.rgb +0 -0
  275. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Speed.rgb +0 -0
  276. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Stellar.json +0 -0
  277. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Sunrise.json +0 -0
  278. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Sunset.json +0 -0
  279. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Tempo.rgb +0 -0
  280. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Thermal.rgb +0 -0
  281. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Turbid.rgb +0 -0
  282. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Vivid.xml +0 -0
  283. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Vlag.rgb +0 -0
  284. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Yellows1.xml +0 -0
  285. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Yellows2.xml +0 -0
  286. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Yellows3.xml +0 -0
  287. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/Yellows4.xml +0 -0
  288. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/acton.txt +0 -0
  289. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/bam.txt +0 -0
  290. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/bamO.txt +0 -0
  291. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/bamako.txt +0 -0
  292. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/batlow.txt +0 -0
  293. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/batlowK.txt +0 -0
  294. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/batlowW.txt +0 -0
  295. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/berlin.txt +0 -0
  296. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/bilbao.txt +0 -0
  297. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/broc.txt +0 -0
  298. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/brocO.txt +0 -0
  299. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/buda.txt +0 -0
  300. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/bukavu.txt +0 -0
  301. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/cork.txt +0 -0
  302. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/corkO.txt +0 -0
  303. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/davos.txt +0 -0
  304. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/devon.txt +0 -0
  305. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/fes.txt +0 -0
  306. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/hawaii.txt +0 -0
  307. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/imola.txt +0 -0
  308. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/lajolla.txt +0 -0
  309. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/lapaz.txt +0 -0
  310. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/lisbon.txt +0 -0
  311. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/nuuk.txt +0 -0
  312. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/oleron.txt +0 -0
  313. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/oslo.txt +0 -0
  314. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/roma.txt +0 -0
  315. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/romaO.txt +0 -0
  316. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/tofino.txt +0 -0
  317. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/tokyo.txt +0 -0
  318. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/turku.txt +0 -0
  319. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/vanimo.txt +0 -0
  320. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/vik.txt +0 -0
  321. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cmaps/vikO.txt +0 -0
  322. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/colors/opencolor.txt +0 -0
  323. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/colors/xkcd.txt +0 -0
  324. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cycles/538.hex +0 -0
  325. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cycles/FlatUI.hex +0 -0
  326. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cycles/Qual1.rgb +0 -0
  327. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cycles/Qual2.rgb +0 -0
  328. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cycles/bmh.hex +0 -0
  329. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cycles/classic.hex +0 -0
  330. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cycles/colorblind.hex +0 -0
  331. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cycles/colorblind10.hex +0 -0
  332. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cycles/default.hex +0 -0
  333. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cycles/ggplot.hex +0 -0
  334. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cycles/seaborn.hex +0 -0
  335. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/cycles/tableau.hex +0 -0
  336. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/externals/__init__.py +0 -0
  337. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/externals/hsluv.py +0 -0
  338. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraMath-Bold.ttf +0 -0
  339. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraMath-ExtraLight.ttf +0 -0
  340. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraMath-Heavy.ttf +0 -0
  341. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraMath-Light.ttf +0 -0
  342. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraMath-Medium.ttf +0 -0
  343. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraMath-Regular.ttf +0 -0
  344. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraMath-SemiBold.ttf +0 -0
  345. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraMath-UltraLight.ttf +0 -0
  346. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-Black.ttf +0 -0
  347. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-BlackItalic.ttf +0 -0
  348. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-Bold.ttf +0 -0
  349. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-BoldItalic.ttf +0 -0
  350. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-ExtraBold.ttf +0 -0
  351. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-ExtraBoldItalic.ttf +0 -0
  352. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-ExtraLight.ttf +0 -0
  353. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-ExtraLightItalic.ttf +0 -0
  354. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-Italic.ttf +0 -0
  355. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-Light.ttf +0 -0
  356. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-LightItalic.ttf +0 -0
  357. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-Medium.ttf +0 -0
  358. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-MediumItalic.ttf +0 -0
  359. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-Regular.ttf +0 -0
  360. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-SemiBold.ttf +0 -0
  361. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/FiraSans-SemiBoldItalic.ttf +0 -0
  362. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/LICENSE_FIRAMATH.txt +0 -0
  363. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/LICENSE_FIRASANS.txt +0 -0
  364. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/LICENSE_NOTOSANS.txt +0 -0
  365. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/LICENSE_NOTOSERIF.txt +0 -0
  366. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/LICENSE_OPENSANS.txt +0 -0
  367. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/LICENSE_ROBOTO.txt +0 -0
  368. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/LICENSE_SOURCESANS.txt +0 -0
  369. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/LICENSE_SOURCESERIF.txt +0 -0
  370. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/LICENSE_TEXGYRE.txt +0 -0
  371. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/LICENSE_UBUNTU.txt +0 -0
  372. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/NotoSans-Bold.ttf +0 -0
  373. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/NotoSans-BoldItalic.ttf +0 -0
  374. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/NotoSans-Italic.ttf +0 -0
  375. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/NotoSans-Regular.ttf +0 -0
  376. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/NotoSerif-Bold.ttf +0 -0
  377. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/NotoSerif-BoldItalic.ttf +0 -0
  378. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/NotoSerif-Italic.ttf +0 -0
  379. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/NotoSerif-Regular.ttf +0 -0
  380. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/OpenSans-Bold.ttf +0 -0
  381. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/OpenSans-BoldItalic.ttf +0 -0
  382. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/OpenSans-Italic.ttf +0 -0
  383. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/OpenSans-Regular.ttf +0 -0
  384. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/OpenSans-Semibold.ttf +0 -0
  385. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/OpenSans-SemiboldItalic.ttf +0 -0
  386. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Roboto-Black.ttf +0 -0
  387. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Roboto-BlackItalic.ttf +0 -0
  388. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Roboto-Bold.ttf +0 -0
  389. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Roboto-BoldItalic.ttf +0 -0
  390. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Roboto-Italic.ttf +0 -0
  391. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Roboto-Light.ttf +0 -0
  392. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Roboto-LightItalic.ttf +0 -0
  393. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Roboto-Medium.ttf +0 -0
  394. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Roboto-MediumItalic.ttf +0 -0
  395. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Roboto-Regular.ttf +0 -0
  396. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSansPro-Black.ttf +0 -0
  397. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSansPro-BlackItalic.ttf +0 -0
  398. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSansPro-Bold.ttf +0 -0
  399. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSansPro-BoldItalic.ttf +0 -0
  400. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSansPro-ExtraLight.ttf +0 -0
  401. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSansPro-ExtraLightItalic.ttf +0 -0
  402. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSansPro-Italic.ttf +0 -0
  403. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSansPro-Light.ttf +0 -0
  404. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSansPro-LightItalic.ttf +0 -0
  405. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSansPro-Regular.ttf +0 -0
  406. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSansPro-SemiBold.ttf +0 -0
  407. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSansPro-SemiBoldItalic.ttf +0 -0
  408. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSerifPro-Black.ttf +0 -0
  409. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSerifPro-BlackItalic.ttf +0 -0
  410. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSerifPro-Bold.ttf +0 -0
  411. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSerifPro-BoldItalic.ttf +0 -0
  412. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSerifPro-ExtraLight.ttf +0 -0
  413. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSerifPro-ExtraLightItalic.ttf +0 -0
  414. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSerifPro-Italic.ttf +0 -0
  415. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSerifPro-Light.ttf +0 -0
  416. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSerifPro-LightItalic.ttf +0 -0
  417. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSerifPro-Regular.ttf +0 -0
  418. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSerifPro-SemiBold.ttf +0 -0
  419. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/SourceSerifPro-SemiBoldItalic.ttf +0 -0
  420. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Ubuntu-Bold.ttf +0 -0
  421. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Ubuntu-BoldItalic.ttf +0 -0
  422. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Ubuntu-Italic.ttf +0 -0
  423. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Ubuntu-Light.ttf +0 -0
  424. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Ubuntu-LightItalic.ttf +0 -0
  425. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Ubuntu-Medium.ttf +0 -0
  426. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Ubuntu-MediumItalic.ttf +0 -0
  427. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/Ubuntu-Regular.ttf +0 -0
  428. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyreadventor-bold.ttf +0 -0
  429. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyreadventor-bolditalic.ttf +0 -0
  430. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyreadventor-italic.ttf +0 -0
  431. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyreadventor-regular.ttf +0 -0
  432. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyrebonum-bold.ttf +0 -0
  433. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyrebonum-bolditalic.ttf +0 -0
  434. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyrebonum-italic.ttf +0 -0
  435. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyrebonum-regular.ttf +0 -0
  436. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyrechorus-mediumitalic.ttf +0 -0
  437. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyrecursor-bold.ttf +0 -0
  438. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyrecursor-bolditalic.ttf +0 -0
  439. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyrecursor-italic.ttf +0 -0
  440. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyrecursor-regular.ttf +0 -0
  441. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyreheros-bold.ttf +0 -0
  442. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyreheros-bolditalic.ttf +0 -0
  443. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyreheros-italic.ttf +0 -0
  444. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyreheros-regular.ttf +0 -0
  445. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyrepagella-bold.ttf +0 -0
  446. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyrepagella-bolditalic.ttf +0 -0
  447. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyrepagella-italic.ttf +0 -0
  448. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyrepagella-regular.ttf +0 -0
  449. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyreschola-bold.ttf +0 -0
  450. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyreschola-bolditalic.ttf +0 -0
  451. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyreschola-italic.ttf +0 -0
  452. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyreschola-regular.ttf +0 -0
  453. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyretermes-bold.ttf +0 -0
  454. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyretermes-bolditalic.ttf +0 -0
  455. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyretermes-italic.ttf +0 -0
  456. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/fonts/texgyretermes-regular.ttf +0 -0
  457. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/internals/__init__.py +0 -0
  458. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/internals/benchmarks.py +0 -0
  459. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/internals/context.py +0 -0
  460. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/internals/docstring.py +0 -0
  461. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/internals/guides.py +0 -0
  462. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/internals/kwargs.py +0 -0
  463. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/internals/versions.py +0 -0
  464. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/internals/warnings.py +0 -0
  465. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/mcp.py +0 -0
  466. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/proj.py +0 -0
  467. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/py.typed +0 -0
  468. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/__init__.py +0 -0
  469. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/conftest.py +0 -0
  470. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_1dplots.py +0 -0
  471. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_2dplots.py +0 -0
  472. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_alias_signatures.py +0 -0
  473. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_animation.py +0 -0
  474. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_axes_alt_styles.py +0 -0
  475. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_axes_base_colorbar_helpers.py +0 -0
  476. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_base.py +0 -0
  477. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_colorbar.py +0 -0
  478. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_colorbar_helpers_extra.py +0 -0
  479. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_colormap.py +0 -0
  480. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_colormap_helpers_extra.py +0 -0
  481. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_colors.py +0 -0
  482. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_colors_helpers.py +0 -0
  483. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_constructor.py +0 -0
  484. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_constructor_helpers_extra.py +0 -0
  485. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_core_versions.py +0 -0
  486. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_demos.py +0 -0
  487. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_docs.py +0 -0
  488. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_docs_fetch_releases.py +0 -0
  489. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_docs_search.py +0 -0
  490. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_docstring_helpers.py +0 -0
  491. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_external_axes_container_integration.py +0 -0
  492. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_external_container_edge_cases.py +0 -0
  493. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_external_container_mocked.py +0 -0
  494. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_fonts.py +0 -0
  495. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_format.py +0 -0
  496. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_geographic.py +0 -0
  497. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_gridspec.py +0 -0
  498. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_handlers.py +0 -0
  499. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_imports.py +0 -0
  500. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_imshow.py +0 -0
  501. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_inputs.py +0 -0
  502. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_inputs_helpers.py +0 -0
  503. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_inset.py +0 -0
  504. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_integration.py +0 -0
  505. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_kwargs_helpers.py +0 -0
  506. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_legend.py +0 -0
  507. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_mcp.py +0 -0
  508. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_plot.py +0 -0
  509. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_proj_helpers.py +0 -0
  510. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_projections.py +0 -0
  511. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_rcsetup_helpers.py +0 -0
  512. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_release_metadata.py +0 -0
  513. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_scale_helpers.py +0 -0
  514. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_semantic_legend.py +0 -0
  515. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_statistical_plotting.py +0 -0
  516. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_subplot_manager.py +0 -0
  517. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_subplots.py +0 -0
  518. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_text_helpers.py +0 -0
  519. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_textalign.py +0 -0
  520. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/tests/test_tickers.py +0 -0
  521. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/text.py +0 -0
  522. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/textalign.py +0 -0
  523. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/ui.py +0 -0
  524. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot/utils.py +0 -0
  525. {ultraplot-2.7.1 → ultraplot-2.7.4}/ultraplot.egg-info/dependency_links.txt +0 -0
  526. {ultraplot-2.7.1 → ultraplot-2.7.4}/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.1
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.9.8
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.1
3
+ Version: 2.7.4
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.40.1; 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
@@ -158,20 +158,6 @@ UltraPlot is published on `PyPi <https://pypi.org/project/ultraplot/>`__ and
158
158
  pip install ultraplot
159
159
  conda install -c conda-forge ultraplot
160
160
 
161
- pyCirclize-based plots require the optional ``circos`` extra:
162
-
163
- .. code-block:: bash
164
-
165
- pip install 'ultraplot[circos]'
166
-
167
- The ``docs`` extra also includes pyCirclize for building the documentation.
168
-
169
- To install the ``circos``, ``docs``, and ``stats`` dependency groups together:
170
-
171
- .. code-block:: bash
172
-
173
- pip install 'ultraplot[all]'
174
-
175
161
  Likewise, an existing installation of UltraPlot can be upgraded
176
162
  to the latest version with:
177
163
 
@@ -192,102 +178,8 @@ UltraPlot includes a Model Context Protocol (MCP) server that lets AI assistants
192
178
  search documentation and examples, inspect the live Python API, and read source
193
179
  code and release notes.
194
180
 
195
- Run directly with uvx
196
- ---------------------
197
-
198
- With `uv <https://docs.astral.sh/uv/getting-started/installation/>`__ installed,
199
- your MCP client can launch the server with ``uvx``. uv installs the package and
200
- its dependencies in an isolated environment automatically, so you do not need
201
- to create a virtual environment or install UltraPlot separately.
202
-
203
- For a PyPI release containing the MCP server, the launch command is:
204
-
205
- .. code-block:: bash
206
-
207
- uvx --from 'ultraplot[mcp]' ultraplot-mcp
208
-
209
- For clients that use an ``mcpServers`` configuration, add:
210
-
211
- .. code-block:: json
212
-
213
- {
214
- "mcpServers": {
215
- "ultraplot": {
216
- "command": "uvx",
217
- "args": ["--from", "ultraplot[mcp]", "ultraplot-mcp"]
218
- }
219
- }
220
- }
221
-
222
- The client starts the server when needed and communicates with it over stdio.
223
- Other clients may use a different configuration format; use the same command
224
- and arguments. ``uvx`` is equivalent to ``uv tool run``.
225
-
226
- Until the MCP server is released on PyPI, run it directly from the feature
227
- branch instead:
228
-
229
- .. code-block:: bash
230
-
231
- uvx --from 'ultraplot[mcp] @ git+https://github.com/ultraplot/ultraplot.git@feat/mcp' ultraplot-mcp
232
-
233
- For this development version, replace ``ultraplot[mcp]`` in the client
234
- configuration with
235
- ``ultraplot[mcp] @ git+https://github.com/ultraplot/ultraplot.git@feat/mcp``.
236
-
237
- Install persistently with uv
238
- ----------------------------
239
-
240
- Alternatively, keep the executable on your ``PATH`` by installing it as a uv
241
- tool. For a PyPI release containing the MCP server:
242
-
243
- .. code-block:: bash
244
-
245
- uv tool install 'ultraplot[mcp]'
246
- ultraplot-mcp --help
247
-
248
- Before that release, install from the feature branch:
249
-
250
- .. code-block:: bash
251
-
252
- uv tool install 'ultraplot[mcp] @ git+https://github.com/ultraplot/ultraplot.git@feat/mcp'
253
-
254
- Then configure your client to launch ``ultraplot-mcp`` with no arguments.
255
- If uv reports that its executable directory is missing from ``PATH``, run
256
- ``uv tool update-shell`` and restart your shell.
257
-
258
- Install from a checkout
259
- -----------------------
260
-
261
- From a checkout containing the MCP implementation, install the optional ``mcp``
262
- extra in the Python environment you want the server to use:
263
-
264
- .. code-block:: bash
265
-
266
- pip install -e '.[mcp]'
267
-
268
- Connect an MCP client
269
- ---------------------
270
-
271
- After installing persistently with uv or pip, register the server with an
272
- installed Codex CLI:
273
-
274
- .. code-block:: bash
275
-
276
- ultraplot-mcp install codex
277
-
278
- Restart Codex after registration. Try asking it to search the UltraPlot
279
- examples for shared colorbars or inspect ``ultraplot.subplots``.
280
-
281
- For other MCP clients, configure a stdio server with ``ultraplot-mcp`` as the
282
- command and no arguments. Use the executable's absolute path if the client does
283
- not inherit your Python environment's ``PATH``. Running ``ultraplot-mcp`` starts
284
- the server; ``ultraplot-mcp --help`` lists the available commands.
285
-
286
- Documentation tools read the checkout's ``docs`` directory. Direct uvx and uv
287
- tool installations require a separate documentation checkout for these tools.
288
- If documentation lives elsewhere, set ``ULTRAPLOT_MCP_DOCS`` to its absolute path in the MCP
289
- client's server environment. Documentation is not currently bundled in the
290
- Python package; API and source inspection use the installed UltraPlot version.
181
+ See the `MCP installation guide <https://ultraplot.readthedocs.io/en/latest/mcp.html>`__
182
+ for installation instructions, client configuration, and documentation setup.
291
183
 
292
184
  Citing UltraPlot
293
185
  ================
@@ -104,20 +104,6 @@ UltraPlot is published on `PyPi <https://pypi.org/project/ultraplot/>`__ and
104
104
  pip install ultraplot
105
105
  conda install -c conda-forge ultraplot
106
106
 
107
- pyCirclize-based plots require the optional ``circos`` extra:
108
-
109
- .. code-block:: bash
110
-
111
- pip install 'ultraplot[circos]'
112
-
113
- The ``docs`` extra also includes pyCirclize for building the documentation.
114
-
115
- To install the ``circos``, ``docs``, and ``stats`` dependency groups together:
116
-
117
- .. code-block:: bash
118
-
119
- pip install 'ultraplot[all]'
120
-
121
107
  Likewise, an existing installation of UltraPlot can be upgraded
122
108
  to the latest version with:
123
109
 
@@ -138,102 +124,8 @@ UltraPlot includes a Model Context Protocol (MCP) server that lets AI assistants
138
124
  search documentation and examples, inspect the live Python API, and read source
139
125
  code and release notes.
140
126
 
141
- Run directly with uvx
142
- ---------------------
143
-
144
- With `uv <https://docs.astral.sh/uv/getting-started/installation/>`__ installed,
145
- your MCP client can launch the server with ``uvx``. uv installs the package and
146
- its dependencies in an isolated environment automatically, so you do not need
147
- to create a virtual environment or install UltraPlot separately.
148
-
149
- For a PyPI release containing the MCP server, the launch command is:
150
-
151
- .. code-block:: bash
152
-
153
- uvx --from 'ultraplot[mcp]' ultraplot-mcp
154
-
155
- For clients that use an ``mcpServers`` configuration, add:
156
-
157
- .. code-block:: json
158
-
159
- {
160
- "mcpServers": {
161
- "ultraplot": {
162
- "command": "uvx",
163
- "args": ["--from", "ultraplot[mcp]", "ultraplot-mcp"]
164
- }
165
- }
166
- }
167
-
168
- The client starts the server when needed and communicates with it over stdio.
169
- Other clients may use a different configuration format; use the same command
170
- and arguments. ``uvx`` is equivalent to ``uv tool run``.
171
-
172
- Until the MCP server is released on PyPI, run it directly from the feature
173
- branch instead:
174
-
175
- .. code-block:: bash
176
-
177
- uvx --from 'ultraplot[mcp] @ git+https://github.com/ultraplot/ultraplot.git@feat/mcp' ultraplot-mcp
178
-
179
- For this development version, replace ``ultraplot[mcp]`` in the client
180
- configuration with
181
- ``ultraplot[mcp] @ git+https://github.com/ultraplot/ultraplot.git@feat/mcp``.
182
-
183
- Install persistently with uv
184
- ----------------------------
185
-
186
- Alternatively, keep the executable on your ``PATH`` by installing it as a uv
187
- tool. For a PyPI release containing the MCP server:
188
-
189
- .. code-block:: bash
190
-
191
- uv tool install 'ultraplot[mcp]'
192
- ultraplot-mcp --help
193
-
194
- Before that release, install from the feature branch:
195
-
196
- .. code-block:: bash
197
-
198
- uv tool install 'ultraplot[mcp] @ git+https://github.com/ultraplot/ultraplot.git@feat/mcp'
199
-
200
- Then configure your client to launch ``ultraplot-mcp`` with no arguments.
201
- If uv reports that its executable directory is missing from ``PATH``, run
202
- ``uv tool update-shell`` and restart your shell.
203
-
204
- Install from a checkout
205
- -----------------------
206
-
207
- From a checkout containing the MCP implementation, install the optional ``mcp``
208
- extra in the Python environment you want the server to use:
209
-
210
- .. code-block:: bash
211
-
212
- pip install -e '.[mcp]'
213
-
214
- Connect an MCP client
215
- ---------------------
216
-
217
- After installing persistently with uv or pip, register the server with an
218
- installed Codex CLI:
219
-
220
- .. code-block:: bash
221
-
222
- ultraplot-mcp install codex
223
-
224
- Restart Codex after registration. Try asking it to search the UltraPlot
225
- examples for shared colorbars or inspect ``ultraplot.subplots``.
226
-
227
- For other MCP clients, configure a stdio server with ``ultraplot-mcp`` as the
228
- command and no arguments. Use the executable's absolute path if the client does
229
- not inherit your Python environment's ``PATH``. Running ``ultraplot-mcp`` starts
230
- the server; ``ultraplot-mcp --help`` lists the available commands.
231
-
232
- Documentation tools read the checkout's ``docs`` directory. Direct uvx and uv
233
- tool installations require a separate documentation checkout for these tools.
234
- If documentation lives elsewhere, set ``ULTRAPLOT_MCP_DOCS`` to its absolute path in the MCP
235
- client's server environment. Documentation is not currently bundled in the
236
- Python package; API and source inspection use the installed UltraPlot version.
127
+ See the `MCP installation guide <https://ultraplot.readthedocs.io/en/latest/mcp.html>`__
128
+ for installation instructions, client configuration, and documentation setup.
237
129
 
238
130
  Citing UltraPlot
239
131
  ================
@@ -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()