ultraplot 0.99.3__py3-none-any.whl

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 (416) hide show
  1. ultraplot/__init__.py +115 -0
  2. ultraplot/__init__.py.rej +58 -0
  3. ultraplot/axes/__init__.py +42 -0
  4. ultraplot/axes/base.py +3240 -0
  5. ultraplot/axes/cartesian.py +1425 -0
  6. ultraplot/axes/geo.py +1675 -0
  7. ultraplot/axes/plot.py +4569 -0
  8. ultraplot/axes/polar.py +381 -0
  9. ultraplot/axes/shared.py +186 -0
  10. ultraplot/axes/three.py +34 -0
  11. ultraplot/cmaps/Algae.rgb +256 -0
  12. ultraplot/cmaps/Amp.rgb +256 -0
  13. ultraplot/cmaps/BR.rgb +256 -0
  14. ultraplot/cmaps/Balance.rgb +256 -0
  15. ultraplot/cmaps/Blues1_r.xml +17 -0
  16. ultraplot/cmaps/Blues2.xml +16 -0
  17. ultraplot/cmaps/Blues3.xml +25 -0
  18. ultraplot/cmaps/Blues4_r.xml +17 -0
  19. ultraplot/cmaps/Blues5.xml +16 -0
  20. ultraplot/cmaps/Blues6.xml +25 -0
  21. ultraplot/cmaps/Blues7.xml +16 -0
  22. ultraplot/cmaps/Blues8.xml +17 -0
  23. ultraplot/cmaps/Blues9.xml +1 -0
  24. ultraplot/cmaps/Boreal.json +53 -0
  25. ultraplot/cmaps/Browns1.xml +16 -0
  26. ultraplot/cmaps/Browns2.xml +26 -0
  27. ultraplot/cmaps/Browns3.xml +17 -0
  28. ultraplot/cmaps/Browns4.xml +17 -0
  29. ultraplot/cmaps/Browns5.xml +26 -0
  30. ultraplot/cmaps/Browns6.xml +17 -0
  31. ultraplot/cmaps/Browns7.xml +19 -0
  32. ultraplot/cmaps/Browns8.xml +11 -0
  33. ultraplot/cmaps/Browns9.xml +1 -0
  34. ultraplot/cmaps/ColdHot.rgb +229 -0
  35. ultraplot/cmaps/Crest.rgb +256 -0
  36. ultraplot/cmaps/Curl.rgb +512 -0
  37. ultraplot/cmaps/Deep.rgb +256 -0
  38. ultraplot/cmaps/Delta.rgb +512 -0
  39. ultraplot/cmaps/Dense.rgb +256 -0
  40. ultraplot/cmaps/Div.json +71 -0
  41. ultraplot/cmaps/DryWet.json +73 -0
  42. ultraplot/cmaps/Dusk.json +53 -0
  43. ultraplot/cmaps/Fire.json +53 -0
  44. ultraplot/cmaps/Flare.rgb +256 -0
  45. ultraplot/cmaps/Glacial.json +53 -0
  46. ultraplot/cmaps/Greens1_r.xml +26 -0
  47. ultraplot/cmaps/Greens2.xml +28 -0
  48. ultraplot/cmaps/Greens3_r.xml +28 -0
  49. ultraplot/cmaps/Greens4.xml +17 -0
  50. ultraplot/cmaps/Greens5.xml +16 -0
  51. ultraplot/cmaps/Greens6_r.xml +16 -0
  52. ultraplot/cmaps/Greens7.xml +16 -0
  53. ultraplot/cmaps/Greens8.xml +26 -0
  54. ultraplot/cmaps/Haline.rgb +256 -0
  55. ultraplot/cmaps/Ice.rgb +256 -0
  56. ultraplot/cmaps/IceFire.rgb +256 -0
  57. ultraplot/cmaps/Mako.rgb +256 -0
  58. ultraplot/cmaps/Marine.json +53 -0
  59. ultraplot/cmaps/Matter.rgb +256 -0
  60. ultraplot/cmaps/Mono.txt +256 -0
  61. ultraplot/cmaps/MonoCycle.txt +256 -0
  62. ultraplot/cmaps/NegPos.json +71 -0
  63. ultraplot/cmaps/Oranges1.xml +27 -0
  64. ultraplot/cmaps/Oranges2.xml +26 -0
  65. ultraplot/cmaps/Oranges3.xml +15 -0
  66. ultraplot/cmaps/Oranges4.xml +23 -0
  67. ultraplot/cmaps/Oxy.rgb +256 -0
  68. ultraplot/cmaps/Phase.rgb +256 -0
  69. ultraplot/cmaps/Purples1_r.xml +16 -0
  70. ultraplot/cmaps/Purples2.xml +17 -0
  71. ultraplot/cmaps/Purples3.xml +18 -0
  72. ultraplot/cmaps/Reds1.xml +26 -0
  73. ultraplot/cmaps/Reds2.xml +22 -0
  74. ultraplot/cmaps/Reds3.xml +23 -0
  75. ultraplot/cmaps/Reds4.xml +26 -0
  76. ultraplot/cmaps/Reds5.xml +17 -0
  77. ultraplot/cmaps/Rocket.rgb +256 -0
  78. ultraplot/cmaps/Solar.rgb +256 -0
  79. ultraplot/cmaps/Speed.rgb +256 -0
  80. ultraplot/cmaps/Stellar.json +53 -0
  81. ultraplot/cmaps/Sunrise.json +53 -0
  82. ultraplot/cmaps/Sunset.json +53 -0
  83. ultraplot/cmaps/Tempo.rgb +256 -0
  84. ultraplot/cmaps/Thermal.rgb +256 -0
  85. ultraplot/cmaps/Turbid.rgb +256 -0
  86. ultraplot/cmaps/Vivid.xml +11 -0
  87. ultraplot/cmaps/Vlag.rgb +256 -0
  88. ultraplot/cmaps/Yellows1.xml +17 -0
  89. ultraplot/cmaps/Yellows2.xml +17 -0
  90. ultraplot/cmaps/Yellows3.xml +17 -0
  91. ultraplot/cmaps/Yellows4.xml +17 -0
  92. ultraplot/cmaps/acton.txt +256 -0
  93. ultraplot/cmaps/bam.txt +256 -0
  94. ultraplot/cmaps/bamO.txt +256 -0
  95. ultraplot/cmaps/bamako.txt +256 -0
  96. ultraplot/cmaps/batlow.txt +256 -0
  97. ultraplot/cmaps/batlowK.txt +256 -0
  98. ultraplot/cmaps/batlowW.txt +256 -0
  99. ultraplot/cmaps/berlin.txt +256 -0
  100. ultraplot/cmaps/bilbao.txt +256 -0
  101. ultraplot/cmaps/broc.txt +256 -0
  102. ultraplot/cmaps/brocO.txt +256 -0
  103. ultraplot/cmaps/buda.txt +256 -0
  104. ultraplot/cmaps/bukavu.txt +256 -0
  105. ultraplot/cmaps/cork.txt +256 -0
  106. ultraplot/cmaps/corkO.txt +256 -0
  107. ultraplot/cmaps/davos.txt +256 -0
  108. ultraplot/cmaps/devon.txt +256 -0
  109. ultraplot/cmaps/fes.txt +256 -0
  110. ultraplot/cmaps/hawaii.txt +256 -0
  111. ultraplot/cmaps/imola.txt +256 -0
  112. ultraplot/cmaps/lajolla.txt +256 -0
  113. ultraplot/cmaps/lapaz.txt +256 -0
  114. ultraplot/cmaps/lisbon.txt +256 -0
  115. ultraplot/cmaps/nuuk.txt +256 -0
  116. ultraplot/cmaps/oleron.txt +256 -0
  117. ultraplot/cmaps/oslo.txt +256 -0
  118. ultraplot/cmaps/roma.txt +256 -0
  119. ultraplot/cmaps/romaO.txt +256 -0
  120. ultraplot/cmaps/tofino.txt +256 -0
  121. ultraplot/cmaps/tokyo.txt +256 -0
  122. ultraplot/cmaps/turku.txt +256 -0
  123. ultraplot/cmaps/vanimo.txt +256 -0
  124. ultraplot/cmaps/vik.txt +256 -0
  125. ultraplot/cmaps/vikO.txt +256 -0
  126. ultraplot/colors/opencolor.txt +132 -0
  127. ultraplot/colors/xkcd.txt +951 -0
  128. ultraplot/colors.py +3241 -0
  129. ultraplot/colors.py.rej +243 -0
  130. ultraplot/config.py +1809 -0
  131. ultraplot/constructor.py +1633 -0
  132. ultraplot/cycles/538.hex +2 -0
  133. ultraplot/cycles/FlatUI.hex +1 -0
  134. ultraplot/cycles/Qual1.rgb +7 -0
  135. ultraplot/cycles/Qual2.rgb +13 -0
  136. ultraplot/cycles/bmh.hex +2 -0
  137. ultraplot/cycles/classic.hex +2 -0
  138. ultraplot/cycles/colorblind.hex +2 -0
  139. ultraplot/cycles/colorblind10.hex +2 -0
  140. ultraplot/cycles/default.hex +2 -0
  141. ultraplot/cycles/ggplot.hex +1 -0
  142. ultraplot/cycles/seaborn.hex +2 -0
  143. ultraplot/cycles/tableau.hex +2 -0
  144. ultraplot/demos.py +1201 -0
  145. ultraplot/externals/__init__.py +5 -0
  146. ultraplot/externals/hsluv.py +330 -0
  147. ultraplot/figure.py +2102 -0
  148. ultraplot/fonts/FiraMath-Bold.ttf +0 -0
  149. ultraplot/fonts/FiraMath-ExtraLight.ttf +0 -0
  150. ultraplot/fonts/FiraMath-Heavy.ttf +0 -0
  151. ultraplot/fonts/FiraMath-Light.ttf +0 -0
  152. ultraplot/fonts/FiraMath-Medium.ttf +0 -0
  153. ultraplot/fonts/FiraMath-Regular.ttf +0 -0
  154. ultraplot/fonts/FiraMath-SemiBold.ttf +0 -0
  155. ultraplot/fonts/FiraMath-UltraLight.ttf +0 -0
  156. ultraplot/fonts/FiraSans-Black.ttf +0 -0
  157. ultraplot/fonts/FiraSans-BlackItalic.ttf +0 -0
  158. ultraplot/fonts/FiraSans-Bold.ttf +0 -0
  159. ultraplot/fonts/FiraSans-BoldItalic.ttf +0 -0
  160. ultraplot/fonts/FiraSans-ExtraBold.ttf +0 -0
  161. ultraplot/fonts/FiraSans-ExtraBoldItalic.ttf +0 -0
  162. ultraplot/fonts/FiraSans-ExtraLight.ttf +0 -0
  163. ultraplot/fonts/FiraSans-ExtraLightItalic.ttf +0 -0
  164. ultraplot/fonts/FiraSans-Italic.ttf +0 -0
  165. ultraplot/fonts/FiraSans-Light.ttf +0 -0
  166. ultraplot/fonts/FiraSans-LightItalic.ttf +0 -0
  167. ultraplot/fonts/FiraSans-Medium.ttf +0 -0
  168. ultraplot/fonts/FiraSans-MediumItalic.ttf +0 -0
  169. ultraplot/fonts/FiraSans-Regular.ttf +0 -0
  170. ultraplot/fonts/FiraSans-SemiBold.ttf +0 -0
  171. ultraplot/fonts/FiraSans-SemiBoldItalic.ttf +0 -0
  172. ultraplot/fonts/LICENSE_FIRAMATH.txt +92 -0
  173. ultraplot/fonts/LICENSE_FIRASANS.txt +97 -0
  174. ultraplot/fonts/LICENSE_NOTOSANS.txt +202 -0
  175. ultraplot/fonts/LICENSE_NOTOSERIF.txt +93 -0
  176. ultraplot/fonts/LICENSE_OPENSANS.txt +202 -0
  177. ultraplot/fonts/LICENSE_ROBOTO.txt +202 -0
  178. ultraplot/fonts/LICENSE_SOURCESANS.txt +93 -0
  179. ultraplot/fonts/LICENSE_SOURCESERIF.txt +93 -0
  180. ultraplot/fonts/LICENSE_TEXGYRE.txt +29 -0
  181. ultraplot/fonts/LICENSE_UBUNTU.txt +96 -0
  182. ultraplot/fonts/NotoSans-Bold.ttf +0 -0
  183. ultraplot/fonts/NotoSans-BoldItalic.ttf +0 -0
  184. ultraplot/fonts/NotoSans-Italic.ttf +0 -0
  185. ultraplot/fonts/NotoSans-Regular.ttf +0 -0
  186. ultraplot/fonts/NotoSerif-Bold.ttf +0 -0
  187. ultraplot/fonts/NotoSerif-BoldItalic.ttf +0 -0
  188. ultraplot/fonts/NotoSerif-Italic.ttf +0 -0
  189. ultraplot/fonts/NotoSerif-Regular.ttf +0 -0
  190. ultraplot/fonts/OpenSans-Bold.ttf +0 -0
  191. ultraplot/fonts/OpenSans-BoldItalic.ttf +0 -0
  192. ultraplot/fonts/OpenSans-Italic.ttf +0 -0
  193. ultraplot/fonts/OpenSans-Regular.ttf +0 -0
  194. ultraplot/fonts/OpenSans-Semibold.ttf +0 -0
  195. ultraplot/fonts/OpenSans-SemiboldItalic.ttf +0 -0
  196. ultraplot/fonts/Roboto-Black.ttf +0 -0
  197. ultraplot/fonts/Roboto-BlackItalic.ttf +0 -0
  198. ultraplot/fonts/Roboto-Bold.ttf +0 -0
  199. ultraplot/fonts/Roboto-BoldItalic.ttf +0 -0
  200. ultraplot/fonts/Roboto-Italic.ttf +0 -0
  201. ultraplot/fonts/Roboto-Light.ttf +0 -0
  202. ultraplot/fonts/Roboto-LightItalic.ttf +0 -0
  203. ultraplot/fonts/Roboto-Medium.ttf +0 -0
  204. ultraplot/fonts/Roboto-MediumItalic.ttf +0 -0
  205. ultraplot/fonts/Roboto-Regular.ttf +0 -0
  206. ultraplot/fonts/SourceSansPro-Black.ttf +0 -0
  207. ultraplot/fonts/SourceSansPro-BlackItalic.ttf +0 -0
  208. ultraplot/fonts/SourceSansPro-Bold.ttf +0 -0
  209. ultraplot/fonts/SourceSansPro-BoldItalic.ttf +0 -0
  210. ultraplot/fonts/SourceSansPro-ExtraLight.ttf +0 -0
  211. ultraplot/fonts/SourceSansPro-ExtraLightItalic.ttf +0 -0
  212. ultraplot/fonts/SourceSansPro-Italic.ttf +0 -0
  213. ultraplot/fonts/SourceSansPro-Light.ttf +0 -0
  214. ultraplot/fonts/SourceSansPro-LightItalic.ttf +0 -0
  215. ultraplot/fonts/SourceSansPro-Regular.ttf +0 -0
  216. ultraplot/fonts/SourceSansPro-SemiBold.ttf +0 -0
  217. ultraplot/fonts/SourceSansPro-SemiBoldItalic.ttf +0 -0
  218. ultraplot/fonts/SourceSerifPro-Black.ttf +0 -0
  219. ultraplot/fonts/SourceSerifPro-BlackItalic.ttf +0 -0
  220. ultraplot/fonts/SourceSerifPro-Bold.ttf +0 -0
  221. ultraplot/fonts/SourceSerifPro-BoldItalic.ttf +0 -0
  222. ultraplot/fonts/SourceSerifPro-ExtraLight.ttf +0 -0
  223. ultraplot/fonts/SourceSerifPro-ExtraLightItalic.ttf +0 -0
  224. ultraplot/fonts/SourceSerifPro-Italic.ttf +0 -0
  225. ultraplot/fonts/SourceSerifPro-Light.ttf +0 -0
  226. ultraplot/fonts/SourceSerifPro-LightItalic.ttf +0 -0
  227. ultraplot/fonts/SourceSerifPro-Regular.ttf +0 -0
  228. ultraplot/fonts/SourceSerifPro-SemiBold.ttf +0 -0
  229. ultraplot/fonts/SourceSerifPro-SemiBoldItalic.ttf +0 -0
  230. ultraplot/fonts/Ubuntu-Bold.ttf +0 -0
  231. ultraplot/fonts/Ubuntu-BoldItalic.ttf +0 -0
  232. ultraplot/fonts/Ubuntu-Italic.ttf +0 -0
  233. ultraplot/fonts/Ubuntu-Light.ttf +0 -0
  234. ultraplot/fonts/Ubuntu-LightItalic.ttf +0 -0
  235. ultraplot/fonts/Ubuntu-Medium.ttf +0 -0
  236. ultraplot/fonts/Ubuntu-MediumItalic.ttf +0 -0
  237. ultraplot/fonts/Ubuntu-Regular.ttf +0 -0
  238. ultraplot/fonts/texgyreadventor-bold.ttf +0 -0
  239. ultraplot/fonts/texgyreadventor-bolditalic.ttf +0 -0
  240. ultraplot/fonts/texgyreadventor-italic.ttf +0 -0
  241. ultraplot/fonts/texgyreadventor-regular.ttf +0 -0
  242. ultraplot/fonts/texgyrebonum-bold.ttf +0 -0
  243. ultraplot/fonts/texgyrebonum-bolditalic.ttf +0 -0
  244. ultraplot/fonts/texgyrebonum-italic.ttf +0 -0
  245. ultraplot/fonts/texgyrebonum-regular.ttf +0 -0
  246. ultraplot/fonts/texgyrechorus-mediumitalic.ttf +0 -0
  247. ultraplot/fonts/texgyrecursor-bold.ttf +0 -0
  248. ultraplot/fonts/texgyrecursor-bolditalic.ttf +0 -0
  249. ultraplot/fonts/texgyrecursor-italic.ttf +0 -0
  250. ultraplot/fonts/texgyrecursor-regular.ttf +0 -0
  251. ultraplot/fonts/texgyreheros-bold.ttf +0 -0
  252. ultraplot/fonts/texgyreheros-bolditalic.ttf +0 -0
  253. ultraplot/fonts/texgyreheros-italic.ttf +0 -0
  254. ultraplot/fonts/texgyreheros-regular.ttf +0 -0
  255. ultraplot/fonts/texgyrepagella-bold.ttf +0 -0
  256. ultraplot/fonts/texgyrepagella-bolditalic.ttf +0 -0
  257. ultraplot/fonts/texgyrepagella-italic.ttf +0 -0
  258. ultraplot/fonts/texgyrepagella-regular.ttf +0 -0
  259. ultraplot/fonts/texgyreschola-bold.ttf +0 -0
  260. ultraplot/fonts/texgyreschola-bolditalic.ttf +0 -0
  261. ultraplot/fonts/texgyreschola-italic.ttf +0 -0
  262. ultraplot/fonts/texgyreschola-regular.ttf +0 -0
  263. ultraplot/fonts/texgyretermes-bold.ttf +0 -0
  264. ultraplot/fonts/texgyretermes-bolditalic.ttf +0 -0
  265. ultraplot/fonts/texgyretermes-italic.ttf +0 -0
  266. ultraplot/fonts/texgyretermes-regular.ttf +0 -0
  267. ultraplot/gridspec.py +1698 -0
  268. ultraplot/internals/__init__.py +529 -0
  269. ultraplot/internals/benchmarks.py +26 -0
  270. ultraplot/internals/context.py +44 -0
  271. ultraplot/internals/docstring.py +139 -0
  272. ultraplot/internals/fonts.py +75 -0
  273. ultraplot/internals/guides.py +167 -0
  274. ultraplot/internals/inputs.py +862 -0
  275. ultraplot/internals/labels.py +85 -0
  276. ultraplot/internals/rcsetup.py +1933 -0
  277. ultraplot/internals/versions.py +61 -0
  278. ultraplot/internals/warnings.py +122 -0
  279. ultraplot/proj.py +325 -0
  280. ultraplot/scale.py +966 -0
  281. ultraplot/tests/__init__.py +28 -0
  282. ultraplot/tests/baseline/test_align_labels.png +0 -0
  283. ultraplot/tests/baseline/test_aligned_outer_guides.png +0 -0
  284. ultraplot/tests/baseline/test_aspect_ratios.png +0 -0
  285. ultraplot/tests/baseline/test_auto_diverging1.png +0 -0
  286. ultraplot/tests/baseline/test_auto_legend.png +0 -0
  287. ultraplot/tests/baseline/test_auto_reverse.png +0 -0
  288. ultraplot/tests/baseline/test_autodiverging3.png +0 -0
  289. ultraplot/tests/baseline/test_autodiverging4.png +0 -0
  290. ultraplot/tests/baseline/test_autodiverging5.png +0 -0
  291. ultraplot/tests/baseline/test_axes_colors.png +0 -0
  292. ultraplot/tests/baseline/test_bar_vectors.png +0 -0
  293. ultraplot/tests/baseline/test_bar_width.png +0 -0
  294. ultraplot/tests/baseline/test_both_ticklabels.png +0 -0
  295. ultraplot/tests/baseline/test_bounds_ticks.png +0 -0
  296. ultraplot/tests/baseline/test_boxplot_colors.png +0 -0
  297. ultraplot/tests/baseline/test_boxplot_vectors.png +0 -0
  298. ultraplot/tests/baseline/test_cartopy_contours.png +0 -0
  299. ultraplot/tests/baseline/test_cartopy_labels.png +0 -0
  300. ultraplot/tests/baseline/test_cartopy_manual.png +0 -0
  301. ultraplot/tests/baseline/test_centered_legends.png +0 -0
  302. ultraplot/tests/baseline/test_cmap_cycles.png +0 -0
  303. ultraplot/tests/baseline/test_colorbar.png +0 -0
  304. ultraplot/tests/baseline/test_colorbar_ticks.png +0 -0
  305. ultraplot/tests/baseline/test_colormap_mode.png +0 -0
  306. ultraplot/tests/baseline/test_column_iteration.png +0 -0
  307. ultraplot/tests/baseline/test_complex_ticks.png +0 -0
  308. ultraplot/tests/baseline/test_contour_labels.png +0 -0
  309. ultraplot/tests/baseline/test_contour_legend_with_label.png +0 -0
  310. ultraplot/tests/baseline/test_contour_legend_without_label.png +0 -0
  311. ultraplot/tests/baseline/test_contour_negative.png +0 -0
  312. ultraplot/tests/baseline/test_contour_single.png +0 -0
  313. ultraplot/tests/baseline/test_cutoff_ticks.png +0 -0
  314. ultraplot/tests/baseline/test_data_keyword.png +0 -0
  315. ultraplot/tests/baseline/test_discrete_ticks.png +0 -0
  316. ultraplot/tests/baseline/test_discrete_vs_fixed.png +0 -0
  317. ultraplot/tests/baseline/test_drawing_in_projection_with_globe.png +0 -0
  318. ultraplot/tests/baseline/test_drawing_in_projection_without_globe.png +0 -0
  319. ultraplot/tests/baseline/test_edge_fix.png +0 -0
  320. ultraplot/tests/baseline/test_flow_functions.png +0 -0
  321. ultraplot/tests/baseline/test_font_adjustments.png +0 -0
  322. ultraplot/tests/baseline/test_geographic_multiple_projections.png +0 -0
  323. ultraplot/tests/baseline/test_geographic_single_projection.png +0 -0
  324. ultraplot/tests/baseline/test_gray_adjustment.png +0 -0
  325. ultraplot/tests/baseline/test_histogram_legend.png +0 -0
  326. ultraplot/tests/baseline/test_histogram_types.png +0 -0
  327. ultraplot/tests/baseline/test_ignore_message.png +0 -0
  328. ultraplot/tests/baseline/test_inbounds_data.png +0 -0
  329. ultraplot/tests/baseline/test_init_format.png +0 -0
  330. ultraplot/tests/baseline/test_inner_title_zorder.png +0 -0
  331. ultraplot/tests/baseline/test_inset_basic.png +0 -0
  332. ultraplot/tests/baseline/test_inset_colorbars.png +0 -0
  333. ultraplot/tests/baseline/test_inset_colors_1.png +0 -0
  334. ultraplot/tests/baseline/test_inset_colors_2.png +0 -0
  335. ultraplot/tests/baseline/test_inset_zoom_update.png +0 -0
  336. ultraplot/tests/baseline/test_invalid_dist.png +0 -0
  337. ultraplot/tests/baseline/test_invalid_plot.png +0 -0
  338. ultraplot/tests/baseline/test_keep_guide_labels.png +0 -0
  339. ultraplot/tests/baseline/test_label_settings.png +0 -0
  340. ultraplot/tests/baseline/test_level_restriction.png +0 -0
  341. ultraplot/tests/baseline/test_levels_with_vmin_vmax.png +0 -0
  342. ultraplot/tests/baseline/test_locale_formatting.png +0 -0
  343. ultraplot/tests/baseline/test_locale_formatting_en_US.UTF-8.png +0 -0
  344. ultraplot/tests/baseline/test_manual_labels.png +0 -0
  345. ultraplot/tests/baseline/test_multi_formatting.png +0 -0
  346. ultraplot/tests/baseline/test_multiple_calls.png +0 -0
  347. ultraplot/tests/baseline/test_on_the_fly_mappable.png +0 -0
  348. ultraplot/tests/baseline/test_outer_align.png +0 -0
  349. ultraplot/tests/baseline/test_panel_dist.png +0 -0
  350. ultraplot/tests/baseline/test_panels_suplabels_three_hor_panels.png +0 -0
  351. ultraplot/tests/baseline/test_panels_with_sharing.png +0 -0
  352. ultraplot/tests/baseline/test_panels_without_sharing_1.png +0 -0
  353. ultraplot/tests/baseline/test_panels_without_sharing_2.png +0 -0
  354. ultraplot/tests/baseline/test_parametric_colors.png +0 -0
  355. ultraplot/tests/baseline/test_parametric_labels.png +0 -0
  356. ultraplot/tests/baseline/test_patch_format.png +0 -0
  357. ultraplot/tests/baseline/test_pie_charts.png +0 -0
  358. ultraplot/tests/baseline/test_pint_quantities.png +0 -0
  359. ultraplot/tests/baseline/test_polar_projections.png +0 -0
  360. ultraplot/tests/baseline/test_projection_dicts.png +0 -0
  361. ultraplot/tests/baseline/test_qualitative_colormaps_1.png +0 -0
  362. ultraplot/tests/baseline/test_qualitative_colormaps_2.png +0 -0
  363. ultraplot/tests/baseline/test_reversed_levels.png +0 -0
  364. ultraplot/tests/baseline/test_scatter_alpha.png +0 -0
  365. ultraplot/tests/baseline/test_scatter_args.png +0 -0
  366. ultraplot/tests/baseline/test_scatter_cycle.png +0 -0
  367. ultraplot/tests/baseline/test_scatter_inbounds.png +0 -0
  368. ultraplot/tests/baseline/test_scatter_sizes.png +0 -0
  369. ultraplot/tests/baseline/test_seaborn_heatmap.png +0 -0
  370. ultraplot/tests/baseline/test_seaborn_hist.png +0 -0
  371. ultraplot/tests/baseline/test_seaborn_relational.png +0 -0
  372. ultraplot/tests/baseline/test_seaborn_swarmplot.png +0 -0
  373. ultraplot/tests/baseline/test_segmented_norm.png +0 -0
  374. ultraplot/tests/baseline/test_segmented_norm_ticks.png +0 -0
  375. ultraplot/tests/baseline/test_share_all_basic.png +0 -0
  376. ultraplot/tests/baseline/test_singleton_legend.png +0 -0
  377. ultraplot/tests/baseline/test_span_labels.png +0 -0
  378. ultraplot/tests/baseline/test_spine_offset.png +0 -0
  379. ultraplot/tests/baseline/test_spine_side.png +0 -0
  380. ultraplot/tests/baseline/test_standardized_input.png +0 -0
  381. ultraplot/tests/baseline/test_statistical_boxplot.png +0 -0
  382. ultraplot/tests/baseline/test_three_axes.png +0 -0
  383. ultraplot/tests/baseline/test_tick_direction.png +0 -0
  384. ultraplot/tests/baseline/test_tick_labels.png +0 -0
  385. ultraplot/tests/baseline/test_tick_length.png +0 -0
  386. ultraplot/tests/baseline/test_tick_width.png +0 -0
  387. ultraplot/tests/baseline/test_title_deflection.png +0 -0
  388. ultraplot/tests/baseline/test_triangular_functions.png +0 -0
  389. ultraplot/tests/baseline/test_tuple_handles.png +0 -0
  390. ultraplot/tests/baseline/test_twin_axes_1.png +0 -0
  391. ultraplot/tests/baseline/test_twin_axes_2.png +0 -0
  392. ultraplot/tests/baseline/test_twin_axes_3.png +0 -0
  393. ultraplot/tests/baseline/test_uneven_levels.png +0 -0
  394. ultraplot/tests/test_1dplots.py +373 -0
  395. ultraplot/tests/test_2dplots.py +354 -0
  396. ultraplot/tests/test_axes.py +179 -0
  397. ultraplot/tests/test_colorbar.py +253 -0
  398. ultraplot/tests/test_docs.py +78 -0
  399. ultraplot/tests/test_format.py +340 -0
  400. ultraplot/tests/test_geographic.py +116 -0
  401. ultraplot/tests/test_imshow.py +110 -0
  402. ultraplot/tests/test_inset.py +28 -0
  403. ultraplot/tests/test_integration.py +149 -0
  404. ultraplot/tests/test_legend.py +181 -0
  405. ultraplot/tests/test_projections.py +138 -0
  406. ultraplot/tests/test_statistical_plotting.py +77 -0
  407. ultraplot/tests/test_subplots.py +174 -0
  408. ultraplot/ticker.py +879 -0
  409. ultraplot/ui.py +233 -0
  410. ultraplot/utils.py +912 -0
  411. ultraplot-0.99.3.dist-info/LICENSE.txt +427 -0
  412. ultraplot-0.99.3.dist-info/METADATA +88 -0
  413. ultraplot-0.99.3.dist-info/RECORD +416 -0
  414. ultraplot-0.99.3.dist-info/WHEEL +5 -0
  415. ultraplot-0.99.3.dist-info/entry_points.txt +2 -0
  416. ultraplot-0.99.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,139 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Utilities for modifying ultraplot docstrings.
4
+ """
5
+ # WARNING: To check every docstring in the package for
6
+ # unfilled snippets simply use the following code:
7
+ # >>> import ultraplot as pplt
8
+ # ... seen = set()
9
+ # ... def _iter_doc(objs):
10
+ # ... if objs in seen:
11
+ # ... return
12
+ # ... seen.add(objs)
13
+ # ... for attr in dir(objs):
14
+ # ... obj = getattr(objs, attr, None)
15
+ # ... if callable(obj) and hasattr(obj, '__doc__'):
16
+ # ... if obj in seen:
17
+ # ... continue
18
+ # ... seen.add(obj)
19
+ # ... if obj.__doc__ and '%(' in obj.__doc__:
20
+ # ... yield obj.__name__
21
+ # ... yield from _iter_doc(obj)
22
+ # ... print(*_iter_doc(pplt))
23
+ import inspect
24
+ import re
25
+
26
+ import matplotlib.axes as maxes
27
+ import matplotlib.figure as mfigure
28
+ from matplotlib import rcParams as rc_matplotlib
29
+
30
+ from . import ic # noqa: F401
31
+
32
+
33
+ def _obfuscate_kwargs(func):
34
+ """
35
+ Obfuscate keyword args.
36
+ """
37
+ return _obfuscate_signature(func, lambda **kwargs: None)
38
+
39
+
40
+ def _obfuscate_params(func):
41
+ """
42
+ Obfuscate all parameters.
43
+ """
44
+ return _obfuscate_signature(func, lambda *args, **kwargs: None)
45
+
46
+
47
+ def _obfuscate_signature(func, dummy):
48
+ """
49
+ Obfuscate a misleading or incomplete call signature.
50
+ Instead users should inspect the parameter table.
51
+ """
52
+ # Obfuscate signature by converting to *args **kwargs. Note this does
53
+ # not change behavior of function! Copy parameters from a dummy function
54
+ # because I'm too lazy to figure out inspect.Parameters API
55
+ # See: https://stackoverflow.com/a/33112180/4970632
56
+ sig = inspect.signature(func)
57
+ sig_repl = inspect.signature(dummy)
58
+ func.__signature__ = sig.replace(parameters=tuple(sig_repl.parameters.values()))
59
+ return func
60
+
61
+
62
+ def _concatenate_inherited(func, prepend_summary=False):
63
+ """
64
+ Concatenate docstrings from a matplotlib axes method with a ultraplot
65
+ axes method and obfuscate the call signature.
66
+ """
67
+ # Get matplotlib axes func
68
+ # NOTE: Do not bother inheriting from cartopy GeoAxes. Cartopy completely
69
+ # truncates the matplotlib docstrings (which is kind of not great).
70
+ qual = func.__qualname__
71
+ if "Axes" in qual:
72
+ cls = maxes.Axes
73
+ elif "Figure" in qual:
74
+ cls = mfigure.Figure
75
+ else:
76
+ raise ValueError(f"Unexpected method {qual!r}. Must be Axes or Figure method.")
77
+ doc = inspect.getdoc(func) or "" # also dedents
78
+ func_orig = getattr(cls, func.__name__, None)
79
+ doc_orig = inspect.getdoc(func_orig)
80
+ if not doc_orig: # should never happen
81
+ return func
82
+
83
+ # Optionally prepend the function summary
84
+ # Concatenate docstrings only if this is not generated for website
85
+ regex = re.search(r"\.( | *\n|\Z)", doc_orig)
86
+ if regex and prepend_summary:
87
+ doc = doc_orig[: regex.start() + 1] + "\n\n" + doc
88
+ if not rc_matplotlib["docstring.hardcopy"]:
89
+ doc = f"""
90
+ =====================
91
+ ultraplot documentation
92
+ =====================
93
+
94
+ {doc}
95
+
96
+ ========================
97
+ Matplotlib documentation
98
+ ========================
99
+
100
+ {doc_orig}
101
+ """
102
+
103
+ # Return docstring
104
+ # NOTE: Also obfuscate parameters to avoid partial coverage of call signatures
105
+ func.__doc__ = inspect.cleandoc(doc)
106
+ func = _obfuscate_params(func)
107
+ return func
108
+
109
+
110
+ class _SnippetManager(dict):
111
+ """
112
+ A simple database for handling documentation snippets.
113
+ """
114
+
115
+ def __call__(self, obj):
116
+ """
117
+ Add snippets to the string or object using ``%(name)s`` substitution. Here
118
+ ``%(name)s`` is used rather than ``.format`` to support invalid identifiers.
119
+ """
120
+ if isinstance(obj, str):
121
+ obj %= self # add snippets to a string
122
+ else:
123
+ obj.__doc__ = inspect.getdoc(obj) # also dedents the docstring
124
+ if obj.__doc__:
125
+ obj.__doc__ %= self # insert snippets after dedent
126
+ return obj
127
+
128
+ def __setitem__(self, key, value):
129
+ """
130
+ Populate input strings with other snippets and strip newlines. Developers
131
+ should take care to import modules in the correct order.
132
+ """
133
+ value = self(value)
134
+ value = value.strip("\n")
135
+ super().__setitem__(key, value)
136
+
137
+
138
+ # Initiate snippets database
139
+ _snippet_manager = _SnippetManager()
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Overrides related to math fonts.
4
+ """
5
+ import matplotlib as mpl
6
+ from matplotlib.font_manager import findfont, ttfFontProperty
7
+ from matplotlib.mathtext import MathTextParser
8
+
9
+ from . import warnings
10
+
11
+ try: # newer versions
12
+ from matplotlib._mathtext import UnicodeFonts
13
+ except ImportError: # older versions
14
+ from matplotlib.mathtext import UnicodeFonts
15
+
16
+ # Global constant
17
+ WARN_MATHPARSER = True
18
+
19
+
20
+ class _UnicodeFonts(UnicodeFonts):
21
+ """
22
+ A simple `~matplotlib._mathtext.UnicodeFonts` subclass that
23
+ interprets ``rc['mathtext.default'] != 'regular'`` in the presence of
24
+ ``rc['mathtext.fontset'] == 'custom'`` as possibly modifying the active font.
25
+
26
+ Works by permitting the ``rc['mathtext.rm']``, ``rc['mathtext.it']``,
27
+ etc. settings to have the dummy value ``'regular'`` instead of a valid family
28
+ name, e.g. ``rc['mathtext.it'] == 'regular:italic'`` (permitted through an
29
+ override of the `~matplotlib.rcsetup.validate_font_properties` validator).
30
+ When this dummy value is detected then the font properties passed to
31
+ `~matplotlib._mathtext.TrueTypeFont` are taken by replacing ``'regular'``
32
+ in the "math" fontset with the active font name.
33
+ """
34
+
35
+ def __init__(self, *args, **kwargs):
36
+ # Initialize font
37
+ # NOTE: Could also capture the 'default_font_prop' passed as positional
38
+ # argument but want to guard against keyword changes. This entire API is
39
+ # private and it is easier to do graceful fallback with _fonts dictionary.
40
+ ctx = {} # rc context
41
+ regular = {} # styles
42
+ for texfont in ("cal", "rm", "tt", "it", "bf", "sf"):
43
+ key = "mathtext." + texfont
44
+ prop = mpl.rcParams[key]
45
+ if prop.startswith("regular"):
46
+ ctx[key] = prop.replace("regular", "sans", 1)
47
+ regular[texfont] = prop
48
+ with mpl.rc_context(ctx):
49
+ super().__init__(*args, **kwargs)
50
+ # Apply current font replacements
51
+ global WARN_MATHPARSER
52
+ if (
53
+ hasattr(self, "fontmap")
54
+ and hasattr(self, "_fonts")
55
+ and "regular" in self._fonts
56
+ ):
57
+ font = self._fonts["regular"] # an ft2font.FT2Font instance
58
+ font = ttfFontProperty(font)
59
+ for texfont, prop in regular.items():
60
+ prop = prop.replace("regular", font.name)
61
+ self.fontmap[texfont] = findfont(prop, fallback_to_default=False)
62
+ elif WARN_MATHPARSER:
63
+ # Suppress duplicate warnings in case API changes
64
+ warnings._warn_ultraplot("Failed to update the math text parser.")
65
+ WARN_MATHPARSER = False
66
+
67
+
68
+ # Replace the parser
69
+ try:
70
+ mapping = MathTextParser._font_type_mapping
71
+ if mapping["custom"] is UnicodeFonts:
72
+ mapping["custom"] = _UnicodeFonts
73
+ except (KeyError, AttributeError):
74
+ warnings._warn_ultraplot("Failed to update math text parser.")
75
+ WARN_MATHPARSER = False
@@ -0,0 +1,167 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Utilties related to legends and colorbars.
4
+ """
5
+ import matplotlib.artist as martist
6
+ import matplotlib.colorbar as mcolorbar
7
+ import matplotlib.legend as mlegend # noqa: F401
8
+ import matplotlib.ticker as mticker
9
+ import numpy as np
10
+
11
+ from . import ic # noqa: F401
12
+ from . import warnings
13
+
14
+ # Global constants
15
+ REMOVE_AFTER_FLUSH = (
16
+ "pad",
17
+ "space",
18
+ "width",
19
+ "length",
20
+ "shrink",
21
+ "align",
22
+ "queue",
23
+ )
24
+ GUIDE_ALIASES = (
25
+ ("title", "label"),
26
+ ("locator", "ticks"),
27
+ ("format", "formatter", "ticklabels"),
28
+ )
29
+
30
+
31
+ def _add_guide_kw(name, kwargs, **opts):
32
+ """
33
+ Add to the `colorbar_kw` or `legend_kw` dict if there are no conflicts.
34
+ """
35
+ # NOTE: Here we *do not* want to overwrite properties in dictionary. Indicates
36
+ # e.g. default locator inferred from levels or default title inferred from metadata.
37
+ attr = f"{name}_kw"
38
+ if not opts:
39
+ return
40
+ if not kwargs.get(attr, None):
41
+ kwargs[attr] = {} # permit e.g. colorbar_kw=None
42
+ guide_kw = kwargs[attr]
43
+ _update_kw(guide_kw, overwrite=False, **opts)
44
+
45
+
46
+ def _cache_guide_kw(obj, name, kwargs):
47
+ """
48
+ Cache settings on the object from the input keyword arguments.
49
+ """
50
+ # NOTE: Here we overwrite the hidden dictionary if it already exists.
51
+ # This is only called once in _update_guide() so its fine.
52
+ try:
53
+ setattr(obj, f"_{name}_kw", kwargs)
54
+ except AttributeError:
55
+ pass
56
+ if isinstance(obj, (tuple, list, np.ndarray)):
57
+ for member in obj:
58
+ _cache_guide_kw(member, name, kwargs)
59
+
60
+
61
+ def _flush_guide_kw(obj, name, kwargs):
62
+ """
63
+ Flux settings cached on the object into the keyword arguments.
64
+ """
65
+ # NOTE: Here we *do not* overwrite properties in the dictionary by default.
66
+ # Indicates e.g. calling colorbar(extend='both') after pcolor(extend='neither').
67
+ # NOTE: Previously had problems reusing same keyword arguments for more than one
68
+ # colorbar() because locator or formatter axis would get reset. Old solution was
69
+ # to delete the _guide_kw but that destroyed default behavior. New solution is
70
+ # to keep _guide_kw but have constructor functions return shallow copies.
71
+ guide_kw = getattr(obj, f"_{name}_kw", None)
72
+ if guide_kw:
73
+ _update_kw(kwargs, overwrite=False, **guide_kw)
74
+ for key in REMOVE_AFTER_FLUSH:
75
+ guide_kw.pop(key, None)
76
+ if isinstance(obj, (tuple, list, np.ndarray)):
77
+ for member in obj: # possibly iterate over matplotlib tuple/list subclasses
78
+ _flush_guide_kw(member, name, kwargs)
79
+ return kwargs
80
+
81
+
82
+ def _update_kw(kwargs, overwrite=False, **opts):
83
+ """
84
+ Add the keyword arguments to the dictionary if not already present.
85
+ """
86
+ for key, value in opts.items():
87
+ if value is None:
88
+ continue
89
+ keys = tuple(k for opts in GUIDE_ALIASES for k in opts if key in opts)
90
+ keys = keys or (key,) # e.g. 'extend' or something
91
+ keys_found = tuple(key for key in keys if kwargs.get(key) is not None)
92
+ if not keys_found:
93
+ kwargs[key] = value
94
+ elif overwrite: # overwrite existing key
95
+ kwargs[keys_found[0]] = value
96
+
97
+
98
+ def _iter_children(*args):
99
+ """
100
+ Iterate through `_children` of `HPacker`, `VPacker`, and `DrawingArea`.
101
+ This is used to update legend handle properties.
102
+ """
103
+ for arg in args:
104
+ if hasattr(arg, "_children"):
105
+ yield from _iter_children(*arg._children)
106
+ elif arg is not None:
107
+ yield arg
108
+
109
+
110
+ def _iter_iterables(*args):
111
+ """
112
+ Iterate over arbitrary nested lists of iterables. Used for deciphering legend input.
113
+ Things can get complicated with e.g. bar colunns plus negative-positive colors.
114
+ """
115
+ for arg in args:
116
+ if np.iterable(arg):
117
+ yield from _iter_iterables(*arg)
118
+ elif arg is not None:
119
+ yield arg
120
+
121
+
122
+ def _update_ticks(self, manual_only=False):
123
+ """
124
+ Refined colorbar tick updater without subclassing.
125
+ """
126
+ # TODO: Add this to generalized colorbar subclass?
127
+ # NOTE: Matplotlib 3.5+ does not define _use_auto_colorbar_locator since
128
+ # ticks are always automatically adjusted by its colorbar subclass. This
129
+ # override is thus backwards and forwards compatible.
130
+ attr = "_use_auto_colorbar_locator"
131
+ if not hasattr(self, attr) or getattr(self, attr)():
132
+ if manual_only:
133
+ pass
134
+ else:
135
+ mcolorbar.Colorbar.update_ticks(self) # AutoMinorLocator auto updates
136
+ else:
137
+ mcolorbar.Colorbar.update_ticks(self) # update necessary
138
+ minorlocator = getattr(self, "minorlocator", None)
139
+ if minorlocator is None:
140
+ pass
141
+ elif hasattr(self, "_ticker"):
142
+ ticks, *_ = self._ticker(self.minorlocator, mticker.NullFormatter())
143
+ axis = self.ax.yaxis if self.orientation == "vertical" else self.ax.xaxis
144
+ axis.set_ticks(ticks, minor=True)
145
+ axis.set_ticklabels([], minor=True)
146
+ else:
147
+ warnings._warn_ultraplot(
148
+ f"Cannot use user-input colorbar minor locator {minorlocator!r} (older matplotlib version). Turning on minor ticks instead."
149
+ ) # noqa: E501
150
+ self.minorlocator = None
151
+ self.minorticks_on() # at least turn them on
152
+
153
+
154
+ class _InsetColorbar(martist.Artist):
155
+ """
156
+ Legend-like class for managing inset colorbars.
157
+ """
158
+
159
+ # TODO: Write this!
160
+
161
+
162
+ class _CenteredLegend(martist.Artist):
163
+ """
164
+ Legend-like class for managing centered-row legends.
165
+ """
166
+
167
+ # TODO: Write this!