ultraplot 1.71.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. ultraplot-1.71.0/.github/ISSUE_TEMPLATE.md +31 -0
  2. ultraplot-1.71.0/.github/dependabot.yml +10 -0
  3. ultraplot-1.71.0/.github/workflows/build-ultraplot.yml +130 -0
  4. ultraplot-1.71.0/.github/workflows/main.yml +155 -0
  5. ultraplot-1.71.0/.github/workflows/publish-pypi.yml +121 -0
  6. ultraplot-1.71.0/.gitignore +50 -0
  7. ultraplot-1.71.0/.pre-commit-config.yaml +16 -0
  8. ultraplot-1.71.0/.readthedocs.yml +24 -0
  9. ultraplot-1.71.0/.zenodo.json +39 -0
  10. ultraplot-1.71.0/CITATION.cff +33 -0
  11. ultraplot-1.71.0/CODEOFCONDUCT.md +128 -0
  12. ultraplot-1.71.0/CONTRIBUTING.rst +1 -0
  13. ultraplot-1.71.0/INSTALL.rst +30 -0
  14. ultraplot-1.71.0/LICENSE.txt +19 -0
  15. ultraplot-1.71.0/PKG-INFO +194 -0
  16. ultraplot-1.71.0/README.rst +167 -0
  17. ultraplot-1.71.0/UltraPlotLogo.svg +1904 -0
  18. ultraplot-1.71.0/codecov.yml +33 -0
  19. ultraplot-1.71.0/docs/1dplots.py +651 -0
  20. ultraplot-1.71.0/docs/2dplots.py +717 -0
  21. ultraplot-1.71.0/docs/Makefile +28 -0
  22. ultraplot-1.71.0/docs/_ext/notoc.py +21 -0
  23. ultraplot-1.71.0/docs/_scripts/fetch_releases.py +139 -0
  24. ultraplot-1.71.0/docs/_static/custom.css +367 -0
  25. ultraplot-1.71.0/docs/_static/custom.js +383 -0
  26. ultraplot-1.71.0/docs/_static/example_plots/cartesian_example.svg +2822 -0
  27. ultraplot-1.71.0/docs/_static/example_plots/colorbars_legends_example.svg +10066 -0
  28. ultraplot-1.71.0/docs/_static/example_plots/colormaps_example.svg +39886 -0
  29. ultraplot-1.71.0/docs/_static/example_plots/panels_example.svg +6472 -0
  30. ultraplot-1.71.0/docs/_static/example_plots/projection_example.svg +10840 -0
  31. ultraplot-1.71.0/docs/_static/example_plots/subplot_example.svg +1488 -0
  32. ultraplot-1.71.0/docs/_static/logo_blank.svg +1507 -0
  33. ultraplot-1.71.0/docs/_static/logo_long.png +0 -0
  34. ultraplot-1.71.0/docs/_static/logo_long.svg +1468 -0
  35. ultraplot-1.71.0/docs/_static/logo_social.png +0 -0
  36. ultraplot-1.71.0/docs/_static/logo_social.svg +1468 -0
  37. ultraplot-1.71.0/docs/_static/logo_square.png +0 -0
  38. ultraplot-1.71.0/docs/_templates/whatsnew_sidebar.html +21 -0
  39. ultraplot-1.71.0/docs/about.rst +52 -0
  40. ultraplot-1.71.0/docs/api.rst +144 -0
  41. ultraplot-1.71.0/docs/basics.py +567 -0
  42. ultraplot-1.71.0/docs/cartesian.py +742 -0
  43. ultraplot-1.71.0/docs/colorbars_legends.py +512 -0
  44. ultraplot-1.71.0/docs/colormaps.py +501 -0
  45. ultraplot-1.71.0/docs/colors.py +201 -0
  46. ultraplot-1.71.0/docs/conf.py +521 -0
  47. ultraplot-1.71.0/docs/configuration.rst +189 -0
  48. ultraplot-1.71.0/docs/contributing.rst +295 -0
  49. ultraplot-1.71.0/docs/cycles.py +220 -0
  50. ultraplot-1.71.0/docs/examples/README.txt +6 -0
  51. ultraplot-1.71.0/docs/examples/colors/01_cycle_colormap.py +41 -0
  52. ultraplot-1.71.0/docs/examples/colors/02_diverging_colormap.py +52 -0
  53. ultraplot-1.71.0/docs/examples/colors/README.txt +0 -0
  54. ultraplot-1.71.0/docs/examples/geo/01_robin_tracks.py +37 -0
  55. ultraplot-1.71.0/docs/examples/geo/02_orthographic_views.py +46 -0
  56. ultraplot-1.71.0/docs/examples/geo/03_projections_features.py +44 -0
  57. ultraplot-1.71.0/docs/examples/geo/README.txt +0 -0
  58. ultraplot-1.71.0/docs/examples/layouts/01_shared_axes_abc.py +45 -0
  59. ultraplot-1.71.0/docs/examples/layouts/02_complex_layout_insets.py +63 -0
  60. ultraplot-1.71.0/docs/examples/layouts/03_spanning_labels.py +49 -0
  61. ultraplot-1.71.0/docs/examples/layouts/README.txt +0 -0
  62. ultraplot-1.71.0/docs/examples/legends_colorbars/01_multi_colorbars.py +45 -0
  63. ultraplot-1.71.0/docs/examples/legends_colorbars/02_legend_inset_colorbar.py +40 -0
  64. ultraplot-1.71.0/docs/examples/legends_colorbars/README.txt +0 -0
  65. ultraplot-1.71.0/docs/examples/plot_types/01_curved_quiver.py +77 -0
  66. ultraplot-1.71.0/docs/examples/plot_types/02_network_graph.py +57 -0
  67. ultraplot-1.71.0/docs/examples/plot_types/03_lollipop.py +39 -0
  68. ultraplot-1.71.0/docs/examples/plot_types/04_datetime_series.py +50 -0
  69. ultraplot-1.71.0/docs/examples/plot_types/05_box_violin.py +39 -0
  70. ultraplot-1.71.0/docs/examples/plot_types/06_ridge_plot.py +24 -0
  71. ultraplot-1.71.0/docs/examples/plot_types/README.txt +0 -0
  72. ultraplot-1.71.0/docs/external-links.rst +125 -0
  73. ultraplot-1.71.0/docs/faq.rst +110 -0
  74. ultraplot-1.71.0/docs/fonts.py +154 -0
  75. ultraplot-1.71.0/docs/index.rst +164 -0
  76. ultraplot-1.71.0/docs/insets_panels.py +194 -0
  77. ultraplot-1.71.0/docs/install.rst +1 -0
  78. ultraplot-1.71.0/docs/lazy_loading.rst +54 -0
  79. ultraplot-1.71.0/docs/make.bat +41 -0
  80. ultraplot-1.71.0/docs/networks.py +84 -0
  81. ultraplot-1.71.0/docs/projections.py +610 -0
  82. ultraplot-1.71.0/docs/sphinxext/custom_roles.py +65 -0
  83. ultraplot-1.71.0/docs/stats.py +458 -0
  84. ultraplot-1.71.0/docs/subplots.py +527 -0
  85. ultraplot-1.71.0/docs/ultraplotrc +4 -0
  86. ultraplot-1.71.0/docs/usage.rst +203 -0
  87. ultraplot-1.71.0/docs/why.rst +924 -0
  88. ultraplot-1.71.0/environment.yml +37 -0
  89. ultraplot-1.71.0/logo/PermanentMarker-Regular.ttf +0 -0
  90. ultraplot-1.71.0/logo/environment-logo.yml +38 -0
  91. ultraplot-1.71.0/logo/logo.py +213 -0
  92. ultraplot-1.71.0/logo/run-linter.sh +19 -0
  93. ultraplot-1.71.0/logo/webicon.py +64 -0
  94. ultraplot-1.71.0/logo/whyUltraPlot.svg +1 -0
  95. ultraplot-1.71.0/pyproject.toml +57 -0
  96. ultraplot-1.71.0/setup.cfg +4 -0
  97. ultraplot-1.71.0/ultraplot/__init__.py +237 -0
  98. ultraplot-1.71.0/ultraplot/_lazy.py +227 -0
  99. ultraplot-1.71.0/ultraplot/_version.py +1 -0
  100. ultraplot-1.71.0/ultraplot/axes/__init__.py +42 -0
  101. ultraplot-1.71.0/ultraplot/axes/base.py +4074 -0
  102. ultraplot-1.71.0/ultraplot/axes/cartesian.py +1632 -0
  103. ultraplot-1.71.0/ultraplot/axes/geo.py +3378 -0
  104. ultraplot-1.71.0/ultraplot/axes/plot.py +6297 -0
  105. ultraplot-1.71.0/ultraplot/axes/plot_types/__init__.py +0 -0
  106. ultraplot-1.71.0/ultraplot/axes/plot_types/curved_quiver.py +413 -0
  107. ultraplot-1.71.0/ultraplot/axes/polar.py +391 -0
  108. ultraplot-1.71.0/ultraplot/axes/shared.py +232 -0
  109. ultraplot-1.71.0/ultraplot/axes/three.py +34 -0
  110. ultraplot-1.71.0/ultraplot/cmaps/Algae.rgb +256 -0
  111. ultraplot-1.71.0/ultraplot/cmaps/Amp.rgb +256 -0
  112. ultraplot-1.71.0/ultraplot/cmaps/BR.rgb +256 -0
  113. ultraplot-1.71.0/ultraplot/cmaps/Balance.rgb +256 -0
  114. ultraplot-1.71.0/ultraplot/cmaps/Blues1_r.xml +17 -0
  115. ultraplot-1.71.0/ultraplot/cmaps/Blues2.xml +16 -0
  116. ultraplot-1.71.0/ultraplot/cmaps/Blues3.xml +25 -0
  117. ultraplot-1.71.0/ultraplot/cmaps/Blues4_r.xml +17 -0
  118. ultraplot-1.71.0/ultraplot/cmaps/Blues5.xml +16 -0
  119. ultraplot-1.71.0/ultraplot/cmaps/Blues6.xml +25 -0
  120. ultraplot-1.71.0/ultraplot/cmaps/Blues7.xml +16 -0
  121. ultraplot-1.71.0/ultraplot/cmaps/Blues8.xml +17 -0
  122. ultraplot-1.71.0/ultraplot/cmaps/Blues9.xml +1 -0
  123. ultraplot-1.71.0/ultraplot/cmaps/Boreal.json +53 -0
  124. ultraplot-1.71.0/ultraplot/cmaps/Browns1.xml +16 -0
  125. ultraplot-1.71.0/ultraplot/cmaps/Browns2.xml +26 -0
  126. ultraplot-1.71.0/ultraplot/cmaps/Browns3.xml +17 -0
  127. ultraplot-1.71.0/ultraplot/cmaps/Browns4.xml +17 -0
  128. ultraplot-1.71.0/ultraplot/cmaps/Browns5.xml +26 -0
  129. ultraplot-1.71.0/ultraplot/cmaps/Browns6.xml +17 -0
  130. ultraplot-1.71.0/ultraplot/cmaps/Browns7.xml +19 -0
  131. ultraplot-1.71.0/ultraplot/cmaps/Browns8.xml +11 -0
  132. ultraplot-1.71.0/ultraplot/cmaps/Browns9.xml +1 -0
  133. ultraplot-1.71.0/ultraplot/cmaps/ColdHot.rgb +229 -0
  134. ultraplot-1.71.0/ultraplot/cmaps/Crest.rgb +256 -0
  135. ultraplot-1.71.0/ultraplot/cmaps/Curl.rgb +512 -0
  136. ultraplot-1.71.0/ultraplot/cmaps/Deep.rgb +256 -0
  137. ultraplot-1.71.0/ultraplot/cmaps/Delta.rgb +512 -0
  138. ultraplot-1.71.0/ultraplot/cmaps/Dense.rgb +256 -0
  139. ultraplot-1.71.0/ultraplot/cmaps/Div.json +71 -0
  140. ultraplot-1.71.0/ultraplot/cmaps/DryWet.json +73 -0
  141. ultraplot-1.71.0/ultraplot/cmaps/Dusk.json +53 -0
  142. ultraplot-1.71.0/ultraplot/cmaps/Fire.json +53 -0
  143. ultraplot-1.71.0/ultraplot/cmaps/Flare.rgb +256 -0
  144. ultraplot-1.71.0/ultraplot/cmaps/Glacial.json +53 -0
  145. ultraplot-1.71.0/ultraplot/cmaps/Greens1_r.xml +26 -0
  146. ultraplot-1.71.0/ultraplot/cmaps/Greens2.xml +28 -0
  147. ultraplot-1.71.0/ultraplot/cmaps/Greens3_r.xml +28 -0
  148. ultraplot-1.71.0/ultraplot/cmaps/Greens4.xml +17 -0
  149. ultraplot-1.71.0/ultraplot/cmaps/Greens5.xml +16 -0
  150. ultraplot-1.71.0/ultraplot/cmaps/Greens6_r.xml +16 -0
  151. ultraplot-1.71.0/ultraplot/cmaps/Greens7.xml +16 -0
  152. ultraplot-1.71.0/ultraplot/cmaps/Greens8.xml +26 -0
  153. ultraplot-1.71.0/ultraplot/cmaps/Haline.rgb +256 -0
  154. ultraplot-1.71.0/ultraplot/cmaps/Ice.rgb +256 -0
  155. ultraplot-1.71.0/ultraplot/cmaps/IceFire.rgb +256 -0
  156. ultraplot-1.71.0/ultraplot/cmaps/Mako.rgb +256 -0
  157. ultraplot-1.71.0/ultraplot/cmaps/Marine.json +53 -0
  158. ultraplot-1.71.0/ultraplot/cmaps/Matter.rgb +256 -0
  159. ultraplot-1.71.0/ultraplot/cmaps/Mono.txt +256 -0
  160. ultraplot-1.71.0/ultraplot/cmaps/MonoCycle.txt +256 -0
  161. ultraplot-1.71.0/ultraplot/cmaps/NegPos.json +71 -0
  162. ultraplot-1.71.0/ultraplot/cmaps/Oranges1.xml +27 -0
  163. ultraplot-1.71.0/ultraplot/cmaps/Oranges2.xml +26 -0
  164. ultraplot-1.71.0/ultraplot/cmaps/Oranges3.xml +15 -0
  165. ultraplot-1.71.0/ultraplot/cmaps/Oranges4.xml +23 -0
  166. ultraplot-1.71.0/ultraplot/cmaps/Oxy.rgb +256 -0
  167. ultraplot-1.71.0/ultraplot/cmaps/Phase.rgb +256 -0
  168. ultraplot-1.71.0/ultraplot/cmaps/Purples1_r.xml +16 -0
  169. ultraplot-1.71.0/ultraplot/cmaps/Purples2.xml +17 -0
  170. ultraplot-1.71.0/ultraplot/cmaps/Purples3.xml +18 -0
  171. ultraplot-1.71.0/ultraplot/cmaps/Reds1.xml +26 -0
  172. ultraplot-1.71.0/ultraplot/cmaps/Reds2.xml +22 -0
  173. ultraplot-1.71.0/ultraplot/cmaps/Reds3.xml +23 -0
  174. ultraplot-1.71.0/ultraplot/cmaps/Reds4.xml +26 -0
  175. ultraplot-1.71.0/ultraplot/cmaps/Reds5.xml +17 -0
  176. ultraplot-1.71.0/ultraplot/cmaps/Rocket.rgb +256 -0
  177. ultraplot-1.71.0/ultraplot/cmaps/Solar.rgb +256 -0
  178. ultraplot-1.71.0/ultraplot/cmaps/Speed.rgb +256 -0
  179. ultraplot-1.71.0/ultraplot/cmaps/Stellar.json +53 -0
  180. ultraplot-1.71.0/ultraplot/cmaps/Sunrise.json +53 -0
  181. ultraplot-1.71.0/ultraplot/cmaps/Sunset.json +53 -0
  182. ultraplot-1.71.0/ultraplot/cmaps/Tempo.rgb +256 -0
  183. ultraplot-1.71.0/ultraplot/cmaps/Thermal.rgb +256 -0
  184. ultraplot-1.71.0/ultraplot/cmaps/Turbid.rgb +256 -0
  185. ultraplot-1.71.0/ultraplot/cmaps/Vivid.xml +11 -0
  186. ultraplot-1.71.0/ultraplot/cmaps/Vlag.rgb +256 -0
  187. ultraplot-1.71.0/ultraplot/cmaps/Yellows1.xml +17 -0
  188. ultraplot-1.71.0/ultraplot/cmaps/Yellows2.xml +17 -0
  189. ultraplot-1.71.0/ultraplot/cmaps/Yellows3.xml +17 -0
  190. ultraplot-1.71.0/ultraplot/cmaps/Yellows4.xml +17 -0
  191. ultraplot-1.71.0/ultraplot/cmaps/acton.txt +256 -0
  192. ultraplot-1.71.0/ultraplot/cmaps/bam.txt +256 -0
  193. ultraplot-1.71.0/ultraplot/cmaps/bamO.txt +256 -0
  194. ultraplot-1.71.0/ultraplot/cmaps/bamako.txt +256 -0
  195. ultraplot-1.71.0/ultraplot/cmaps/batlow.txt +256 -0
  196. ultraplot-1.71.0/ultraplot/cmaps/batlowK.txt +256 -0
  197. ultraplot-1.71.0/ultraplot/cmaps/batlowW.txt +256 -0
  198. ultraplot-1.71.0/ultraplot/cmaps/berlin.txt +256 -0
  199. ultraplot-1.71.0/ultraplot/cmaps/bilbao.txt +256 -0
  200. ultraplot-1.71.0/ultraplot/cmaps/broc.txt +256 -0
  201. ultraplot-1.71.0/ultraplot/cmaps/brocO.txt +256 -0
  202. ultraplot-1.71.0/ultraplot/cmaps/buda.txt +256 -0
  203. ultraplot-1.71.0/ultraplot/cmaps/bukavu.txt +256 -0
  204. ultraplot-1.71.0/ultraplot/cmaps/cork.txt +256 -0
  205. ultraplot-1.71.0/ultraplot/cmaps/corkO.txt +256 -0
  206. ultraplot-1.71.0/ultraplot/cmaps/davos.txt +256 -0
  207. ultraplot-1.71.0/ultraplot/cmaps/devon.txt +256 -0
  208. ultraplot-1.71.0/ultraplot/cmaps/fes.txt +256 -0
  209. ultraplot-1.71.0/ultraplot/cmaps/hawaii.txt +256 -0
  210. ultraplot-1.71.0/ultraplot/cmaps/imola.txt +256 -0
  211. ultraplot-1.71.0/ultraplot/cmaps/lajolla.txt +256 -0
  212. ultraplot-1.71.0/ultraplot/cmaps/lapaz.txt +256 -0
  213. ultraplot-1.71.0/ultraplot/cmaps/lisbon.txt +256 -0
  214. ultraplot-1.71.0/ultraplot/cmaps/nuuk.txt +256 -0
  215. ultraplot-1.71.0/ultraplot/cmaps/oleron.txt +256 -0
  216. ultraplot-1.71.0/ultraplot/cmaps/oslo.txt +256 -0
  217. ultraplot-1.71.0/ultraplot/cmaps/roma.txt +256 -0
  218. ultraplot-1.71.0/ultraplot/cmaps/romaO.txt +256 -0
  219. ultraplot-1.71.0/ultraplot/cmaps/tofino.txt +256 -0
  220. ultraplot-1.71.0/ultraplot/cmaps/tokyo.txt +256 -0
  221. ultraplot-1.71.0/ultraplot/cmaps/turku.txt +256 -0
  222. ultraplot-1.71.0/ultraplot/cmaps/vanimo.txt +256 -0
  223. ultraplot-1.71.0/ultraplot/cmaps/vik.txt +256 -0
  224. ultraplot-1.71.0/ultraplot/cmaps/vikO.txt +256 -0
  225. ultraplot-1.71.0/ultraplot/colors/opencolor.txt +132 -0
  226. ultraplot-1.71.0/ultraplot/colors/xkcd.txt +951 -0
  227. ultraplot-1.71.0/ultraplot/colors.py +3315 -0
  228. ultraplot-1.71.0/ultraplot/config.py +1859 -0
  229. ultraplot-1.71.0/ultraplot/constructor.py +1687 -0
  230. ultraplot-1.71.0/ultraplot/cycles/538.hex +2 -0
  231. ultraplot-1.71.0/ultraplot/cycles/FlatUI.hex +1 -0
  232. ultraplot-1.71.0/ultraplot/cycles/Qual1.rgb +7 -0
  233. ultraplot-1.71.0/ultraplot/cycles/Qual2.rgb +13 -0
  234. ultraplot-1.71.0/ultraplot/cycles/bmh.hex +2 -0
  235. ultraplot-1.71.0/ultraplot/cycles/classic.hex +2 -0
  236. ultraplot-1.71.0/ultraplot/cycles/colorblind.hex +2 -0
  237. ultraplot-1.71.0/ultraplot/cycles/colorblind10.hex +2 -0
  238. ultraplot-1.71.0/ultraplot/cycles/default.hex +2 -0
  239. ultraplot-1.71.0/ultraplot/cycles/ggplot.hex +1 -0
  240. ultraplot-1.71.0/ultraplot/cycles/seaborn.hex +2 -0
  241. ultraplot-1.71.0/ultraplot/cycles/tableau.hex +2 -0
  242. ultraplot-1.71.0/ultraplot/demos.py +1197 -0
  243. ultraplot-1.71.0/ultraplot/externals/__init__.py +5 -0
  244. ultraplot-1.71.0/ultraplot/externals/hsluv.py +330 -0
  245. ultraplot-1.71.0/ultraplot/figure.py +3252 -0
  246. ultraplot-1.71.0/ultraplot/fonts/FiraMath-Bold.ttf +0 -0
  247. ultraplot-1.71.0/ultraplot/fonts/FiraMath-ExtraLight.ttf +0 -0
  248. ultraplot-1.71.0/ultraplot/fonts/FiraMath-Heavy.ttf +0 -0
  249. ultraplot-1.71.0/ultraplot/fonts/FiraMath-Light.ttf +0 -0
  250. ultraplot-1.71.0/ultraplot/fonts/FiraMath-Medium.ttf +0 -0
  251. ultraplot-1.71.0/ultraplot/fonts/FiraMath-Regular.ttf +0 -0
  252. ultraplot-1.71.0/ultraplot/fonts/FiraMath-SemiBold.ttf +0 -0
  253. ultraplot-1.71.0/ultraplot/fonts/FiraMath-UltraLight.ttf +0 -0
  254. ultraplot-1.71.0/ultraplot/fonts/FiraSans-Black.ttf +0 -0
  255. ultraplot-1.71.0/ultraplot/fonts/FiraSans-BlackItalic.ttf +0 -0
  256. ultraplot-1.71.0/ultraplot/fonts/FiraSans-Bold.ttf +0 -0
  257. ultraplot-1.71.0/ultraplot/fonts/FiraSans-BoldItalic.ttf +0 -0
  258. ultraplot-1.71.0/ultraplot/fonts/FiraSans-ExtraBold.ttf +0 -0
  259. ultraplot-1.71.0/ultraplot/fonts/FiraSans-ExtraBoldItalic.ttf +0 -0
  260. ultraplot-1.71.0/ultraplot/fonts/FiraSans-ExtraLight.ttf +0 -0
  261. ultraplot-1.71.0/ultraplot/fonts/FiraSans-ExtraLightItalic.ttf +0 -0
  262. ultraplot-1.71.0/ultraplot/fonts/FiraSans-Italic.ttf +0 -0
  263. ultraplot-1.71.0/ultraplot/fonts/FiraSans-Light.ttf +0 -0
  264. ultraplot-1.71.0/ultraplot/fonts/FiraSans-LightItalic.ttf +0 -0
  265. ultraplot-1.71.0/ultraplot/fonts/FiraSans-Medium.ttf +0 -0
  266. ultraplot-1.71.0/ultraplot/fonts/FiraSans-MediumItalic.ttf +0 -0
  267. ultraplot-1.71.0/ultraplot/fonts/FiraSans-Regular.ttf +0 -0
  268. ultraplot-1.71.0/ultraplot/fonts/FiraSans-SemiBold.ttf +0 -0
  269. ultraplot-1.71.0/ultraplot/fonts/FiraSans-SemiBoldItalic.ttf +0 -0
  270. ultraplot-1.71.0/ultraplot/fonts/LICENSE_FIRAMATH.txt +92 -0
  271. ultraplot-1.71.0/ultraplot/fonts/LICENSE_FIRASANS.txt +97 -0
  272. ultraplot-1.71.0/ultraplot/fonts/LICENSE_NOTOSANS.txt +202 -0
  273. ultraplot-1.71.0/ultraplot/fonts/LICENSE_NOTOSERIF.txt +93 -0
  274. ultraplot-1.71.0/ultraplot/fonts/LICENSE_OPENSANS.txt +202 -0
  275. ultraplot-1.71.0/ultraplot/fonts/LICENSE_ROBOTO.txt +202 -0
  276. ultraplot-1.71.0/ultraplot/fonts/LICENSE_SOURCESANS.txt +93 -0
  277. ultraplot-1.71.0/ultraplot/fonts/LICENSE_SOURCESERIF.txt +93 -0
  278. ultraplot-1.71.0/ultraplot/fonts/LICENSE_TEXGYRE.txt +29 -0
  279. ultraplot-1.71.0/ultraplot/fonts/LICENSE_UBUNTU.txt +96 -0
  280. ultraplot-1.71.0/ultraplot/fonts/NotoSans-Bold.ttf +0 -0
  281. ultraplot-1.71.0/ultraplot/fonts/NotoSans-BoldItalic.ttf +0 -0
  282. ultraplot-1.71.0/ultraplot/fonts/NotoSans-Italic.ttf +0 -0
  283. ultraplot-1.71.0/ultraplot/fonts/NotoSans-Regular.ttf +0 -0
  284. ultraplot-1.71.0/ultraplot/fonts/NotoSerif-Bold.ttf +0 -0
  285. ultraplot-1.71.0/ultraplot/fonts/NotoSerif-BoldItalic.ttf +0 -0
  286. ultraplot-1.71.0/ultraplot/fonts/NotoSerif-Italic.ttf +0 -0
  287. ultraplot-1.71.0/ultraplot/fonts/NotoSerif-Regular.ttf +0 -0
  288. ultraplot-1.71.0/ultraplot/fonts/OpenSans-Bold.ttf +0 -0
  289. ultraplot-1.71.0/ultraplot/fonts/OpenSans-BoldItalic.ttf +0 -0
  290. ultraplot-1.71.0/ultraplot/fonts/OpenSans-Italic.ttf +0 -0
  291. ultraplot-1.71.0/ultraplot/fonts/OpenSans-Regular.ttf +0 -0
  292. ultraplot-1.71.0/ultraplot/fonts/OpenSans-Semibold.ttf +0 -0
  293. ultraplot-1.71.0/ultraplot/fonts/OpenSans-SemiboldItalic.ttf +0 -0
  294. ultraplot-1.71.0/ultraplot/fonts/Roboto-Black.ttf +0 -0
  295. ultraplot-1.71.0/ultraplot/fonts/Roboto-BlackItalic.ttf +0 -0
  296. ultraplot-1.71.0/ultraplot/fonts/Roboto-Bold.ttf +0 -0
  297. ultraplot-1.71.0/ultraplot/fonts/Roboto-BoldItalic.ttf +0 -0
  298. ultraplot-1.71.0/ultraplot/fonts/Roboto-Italic.ttf +0 -0
  299. ultraplot-1.71.0/ultraplot/fonts/Roboto-Light.ttf +0 -0
  300. ultraplot-1.71.0/ultraplot/fonts/Roboto-LightItalic.ttf +0 -0
  301. ultraplot-1.71.0/ultraplot/fonts/Roboto-Medium.ttf +0 -0
  302. ultraplot-1.71.0/ultraplot/fonts/Roboto-MediumItalic.ttf +0 -0
  303. ultraplot-1.71.0/ultraplot/fonts/Roboto-Regular.ttf +0 -0
  304. ultraplot-1.71.0/ultraplot/fonts/SourceSansPro-Black.ttf +0 -0
  305. ultraplot-1.71.0/ultraplot/fonts/SourceSansPro-BlackItalic.ttf +0 -0
  306. ultraplot-1.71.0/ultraplot/fonts/SourceSansPro-Bold.ttf +0 -0
  307. ultraplot-1.71.0/ultraplot/fonts/SourceSansPro-BoldItalic.ttf +0 -0
  308. ultraplot-1.71.0/ultraplot/fonts/SourceSansPro-ExtraLight.ttf +0 -0
  309. ultraplot-1.71.0/ultraplot/fonts/SourceSansPro-ExtraLightItalic.ttf +0 -0
  310. ultraplot-1.71.0/ultraplot/fonts/SourceSansPro-Italic.ttf +0 -0
  311. ultraplot-1.71.0/ultraplot/fonts/SourceSansPro-Light.ttf +0 -0
  312. ultraplot-1.71.0/ultraplot/fonts/SourceSansPro-LightItalic.ttf +0 -0
  313. ultraplot-1.71.0/ultraplot/fonts/SourceSansPro-Regular.ttf +0 -0
  314. ultraplot-1.71.0/ultraplot/fonts/SourceSansPro-SemiBold.ttf +0 -0
  315. ultraplot-1.71.0/ultraplot/fonts/SourceSansPro-SemiBoldItalic.ttf +0 -0
  316. ultraplot-1.71.0/ultraplot/fonts/SourceSerifPro-Black.ttf +0 -0
  317. ultraplot-1.71.0/ultraplot/fonts/SourceSerifPro-BlackItalic.ttf +0 -0
  318. ultraplot-1.71.0/ultraplot/fonts/SourceSerifPro-Bold.ttf +0 -0
  319. ultraplot-1.71.0/ultraplot/fonts/SourceSerifPro-BoldItalic.ttf +0 -0
  320. ultraplot-1.71.0/ultraplot/fonts/SourceSerifPro-ExtraLight.ttf +0 -0
  321. ultraplot-1.71.0/ultraplot/fonts/SourceSerifPro-ExtraLightItalic.ttf +0 -0
  322. ultraplot-1.71.0/ultraplot/fonts/SourceSerifPro-Italic.ttf +0 -0
  323. ultraplot-1.71.0/ultraplot/fonts/SourceSerifPro-Light.ttf +0 -0
  324. ultraplot-1.71.0/ultraplot/fonts/SourceSerifPro-LightItalic.ttf +0 -0
  325. ultraplot-1.71.0/ultraplot/fonts/SourceSerifPro-Regular.ttf +0 -0
  326. ultraplot-1.71.0/ultraplot/fonts/SourceSerifPro-SemiBold.ttf +0 -0
  327. ultraplot-1.71.0/ultraplot/fonts/SourceSerifPro-SemiBoldItalic.ttf +0 -0
  328. ultraplot-1.71.0/ultraplot/fonts/Ubuntu-Bold.ttf +0 -0
  329. ultraplot-1.71.0/ultraplot/fonts/Ubuntu-BoldItalic.ttf +0 -0
  330. ultraplot-1.71.0/ultraplot/fonts/Ubuntu-Italic.ttf +0 -0
  331. ultraplot-1.71.0/ultraplot/fonts/Ubuntu-Light.ttf +0 -0
  332. ultraplot-1.71.0/ultraplot/fonts/Ubuntu-LightItalic.ttf +0 -0
  333. ultraplot-1.71.0/ultraplot/fonts/Ubuntu-Medium.ttf +0 -0
  334. ultraplot-1.71.0/ultraplot/fonts/Ubuntu-MediumItalic.ttf +0 -0
  335. ultraplot-1.71.0/ultraplot/fonts/Ubuntu-Regular.ttf +0 -0
  336. ultraplot-1.71.0/ultraplot/fonts/texgyreadventor-bold.ttf +0 -0
  337. ultraplot-1.71.0/ultraplot/fonts/texgyreadventor-bolditalic.ttf +0 -0
  338. ultraplot-1.71.0/ultraplot/fonts/texgyreadventor-italic.ttf +0 -0
  339. ultraplot-1.71.0/ultraplot/fonts/texgyreadventor-regular.ttf +0 -0
  340. ultraplot-1.71.0/ultraplot/fonts/texgyrebonum-bold.ttf +0 -0
  341. ultraplot-1.71.0/ultraplot/fonts/texgyrebonum-bolditalic.ttf +0 -0
  342. ultraplot-1.71.0/ultraplot/fonts/texgyrebonum-italic.ttf +0 -0
  343. ultraplot-1.71.0/ultraplot/fonts/texgyrebonum-regular.ttf +0 -0
  344. ultraplot-1.71.0/ultraplot/fonts/texgyrechorus-mediumitalic.ttf +0 -0
  345. ultraplot-1.71.0/ultraplot/fonts/texgyrecursor-bold.ttf +0 -0
  346. ultraplot-1.71.0/ultraplot/fonts/texgyrecursor-bolditalic.ttf +0 -0
  347. ultraplot-1.71.0/ultraplot/fonts/texgyrecursor-italic.ttf +0 -0
  348. ultraplot-1.71.0/ultraplot/fonts/texgyrecursor-regular.ttf +0 -0
  349. ultraplot-1.71.0/ultraplot/fonts/texgyreheros-bold.ttf +0 -0
  350. ultraplot-1.71.0/ultraplot/fonts/texgyreheros-bolditalic.ttf +0 -0
  351. ultraplot-1.71.0/ultraplot/fonts/texgyreheros-italic.ttf +0 -0
  352. ultraplot-1.71.0/ultraplot/fonts/texgyreheros-regular.ttf +0 -0
  353. ultraplot-1.71.0/ultraplot/fonts/texgyrepagella-bold.ttf +0 -0
  354. ultraplot-1.71.0/ultraplot/fonts/texgyrepagella-bolditalic.ttf +0 -0
  355. ultraplot-1.71.0/ultraplot/fonts/texgyrepagella-italic.ttf +0 -0
  356. ultraplot-1.71.0/ultraplot/fonts/texgyrepagella-regular.ttf +0 -0
  357. ultraplot-1.71.0/ultraplot/fonts/texgyreschola-bold.ttf +0 -0
  358. ultraplot-1.71.0/ultraplot/fonts/texgyreschola-bolditalic.ttf +0 -0
  359. ultraplot-1.71.0/ultraplot/fonts/texgyreschola-italic.ttf +0 -0
  360. ultraplot-1.71.0/ultraplot/fonts/texgyreschola-regular.ttf +0 -0
  361. ultraplot-1.71.0/ultraplot/fonts/texgyretermes-bold.ttf +0 -0
  362. ultraplot-1.71.0/ultraplot/fonts/texgyretermes-bolditalic.ttf +0 -0
  363. ultraplot-1.71.0/ultraplot/fonts/texgyretermes-italic.ttf +0 -0
  364. ultraplot-1.71.0/ultraplot/fonts/texgyretermes-regular.ttf +0 -0
  365. ultraplot-1.71.0/ultraplot/gridspec.py +1974 -0
  366. ultraplot-1.71.0/ultraplot/internals/__init__.py +460 -0
  367. ultraplot-1.71.0/ultraplot/internals/benchmarks.py +26 -0
  368. ultraplot-1.71.0/ultraplot/internals/context.py +44 -0
  369. ultraplot-1.71.0/ultraplot/internals/docstring.py +264 -0
  370. ultraplot-1.71.0/ultraplot/internals/fonts.py +82 -0
  371. ultraplot-1.71.0/ultraplot/internals/guides.py +167 -0
  372. ultraplot-1.71.0/ultraplot/internals/inputs.py +918 -0
  373. ultraplot-1.71.0/ultraplot/internals/labels.py +113 -0
  374. ultraplot-1.71.0/ultraplot/internals/rcsetup.py +2184 -0
  375. ultraplot-1.71.0/ultraplot/internals/versions.py +61 -0
  376. ultraplot-1.71.0/ultraplot/internals/warnings.py +122 -0
  377. ultraplot-1.71.0/ultraplot/legend.py +33 -0
  378. ultraplot-1.71.0/ultraplot/proj.py +325 -0
  379. ultraplot-1.71.0/ultraplot/scale.py +977 -0
  380. ultraplot-1.71.0/ultraplot/tests/__init__.py +28 -0
  381. ultraplot-1.71.0/ultraplot/tests/conftest.py +91 -0
  382. ultraplot-1.71.0/ultraplot/tests/test_1dplots.py +822 -0
  383. ultraplot-1.71.0/ultraplot/tests/test_2dplots.py +376 -0
  384. ultraplot-1.71.0/ultraplot/tests/test_axes.py +618 -0
  385. ultraplot-1.71.0/ultraplot/tests/test_base.py +121 -0
  386. ultraplot-1.71.0/ultraplot/tests/test_colorbar.py +810 -0
  387. ultraplot-1.71.0/ultraplot/tests/test_colormap.py +12 -0
  388. ultraplot-1.71.0/ultraplot/tests/test_colors.py +129 -0
  389. ultraplot-1.71.0/ultraplot/tests/test_config.py +122 -0
  390. ultraplot-1.71.0/ultraplot/tests/test_constructor.py +124 -0
  391. ultraplot-1.71.0/ultraplot/tests/test_demos.py +119 -0
  392. ultraplot-1.71.0/ultraplot/tests/test_docs.py +78 -0
  393. ultraplot-1.71.0/ultraplot/tests/test_figure.py +252 -0
  394. ultraplot-1.71.0/ultraplot/tests/test_fonts.py +303 -0
  395. ultraplot-1.71.0/ultraplot/tests/test_format.py +593 -0
  396. ultraplot-1.71.0/ultraplot/tests/test_geographic.py +1735 -0
  397. ultraplot-1.71.0/ultraplot/tests/test_gridspec.py +128 -0
  398. ultraplot-1.71.0/ultraplot/tests/test_handlers.py +35 -0
  399. ultraplot-1.71.0/ultraplot/tests/test_imports.py +148 -0
  400. ultraplot-1.71.0/ultraplot/tests/test_imshow.py +105 -0
  401. ultraplot-1.71.0/ultraplot/tests/test_inputs.py +57 -0
  402. ultraplot-1.71.0/ultraplot/tests/test_inset.py +29 -0
  403. ultraplot-1.71.0/ultraplot/tests/test_integration.py +229 -0
  404. ultraplot-1.71.0/ultraplot/tests/test_legend.py +746 -0
  405. ultraplot-1.71.0/ultraplot/tests/test_plot.py +757 -0
  406. ultraplot-1.71.0/ultraplot/tests/test_projections.py +183 -0
  407. ultraplot-1.71.0/ultraplot/tests/test_statistical_plotting.py +464 -0
  408. ultraplot-1.71.0/ultraplot/tests/test_subplots.py +917 -0
  409. ultraplot-1.71.0/ultraplot/tests/test_tickers.py +817 -0
  410. ultraplot-1.71.0/ultraplot/ticker.py +1514 -0
  411. ultraplot-1.71.0/ultraplot/ui.py +239 -0
  412. ultraplot-1.71.0/ultraplot/utils.py +1167 -0
  413. ultraplot-1.71.0/ultraplot.egg-info/PKG-INFO +194 -0
  414. ultraplot-1.71.0/ultraplot.egg-info/SOURCES.txt +415 -0
  415. ultraplot-1.71.0/ultraplot.egg-info/dependency_links.txt +1 -0
  416. ultraplot-1.71.0/ultraplot.egg-info/requires.txt +5 -0
  417. ultraplot-1.71.0/ultraplot.egg-info/top_level.txt +2 -0
@@ -0,0 +1,31 @@
1
+ <!-- Thanks for helping us make ultraplot a better package! If this is a bug report, please use the template provided below. If this is a feature request, you can delete the template text (just try to be descriptive with your request). -->
2
+
3
+ ### Description
4
+
5
+ [Description of the bug or feature.]
6
+
7
+ ### Steps to reproduce
8
+
9
+ A "[Minimal, Complete and Verifiable Example](http://matthewrocklin.com/blog/work/2018/02/28/minimal-bug-reports)" will make it much easier for maintainers to help you.
10
+
11
+ ```python
12
+ # your code here
13
+ # we should be able to copy-paste this into python and exactly reproduce your bug
14
+ ```
15
+
16
+ **Expected behavior**: [What you expected to happen]
17
+
18
+ **Actual behavior**: [What actually happened]
19
+
20
+ ### Equivalent steps in matplotlib
21
+
22
+ Please try to make sure this bug is related to a ultra-specific feature. If you're not sure, try to replicate it with the [native matplotlib API](https://matplotlib.org/3.1.1/api/index.html). Matplotlib bugs belong on the [matplotlib github page](https://github.com/matplotlib/matplotlib).
23
+
24
+ ```python
25
+ # your code here, if applicable
26
+ import matplotlib.pyplot as plt
27
+ ```
28
+
29
+ ### Ultra version
30
+
31
+ Paste the results of `import matplotlib; print(matplotlib.__version__); import ultra; print(ultra.version)` here.
@@ -0,0 +1,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "github-actions"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "monthly"
7
+ groups:
8
+ github-actions:
9
+ patterns:
10
+ - '*'
@@ -0,0 +1,130 @@
1
+ name: Build and Test
2
+ on:
3
+ workflow_call:
4
+ inputs:
5
+ python-version:
6
+ required: true
7
+ type: string
8
+ matplotlib-version:
9
+ required: true
10
+ type: string
11
+
12
+ env:
13
+ LC_ALL: en_US.UTF-8
14
+ LANG: en_US.UTF-8
15
+
16
+ jobs:
17
+ build-ultraplot:
18
+ name: Test Python ${{ inputs.python-version }} with MPL ${{ inputs.matplotlib-version }}
19
+ runs-on: ubuntu-latest
20
+ timeout-minutes: 60
21
+ defaults:
22
+ run:
23
+ shell: bash -el {0}
24
+ steps:
25
+ - uses: actions/checkout@v6
26
+ with:
27
+ fetch-depth: 0
28
+
29
+ - uses: mamba-org/setup-micromamba@v2.0.7
30
+ with:
31
+ environment-file: ./environment.yml
32
+ init-shell: bash
33
+ create-args: >-
34
+ --verbose
35
+ python=${{ inputs.python-version }}
36
+ matplotlib=${{ inputs.matplotlib-version }}
37
+ cache-environment: true
38
+ cache-downloads: false
39
+
40
+ - name: Build Ultraplot
41
+ run: |
42
+ pip install --no-build-isolation --no-deps .
43
+
44
+ - name: Test Ultraplot
45
+ run: |
46
+ pytest -n auto --cov=ultraplot --cov-branch --cov-report term-missing --cov-report=xml ultraplot
47
+
48
+ - name: Upload coverage reports to Codecov
49
+ uses: codecov/codecov-action@v5
50
+ with:
51
+ token: ${{ secrets.CODECOV_TOKEN }}
52
+ slug: Ultraplot/ultraplot
53
+
54
+ compare-baseline:
55
+ name: Compare baseline Python ${{ inputs.python-version }} with MPL ${{ inputs.matplotlib-version }}
56
+ runs-on: ubuntu-latest
57
+ defaults:
58
+ run:
59
+ shell: bash -el {0}
60
+ steps:
61
+ - uses: actions/checkout@v6
62
+
63
+ - uses: mamba-org/setup-micromamba@v2.0.7
64
+ with:
65
+ environment-file: ./environment.yml
66
+ init-shell: bash
67
+ create-args: >-
68
+ --verbose
69
+ python=${{ inputs.python-version }}
70
+ matplotlib=${{ inputs.matplotlib-version }}
71
+ cache-environment: true
72
+ cache-downloads: false
73
+
74
+ # Cache Baseline Figures (Restore step)
75
+ - name: Cache Baseline Figures
76
+ id: cache-baseline
77
+ uses: actions/cache@v4
78
+ with:
79
+ path: ./ultraplot/tests/baseline # The directory to cache
80
+ # Key is based on OS, Python/Matplotlib versions, and the PR number
81
+ key: ${{ runner.os }}-baseline-pr-${{ github.event.pull_request.number }}-${{ inputs.python-version }}-${{ inputs.matplotlib-version }}
82
+ restore-keys: |
83
+ ${{ runner.os }}-baseline-pr-${{ github.event.pull_request.number }}-${{ inputs.python-version }}-${{ inputs.matplotlib-version }}-
84
+
85
+ # Conditional Baseline Generation (Only runs on cache miss)
86
+ - name: Generate baseline from main
87
+ # Skip this step if the cache was found (cache-hit is true)
88
+ if: steps.cache-baseline.outputs.cache-hit != 'true'
89
+ run: |
90
+ mkdir -p ultraplot/tests/baseline
91
+ # Checkout the base branch (e.g., 'main') to generate the official baseline
92
+ git fetch origin ${{ github.event.pull_request.base.sha }}
93
+ git checkout ${{ github.event.pull_request.base.sha }}
94
+
95
+ # Install the Ultraplot version from the base branch's code
96
+ pip install --no-build-isolation --no-deps .
97
+
98
+ # Generate the baseline images and hash library
99
+ python -c "import ultraplot as plt; plt.config.Configurator()._save_yaml('ultraplot.yml')"
100
+ pytest -x -W ignore \
101
+ --mpl-generate-path=./ultraplot/tests/baseline/ \
102
+ --mpl-default-style="./ultraplot.yml"\
103
+ ultraplot/tests
104
+
105
+ # Return to the PR branch for the rest of the job
106
+ git checkout ${{ github.sha }}
107
+
108
+ # Image Comparison (Uses cached or newly generated baseline)
109
+ - name: Image Comparison Ultraplot
110
+ run: |
111
+ # Re-install the Ultraplot version from the current PR branch
112
+ pip install --no-build-isolation --no-deps .
113
+
114
+ mkdir -p results
115
+ python -c "import ultraplot as plt; plt.config.Configurator()._save_yaml('ultraplot.yml')"
116
+ pytest -x -W ignore \
117
+ --mpl \
118
+ --mpl-baseline-path=./ultraplot/tests/baseline \
119
+ --mpl-results-path=./results/ \
120
+ --mpl-generate-summary=html \
121
+ --mpl-default-style="./ultraplot.yml" \
122
+ ultraplot/tests
123
+
124
+ # Return the html output of the comparison even if failed
125
+ - name: Upload comparison failures
126
+ if: always()
127
+ uses: actions/upload-artifact@v6
128
+ with:
129
+ name: failed-comparisons-${{ inputs.python-version }}-${{ inputs.matplotlib-version }}-${{ github.sha }}
130
+ path: results/*
@@ -0,0 +1,155 @@
1
+ name: Matrix Test
2
+ on:
3
+ push:
4
+ branches: [main, devel]
5
+ pull_request:
6
+ branches: [main, devel]
7
+
8
+ jobs:
9
+ run-if-changes:
10
+ runs-on: ubuntu-latest
11
+ outputs:
12
+ run: ${{ (github.event_name == 'push' && github.ref_name == 'main') && 'true' || steps.filter.outputs.python }}
13
+ steps:
14
+ - uses: actions/checkout@v6
15
+ - uses: dorny/paths-filter@v3
16
+ id: filter
17
+ with:
18
+ filters: |
19
+ python:
20
+ - 'ultraplot/**'
21
+
22
+ get-versions:
23
+ runs-on: ubuntu-latest
24
+ needs:
25
+ - run-if-changes
26
+ if: always() && needs.run-if-changes.outputs.run == 'true'
27
+ outputs:
28
+ python-versions: ${{ steps.set-versions.outputs.python-versions }}
29
+ matplotlib-versions: ${{ steps.set-versions.outputs.matplotlib-versions }}
30
+ steps:
31
+ - uses: actions/checkout@v6
32
+ with:
33
+ fetch-depth: 0
34
+
35
+ - uses: actions/setup-python@v6
36
+ with:
37
+ python-version: "3.11"
38
+
39
+ - name: Install dependencies
40
+ run: pip install tomli
41
+
42
+ - id: set-versions
43
+ run: |
44
+ # Create a Python script to read and parse versions
45
+ cat > get_versions.py << 'EOF'
46
+ import tomli
47
+ import re
48
+ import json
49
+
50
+ # Read pyproject.toml
51
+ with open("pyproject.toml", "rb") as f:
52
+ data = tomli.load(f)
53
+
54
+ # Get Python version requirement
55
+ python_req = data["project"]["requires-python"]
56
+
57
+ # Parse min and max versions
58
+ min_version = re.search(r">=(\d+\.\d+)", python_req)
59
+ max_version = re.search(r"<(\d+\.\d+)", python_req)
60
+
61
+ python_versions = []
62
+ if min_version and max_version:
63
+ # Convert version strings to tuples
64
+ min_v = tuple(map(int, min_version.group(1).split(".")))
65
+ max_v = tuple(map(int, max_version.group(1).split(".")))
66
+
67
+ # Generate version list
68
+ current = min_v
69
+ while current < max_v:
70
+ python_versions.append(".".join(map(str, current)))
71
+ current = (current[0], current[1] + 1)
72
+
73
+
74
+ # parse MPL versions
75
+ mpl_req = None
76
+ for d in data["project"]["dependencies"]:
77
+ if d.startswith("matplotlib"):
78
+ mpl_req = d
79
+ break
80
+ assert mpl_req is not None, "matplotlib version not found in dependencies"
81
+ min_version = re.search(r">=(\d+\.\d+)", mpl_req)
82
+ max_version = re.search(r"<(\d+\.\d+)", mpl_req)
83
+
84
+ mpl_versions = []
85
+ if min_version and max_version:
86
+ # Convert version strings to tuples
87
+ min_v = tuple(map(int, min_version.group(1).split(".")))
88
+ max_v = tuple(map(int, max_version.group(1).split(".")))
89
+
90
+ # Generate version list
91
+ current = min_v
92
+ while current < max_v:
93
+ mpl_versions.append(".".join(map(str, current)))
94
+ current = (current[0], current[1] + 1)
95
+
96
+ # If no versions found, default to 3.9
97
+ if not mpl_versions:
98
+ mpl_versions = ["3.9"]
99
+
100
+ # Create output dictionary
101
+ output = {
102
+ "python_versions": python_versions,
103
+ "matplotlib_versions": mpl_versions
104
+ }
105
+
106
+ # Print as JSON
107
+ print(json.dumps(output))
108
+ EOF
109
+
110
+ # Run the script and capture output
111
+ OUTPUT=$(python3 get_versions.py)
112
+ PYTHON_VERSIONS=$(echo $OUTPUT | jq -r '.python_versions')
113
+ MPL_VERSIONS=$(echo $OUTPUT | jq -r '.matplotlib_versions')
114
+
115
+ echo "Detected Python versions: ${PYTHON_VERSIONS}"
116
+ echo "Detected Matplotlib versions: ${MPL_VERSIONS}"
117
+ echo "python-versions=$(echo $PYTHON_VERSIONS | jq -c)" >> $GITHUB_OUTPUT
118
+ echo "matplotlib-versions=$(echo $MPL_VERSIONS | jq -c)" >> $GITHUB_OUTPUT
119
+
120
+ build:
121
+ needs:
122
+ - get-versions
123
+ - run-if-changes
124
+ if: always() && needs.run-if-changes.outputs.run == 'true' && needs.get-versions.result == 'success'
125
+ strategy:
126
+ matrix:
127
+ python-version: ${{ fromJson(needs.get-versions.outputs.python-versions) }}
128
+ matplotlib-version: ${{ fromJson(needs.get-versions.outputs.matplotlib-versions) }}
129
+ fail-fast: false
130
+ uses: ./.github/workflows/build-ultraplot.yml
131
+ concurrency:
132
+ group: ${{ github.workflow }}-${{ github.ref }}-${{ matrix.python-version }}-${{ matrix.matplotlib-version }}
133
+ cancel-in-progress: true
134
+ with:
135
+ python-version: ${{ matrix.python-version }}
136
+ matplotlib-version: ${{ matrix.matplotlib-version }}
137
+
138
+ build-success:
139
+ needs:
140
+ - build
141
+ - run-if-changes
142
+ if: always()
143
+ runs-on: ubuntu-latest
144
+ steps:
145
+ - run: |
146
+ if [[ '${{ needs.run-if-changes.outputs.run }}' == 'false' ]]; then
147
+ echo "No changes detected, tests skipped."
148
+ else
149
+ if [[ '${{ needs.build.result }}' == 'success' ]]; then
150
+ echo "All tests passed successfully!"
151
+ else
152
+ echo "Tests failed!"
153
+ exit 1
154
+ fi
155
+ fi
@@ -0,0 +1,121 @@
1
+ name: Publish to PyPI
2
+ on:
3
+ pull_request:
4
+ release:
5
+ types: [published]
6
+ push:
7
+ tags: ["v*"]
8
+
9
+ concurrency:
10
+ group: publish-pypi-{{ github.sha }}
11
+ cancel-in-progress: false
12
+
13
+ jobs:
14
+ build-packages:
15
+ name: Build packages
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@v6
19
+ with:
20
+ fetch-depth: 0
21
+
22
+ - name: Get tags
23
+ run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*
24
+ shell: bash
25
+
26
+ - uses: actions/setup-python@v6
27
+ with:
28
+ python-version: "3.12"
29
+
30
+ - name: Build package
31
+ run: |
32
+ python -m pip install --upgrade pip wheel setuptools setuptools_scm build twine
33
+ python -m build --sdist --wheel . --outdir dist
34
+
35
+ - name: Check files
36
+ run: |
37
+ ls dist
38
+ shell: bash
39
+
40
+ - name: Test wheels
41
+ run: |
42
+ pushd dist
43
+ python -m pip install ultraplot*.whl
44
+
45
+ version=$(python -c "import ultraplot; print(ultraplot.__version__)")
46
+ echo "Version: $version"
47
+ if [[ "$version" == "0."* ]]; then
48
+ echo "Version is not set correctly!"
49
+ exit 1
50
+ fi
51
+
52
+ python -m twine check *
53
+ popd
54
+ shell: bash
55
+
56
+ - name: Upload artifacts
57
+ uses: actions/upload-artifact@v6
58
+ with:
59
+ name: dist-${{ github.sha }}-${{ github.run_id }}-${{ github.run_number }}
60
+ path: dist/*
61
+ if-no-files-found: error
62
+
63
+ publish-pypi-test:
64
+ name: Publish to TestPyPI
65
+ needs: build-packages
66
+ if: github.event_name != 'pull_request'
67
+ environment:
68
+ name: test
69
+ url: https://test.pypi.org/project/ultraplot/
70
+ runs-on: ubuntu-latest
71
+ permissions:
72
+ id-token: write
73
+ contents: read
74
+ steps:
75
+ - name: Download artifacts
76
+ uses: actions/download-artifact@v7
77
+ with:
78
+ name: dist-${{ github.sha }}-${{ github.run_id }}-${{ github.run_number }}
79
+ path: dist
80
+
81
+ - name: Check files
82
+ run: |
83
+ ls dist
84
+ shell: bash
85
+
86
+ - name: Publish to TestPyPI
87
+ uses: pypa/gh-action-pypi-publish@release/v1
88
+ with:
89
+ repository-url: https://test.pypi.org/legacy/
90
+ verbose: true
91
+ # releases generate both release and tag events so
92
+ # we get a race condition if we don't skip existing
93
+ skip-existing: ${{ (github.event_name == 'release' || github.event_name == 'push') && 'true' || 'false' }}
94
+
95
+ publish-pypi:
96
+ name: Publish to PyPI
97
+ needs: publish-pypi-test
98
+ environment:
99
+ name: prod
100
+ url: https://pypi.org/project/ultraplot/
101
+ runs-on: ubuntu-latest
102
+ if: github.event_name == 'release'
103
+ permissions:
104
+ id-token: write
105
+ contents: read
106
+ steps:
107
+ - name: Download artifacts
108
+ uses: actions/download-artifact@v7
109
+ with:
110
+ name: dist-${{ github.sha }}-${{ github.run_id }}-${{ github.run_number }}
111
+ path: dist
112
+
113
+ - name: Check files
114
+ run: |
115
+ ls dist
116
+ shell: bash
117
+
118
+ - name: Publish to PyPI
119
+ uses: pypa/gh-action-pypi-publish@release/v1
120
+ with:
121
+ verbose: true
@@ -0,0 +1,50 @@
1
+ # VIM extras
2
+ .session.vim
3
+ .vimsession
4
+ .*.sw[a-z]
5
+
6
+ # Pytest-mpl test directory ignore
7
+ baseline
8
+ baseline/*
9
+ results
10
+ results/*
11
+ ultraplot.yml
12
+
13
+ # PyPi stuff
14
+ build
15
+ dist
16
+ .eggs
17
+ *.egg-info
18
+
19
+ # Local docs builds
20
+ docs/api
21
+ docs/_build
22
+ docs/_static/ultraplotrc
23
+ docs/_static/rctable.rst
24
+ docs/_static/*
25
+
26
+ # Development subfolders
27
+ dev
28
+ sources
29
+
30
+ # Python extras
31
+ .ipynb_checkpoints
32
+ *.log
33
+ *.pyc
34
+ .*.pyc
35
+ __pycache__
36
+ test.py
37
+
38
+ # OS files
39
+ .DS_Store
40
+ .DS_Store?
41
+ ._*
42
+ .Trashes
43
+
44
+ # Old files
45
+ tmp
46
+ trash
47
+ garbage
48
+
49
+ # version file
50
+ ultraplot/_version.py
@@ -0,0 +1,16 @@
1
+ ci:
2
+ autofix_commit_msg: |
3
+ [pre-commit.ci] auto fixes from pre-commit.com hooks
4
+
5
+ for more information, see https://pre-commit.ci
6
+ autofix_prs: false
7
+ autoupdate_commit_msg: '[pre-commit.ci] pre-commit autoupdate'
8
+ autoupdate_schedule: monthly
9
+ skip: []
10
+ submodules: false
11
+
12
+ repos:
13
+ - repo: https://github.com/psf/black-pre-commit-mirror
14
+ rev: 25.12.0
15
+ hooks:
16
+ - id: black
@@ -0,0 +1,24 @@
1
+ # .readthedocs.yml
2
+ # Read the Docs configuration file
3
+ version: 2
4
+
5
+ # Set the OS and build tools
6
+ build:
7
+ os: ubuntu-22.04
8
+ tools:
9
+ python: "mambaforge-latest"
10
+
11
+ # Conda settings
12
+ conda:
13
+ environment: ./environment.yml
14
+
15
+ # Sphinx settings
16
+ sphinx:
17
+ configuration: ./docs/conf.py
18
+ builder: html
19
+
20
+ # Python settings
21
+ python:
22
+ install:
23
+ - method: pip
24
+ path: .
@@ -0,0 +1,39 @@
1
+ {
2
+ "title": "UltraPlot: A succinct wrapper for Matplotlib",
3
+ "upload_type": "software",
4
+ "description": "UltraPlot provides a compact and extensible API on top of Matplotlib, inspired by ProPlot. It simplifies the creation of scientific plots with consistent layout, colorbars, and shared axes.",
5
+ "creators": [
6
+ {
7
+ "name": "van Elteren, Casper",
8
+ "orcid": "0000-0001-9862-8936",
9
+ "affiliation": "University of Amsterdam, Polder Center, Institute for Advanced Study Amsterdam"
10
+ },
11
+ {
12
+ "name": "Becker, Matthew R.",
13
+ "orcid": "0000-0001-7774-2246",
14
+ "affiliation": "Argonne National Laboratory, Lemont, IL USA"
15
+ }
16
+ ],
17
+ "license": "MIT",
18
+ "keywords": [
19
+ "matplotlib",
20
+ "scientific visualization",
21
+ "plotting",
22
+ "wrapper",
23
+ "python"
24
+ ],
25
+ "related_identifiers": [
26
+ {
27
+ "relation": "isDerivedFrom",
28
+ "identifier": "https://github.com/lukelbd/proplot",
29
+ "scheme": "url"
30
+ },
31
+ {
32
+ "relation": "isDerivedFrom",
33
+ "identifier": "https://matplotlib.org/",
34
+ "scheme": "url"
35
+ }
36
+ ],
37
+ "version": "1.57",
38
+ "publication_date": "2025-01-01" // need to fix
39
+ }
@@ -0,0 +1,33 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use UltraPlot in your work, please cite it using the following metadata."
3
+ title: "UltraPlot"
4
+ authors:
5
+ - family-names: "van Elteren"
6
+ given-names: "Casper"
7
+ orcid: "https://orcid.org/0000-0001-9862-8936"
8
+ - family-names: "Becker"
9
+ given-names: "Matthew R."
10
+ orcid: "https://orcid.org/0000-0001-7774-2246"
11
+ date-released: "2025-01-01"
12
+ version: "1.57"
13
+ doi: "10.5281/zenodo.15733580"
14
+ repository-code: "https://github.com/Ultraplot/UltraPlot"
15
+ license: "MIT"
16
+ keywords:
17
+ - plotting
18
+ - matplotlib
19
+ - scientific visualization
20
+ - wrapper
21
+ references:
22
+ - type: software
23
+ name: "ProPlot"
24
+ authors:
25
+ - family-names: "Davis"
26
+ given-names: "Luke"
27
+ url: "https://github.com/lukelbd/proplot"
28
+ - type: software
29
+ name: "Matplotlib"
30
+ authors:
31
+ - family-names: "Hunter"
32
+ given-names: "John D."
33
+ url: "https://matplotlib.org/"