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.
- ultraplot/__init__.py +115 -0
- ultraplot/__init__.py.rej +58 -0
- ultraplot/axes/__init__.py +42 -0
- ultraplot/axes/base.py +3240 -0
- ultraplot/axes/cartesian.py +1425 -0
- ultraplot/axes/geo.py +1675 -0
- ultraplot/axes/plot.py +4569 -0
- ultraplot/axes/polar.py +381 -0
- ultraplot/axes/shared.py +186 -0
- ultraplot/axes/three.py +34 -0
- ultraplot/cmaps/Algae.rgb +256 -0
- ultraplot/cmaps/Amp.rgb +256 -0
- ultraplot/cmaps/BR.rgb +256 -0
- ultraplot/cmaps/Balance.rgb +256 -0
- ultraplot/cmaps/Blues1_r.xml +17 -0
- ultraplot/cmaps/Blues2.xml +16 -0
- ultraplot/cmaps/Blues3.xml +25 -0
- ultraplot/cmaps/Blues4_r.xml +17 -0
- ultraplot/cmaps/Blues5.xml +16 -0
- ultraplot/cmaps/Blues6.xml +25 -0
- ultraplot/cmaps/Blues7.xml +16 -0
- ultraplot/cmaps/Blues8.xml +17 -0
- ultraplot/cmaps/Blues9.xml +1 -0
- ultraplot/cmaps/Boreal.json +53 -0
- ultraplot/cmaps/Browns1.xml +16 -0
- ultraplot/cmaps/Browns2.xml +26 -0
- ultraplot/cmaps/Browns3.xml +17 -0
- ultraplot/cmaps/Browns4.xml +17 -0
- ultraplot/cmaps/Browns5.xml +26 -0
- ultraplot/cmaps/Browns6.xml +17 -0
- ultraplot/cmaps/Browns7.xml +19 -0
- ultraplot/cmaps/Browns8.xml +11 -0
- ultraplot/cmaps/Browns9.xml +1 -0
- ultraplot/cmaps/ColdHot.rgb +229 -0
- ultraplot/cmaps/Crest.rgb +256 -0
- ultraplot/cmaps/Curl.rgb +512 -0
- ultraplot/cmaps/Deep.rgb +256 -0
- ultraplot/cmaps/Delta.rgb +512 -0
- ultraplot/cmaps/Dense.rgb +256 -0
- ultraplot/cmaps/Div.json +71 -0
- ultraplot/cmaps/DryWet.json +73 -0
- ultraplot/cmaps/Dusk.json +53 -0
- ultraplot/cmaps/Fire.json +53 -0
- ultraplot/cmaps/Flare.rgb +256 -0
- ultraplot/cmaps/Glacial.json +53 -0
- ultraplot/cmaps/Greens1_r.xml +26 -0
- ultraplot/cmaps/Greens2.xml +28 -0
- ultraplot/cmaps/Greens3_r.xml +28 -0
- ultraplot/cmaps/Greens4.xml +17 -0
- ultraplot/cmaps/Greens5.xml +16 -0
- ultraplot/cmaps/Greens6_r.xml +16 -0
- ultraplot/cmaps/Greens7.xml +16 -0
- ultraplot/cmaps/Greens8.xml +26 -0
- ultraplot/cmaps/Haline.rgb +256 -0
- ultraplot/cmaps/Ice.rgb +256 -0
- ultraplot/cmaps/IceFire.rgb +256 -0
- ultraplot/cmaps/Mako.rgb +256 -0
- ultraplot/cmaps/Marine.json +53 -0
- ultraplot/cmaps/Matter.rgb +256 -0
- ultraplot/cmaps/Mono.txt +256 -0
- ultraplot/cmaps/MonoCycle.txt +256 -0
- ultraplot/cmaps/NegPos.json +71 -0
- ultraplot/cmaps/Oranges1.xml +27 -0
- ultraplot/cmaps/Oranges2.xml +26 -0
- ultraplot/cmaps/Oranges3.xml +15 -0
- ultraplot/cmaps/Oranges4.xml +23 -0
- ultraplot/cmaps/Oxy.rgb +256 -0
- ultraplot/cmaps/Phase.rgb +256 -0
- ultraplot/cmaps/Purples1_r.xml +16 -0
- ultraplot/cmaps/Purples2.xml +17 -0
- ultraplot/cmaps/Purples3.xml +18 -0
- ultraplot/cmaps/Reds1.xml +26 -0
- ultraplot/cmaps/Reds2.xml +22 -0
- ultraplot/cmaps/Reds3.xml +23 -0
- ultraplot/cmaps/Reds4.xml +26 -0
- ultraplot/cmaps/Reds5.xml +17 -0
- ultraplot/cmaps/Rocket.rgb +256 -0
- ultraplot/cmaps/Solar.rgb +256 -0
- ultraplot/cmaps/Speed.rgb +256 -0
- ultraplot/cmaps/Stellar.json +53 -0
- ultraplot/cmaps/Sunrise.json +53 -0
- ultraplot/cmaps/Sunset.json +53 -0
- ultraplot/cmaps/Tempo.rgb +256 -0
- ultraplot/cmaps/Thermal.rgb +256 -0
- ultraplot/cmaps/Turbid.rgb +256 -0
- ultraplot/cmaps/Vivid.xml +11 -0
- ultraplot/cmaps/Vlag.rgb +256 -0
- ultraplot/cmaps/Yellows1.xml +17 -0
- ultraplot/cmaps/Yellows2.xml +17 -0
- ultraplot/cmaps/Yellows3.xml +17 -0
- ultraplot/cmaps/Yellows4.xml +17 -0
- ultraplot/cmaps/acton.txt +256 -0
- ultraplot/cmaps/bam.txt +256 -0
- ultraplot/cmaps/bamO.txt +256 -0
- ultraplot/cmaps/bamako.txt +256 -0
- ultraplot/cmaps/batlow.txt +256 -0
- ultraplot/cmaps/batlowK.txt +256 -0
- ultraplot/cmaps/batlowW.txt +256 -0
- ultraplot/cmaps/berlin.txt +256 -0
- ultraplot/cmaps/bilbao.txt +256 -0
- ultraplot/cmaps/broc.txt +256 -0
- ultraplot/cmaps/brocO.txt +256 -0
- ultraplot/cmaps/buda.txt +256 -0
- ultraplot/cmaps/bukavu.txt +256 -0
- ultraplot/cmaps/cork.txt +256 -0
- ultraplot/cmaps/corkO.txt +256 -0
- ultraplot/cmaps/davos.txt +256 -0
- ultraplot/cmaps/devon.txt +256 -0
- ultraplot/cmaps/fes.txt +256 -0
- ultraplot/cmaps/hawaii.txt +256 -0
- ultraplot/cmaps/imola.txt +256 -0
- ultraplot/cmaps/lajolla.txt +256 -0
- ultraplot/cmaps/lapaz.txt +256 -0
- ultraplot/cmaps/lisbon.txt +256 -0
- ultraplot/cmaps/nuuk.txt +256 -0
- ultraplot/cmaps/oleron.txt +256 -0
- ultraplot/cmaps/oslo.txt +256 -0
- ultraplot/cmaps/roma.txt +256 -0
- ultraplot/cmaps/romaO.txt +256 -0
- ultraplot/cmaps/tofino.txt +256 -0
- ultraplot/cmaps/tokyo.txt +256 -0
- ultraplot/cmaps/turku.txt +256 -0
- ultraplot/cmaps/vanimo.txt +256 -0
- ultraplot/cmaps/vik.txt +256 -0
- ultraplot/cmaps/vikO.txt +256 -0
- ultraplot/colors/opencolor.txt +132 -0
- ultraplot/colors/xkcd.txt +951 -0
- ultraplot/colors.py +3241 -0
- ultraplot/colors.py.rej +243 -0
- ultraplot/config.py +1809 -0
- ultraplot/constructor.py +1633 -0
- ultraplot/cycles/538.hex +2 -0
- ultraplot/cycles/FlatUI.hex +1 -0
- ultraplot/cycles/Qual1.rgb +7 -0
- ultraplot/cycles/Qual2.rgb +13 -0
- ultraplot/cycles/bmh.hex +2 -0
- ultraplot/cycles/classic.hex +2 -0
- ultraplot/cycles/colorblind.hex +2 -0
- ultraplot/cycles/colorblind10.hex +2 -0
- ultraplot/cycles/default.hex +2 -0
- ultraplot/cycles/ggplot.hex +1 -0
- ultraplot/cycles/seaborn.hex +2 -0
- ultraplot/cycles/tableau.hex +2 -0
- ultraplot/demos.py +1201 -0
- ultraplot/externals/__init__.py +5 -0
- ultraplot/externals/hsluv.py +330 -0
- ultraplot/figure.py +2102 -0
- ultraplot/fonts/FiraMath-Bold.ttf +0 -0
- ultraplot/fonts/FiraMath-ExtraLight.ttf +0 -0
- ultraplot/fonts/FiraMath-Heavy.ttf +0 -0
- ultraplot/fonts/FiraMath-Light.ttf +0 -0
- ultraplot/fonts/FiraMath-Medium.ttf +0 -0
- ultraplot/fonts/FiraMath-Regular.ttf +0 -0
- ultraplot/fonts/FiraMath-SemiBold.ttf +0 -0
- ultraplot/fonts/FiraMath-UltraLight.ttf +0 -0
- ultraplot/fonts/FiraSans-Black.ttf +0 -0
- ultraplot/fonts/FiraSans-BlackItalic.ttf +0 -0
- ultraplot/fonts/FiraSans-Bold.ttf +0 -0
- ultraplot/fonts/FiraSans-BoldItalic.ttf +0 -0
- ultraplot/fonts/FiraSans-ExtraBold.ttf +0 -0
- ultraplot/fonts/FiraSans-ExtraBoldItalic.ttf +0 -0
- ultraplot/fonts/FiraSans-ExtraLight.ttf +0 -0
- ultraplot/fonts/FiraSans-ExtraLightItalic.ttf +0 -0
- ultraplot/fonts/FiraSans-Italic.ttf +0 -0
- ultraplot/fonts/FiraSans-Light.ttf +0 -0
- ultraplot/fonts/FiraSans-LightItalic.ttf +0 -0
- ultraplot/fonts/FiraSans-Medium.ttf +0 -0
- ultraplot/fonts/FiraSans-MediumItalic.ttf +0 -0
- ultraplot/fonts/FiraSans-Regular.ttf +0 -0
- ultraplot/fonts/FiraSans-SemiBold.ttf +0 -0
- ultraplot/fonts/FiraSans-SemiBoldItalic.ttf +0 -0
- ultraplot/fonts/LICENSE_FIRAMATH.txt +92 -0
- ultraplot/fonts/LICENSE_FIRASANS.txt +97 -0
- ultraplot/fonts/LICENSE_NOTOSANS.txt +202 -0
- ultraplot/fonts/LICENSE_NOTOSERIF.txt +93 -0
- ultraplot/fonts/LICENSE_OPENSANS.txt +202 -0
- ultraplot/fonts/LICENSE_ROBOTO.txt +202 -0
- ultraplot/fonts/LICENSE_SOURCESANS.txt +93 -0
- ultraplot/fonts/LICENSE_SOURCESERIF.txt +93 -0
- ultraplot/fonts/LICENSE_TEXGYRE.txt +29 -0
- ultraplot/fonts/LICENSE_UBUNTU.txt +96 -0
- ultraplot/fonts/NotoSans-Bold.ttf +0 -0
- ultraplot/fonts/NotoSans-BoldItalic.ttf +0 -0
- ultraplot/fonts/NotoSans-Italic.ttf +0 -0
- ultraplot/fonts/NotoSans-Regular.ttf +0 -0
- ultraplot/fonts/NotoSerif-Bold.ttf +0 -0
- ultraplot/fonts/NotoSerif-BoldItalic.ttf +0 -0
- ultraplot/fonts/NotoSerif-Italic.ttf +0 -0
- ultraplot/fonts/NotoSerif-Regular.ttf +0 -0
- ultraplot/fonts/OpenSans-Bold.ttf +0 -0
- ultraplot/fonts/OpenSans-BoldItalic.ttf +0 -0
- ultraplot/fonts/OpenSans-Italic.ttf +0 -0
- ultraplot/fonts/OpenSans-Regular.ttf +0 -0
- ultraplot/fonts/OpenSans-Semibold.ttf +0 -0
- ultraplot/fonts/OpenSans-SemiboldItalic.ttf +0 -0
- ultraplot/fonts/Roboto-Black.ttf +0 -0
- ultraplot/fonts/Roboto-BlackItalic.ttf +0 -0
- ultraplot/fonts/Roboto-Bold.ttf +0 -0
- ultraplot/fonts/Roboto-BoldItalic.ttf +0 -0
- ultraplot/fonts/Roboto-Italic.ttf +0 -0
- ultraplot/fonts/Roboto-Light.ttf +0 -0
- ultraplot/fonts/Roboto-LightItalic.ttf +0 -0
- ultraplot/fonts/Roboto-Medium.ttf +0 -0
- ultraplot/fonts/Roboto-MediumItalic.ttf +0 -0
- ultraplot/fonts/Roboto-Regular.ttf +0 -0
- ultraplot/fonts/SourceSansPro-Black.ttf +0 -0
- ultraplot/fonts/SourceSansPro-BlackItalic.ttf +0 -0
- ultraplot/fonts/SourceSansPro-Bold.ttf +0 -0
- ultraplot/fonts/SourceSansPro-BoldItalic.ttf +0 -0
- ultraplot/fonts/SourceSansPro-ExtraLight.ttf +0 -0
- ultraplot/fonts/SourceSansPro-ExtraLightItalic.ttf +0 -0
- ultraplot/fonts/SourceSansPro-Italic.ttf +0 -0
- ultraplot/fonts/SourceSansPro-Light.ttf +0 -0
- ultraplot/fonts/SourceSansPro-LightItalic.ttf +0 -0
- ultraplot/fonts/SourceSansPro-Regular.ttf +0 -0
- ultraplot/fonts/SourceSansPro-SemiBold.ttf +0 -0
- ultraplot/fonts/SourceSansPro-SemiBoldItalic.ttf +0 -0
- ultraplot/fonts/SourceSerifPro-Black.ttf +0 -0
- ultraplot/fonts/SourceSerifPro-BlackItalic.ttf +0 -0
- ultraplot/fonts/SourceSerifPro-Bold.ttf +0 -0
- ultraplot/fonts/SourceSerifPro-BoldItalic.ttf +0 -0
- ultraplot/fonts/SourceSerifPro-ExtraLight.ttf +0 -0
- ultraplot/fonts/SourceSerifPro-ExtraLightItalic.ttf +0 -0
- ultraplot/fonts/SourceSerifPro-Italic.ttf +0 -0
- ultraplot/fonts/SourceSerifPro-Light.ttf +0 -0
- ultraplot/fonts/SourceSerifPro-LightItalic.ttf +0 -0
- ultraplot/fonts/SourceSerifPro-Regular.ttf +0 -0
- ultraplot/fonts/SourceSerifPro-SemiBold.ttf +0 -0
- ultraplot/fonts/SourceSerifPro-SemiBoldItalic.ttf +0 -0
- ultraplot/fonts/Ubuntu-Bold.ttf +0 -0
- ultraplot/fonts/Ubuntu-BoldItalic.ttf +0 -0
- ultraplot/fonts/Ubuntu-Italic.ttf +0 -0
- ultraplot/fonts/Ubuntu-Light.ttf +0 -0
- ultraplot/fonts/Ubuntu-LightItalic.ttf +0 -0
- ultraplot/fonts/Ubuntu-Medium.ttf +0 -0
- ultraplot/fonts/Ubuntu-MediumItalic.ttf +0 -0
- ultraplot/fonts/Ubuntu-Regular.ttf +0 -0
- ultraplot/fonts/texgyreadventor-bold.ttf +0 -0
- ultraplot/fonts/texgyreadventor-bolditalic.ttf +0 -0
- ultraplot/fonts/texgyreadventor-italic.ttf +0 -0
- ultraplot/fonts/texgyreadventor-regular.ttf +0 -0
- ultraplot/fonts/texgyrebonum-bold.ttf +0 -0
- ultraplot/fonts/texgyrebonum-bolditalic.ttf +0 -0
- ultraplot/fonts/texgyrebonum-italic.ttf +0 -0
- ultraplot/fonts/texgyrebonum-regular.ttf +0 -0
- ultraplot/fonts/texgyrechorus-mediumitalic.ttf +0 -0
- ultraplot/fonts/texgyrecursor-bold.ttf +0 -0
- ultraplot/fonts/texgyrecursor-bolditalic.ttf +0 -0
- ultraplot/fonts/texgyrecursor-italic.ttf +0 -0
- ultraplot/fonts/texgyrecursor-regular.ttf +0 -0
- ultraplot/fonts/texgyreheros-bold.ttf +0 -0
- ultraplot/fonts/texgyreheros-bolditalic.ttf +0 -0
- ultraplot/fonts/texgyreheros-italic.ttf +0 -0
- ultraplot/fonts/texgyreheros-regular.ttf +0 -0
- ultraplot/fonts/texgyrepagella-bold.ttf +0 -0
- ultraplot/fonts/texgyrepagella-bolditalic.ttf +0 -0
- ultraplot/fonts/texgyrepagella-italic.ttf +0 -0
- ultraplot/fonts/texgyrepagella-regular.ttf +0 -0
- ultraplot/fonts/texgyreschola-bold.ttf +0 -0
- ultraplot/fonts/texgyreschola-bolditalic.ttf +0 -0
- ultraplot/fonts/texgyreschola-italic.ttf +0 -0
- ultraplot/fonts/texgyreschola-regular.ttf +0 -0
- ultraplot/fonts/texgyretermes-bold.ttf +0 -0
- ultraplot/fonts/texgyretermes-bolditalic.ttf +0 -0
- ultraplot/fonts/texgyretermes-italic.ttf +0 -0
- ultraplot/fonts/texgyretermes-regular.ttf +0 -0
- ultraplot/gridspec.py +1698 -0
- ultraplot/internals/__init__.py +529 -0
- ultraplot/internals/benchmarks.py +26 -0
- ultraplot/internals/context.py +44 -0
- ultraplot/internals/docstring.py +139 -0
- ultraplot/internals/fonts.py +75 -0
- ultraplot/internals/guides.py +167 -0
- ultraplot/internals/inputs.py +862 -0
- ultraplot/internals/labels.py +85 -0
- ultraplot/internals/rcsetup.py +1933 -0
- ultraplot/internals/versions.py +61 -0
- ultraplot/internals/warnings.py +122 -0
- ultraplot/proj.py +325 -0
- ultraplot/scale.py +966 -0
- ultraplot/tests/__init__.py +28 -0
- ultraplot/tests/baseline/test_align_labels.png +0 -0
- ultraplot/tests/baseline/test_aligned_outer_guides.png +0 -0
- ultraplot/tests/baseline/test_aspect_ratios.png +0 -0
- ultraplot/tests/baseline/test_auto_diverging1.png +0 -0
- ultraplot/tests/baseline/test_auto_legend.png +0 -0
- ultraplot/tests/baseline/test_auto_reverse.png +0 -0
- ultraplot/tests/baseline/test_autodiverging3.png +0 -0
- ultraplot/tests/baseline/test_autodiverging4.png +0 -0
- ultraplot/tests/baseline/test_autodiverging5.png +0 -0
- ultraplot/tests/baseline/test_axes_colors.png +0 -0
- ultraplot/tests/baseline/test_bar_vectors.png +0 -0
- ultraplot/tests/baseline/test_bar_width.png +0 -0
- ultraplot/tests/baseline/test_both_ticklabels.png +0 -0
- ultraplot/tests/baseline/test_bounds_ticks.png +0 -0
- ultraplot/tests/baseline/test_boxplot_colors.png +0 -0
- ultraplot/tests/baseline/test_boxplot_vectors.png +0 -0
- ultraplot/tests/baseline/test_cartopy_contours.png +0 -0
- ultraplot/tests/baseline/test_cartopy_labels.png +0 -0
- ultraplot/tests/baseline/test_cartopy_manual.png +0 -0
- ultraplot/tests/baseline/test_centered_legends.png +0 -0
- ultraplot/tests/baseline/test_cmap_cycles.png +0 -0
- ultraplot/tests/baseline/test_colorbar.png +0 -0
- ultraplot/tests/baseline/test_colorbar_ticks.png +0 -0
- ultraplot/tests/baseline/test_colormap_mode.png +0 -0
- ultraplot/tests/baseline/test_column_iteration.png +0 -0
- ultraplot/tests/baseline/test_complex_ticks.png +0 -0
- ultraplot/tests/baseline/test_contour_labels.png +0 -0
- ultraplot/tests/baseline/test_contour_legend_with_label.png +0 -0
- ultraplot/tests/baseline/test_contour_legend_without_label.png +0 -0
- ultraplot/tests/baseline/test_contour_negative.png +0 -0
- ultraplot/tests/baseline/test_contour_single.png +0 -0
- ultraplot/tests/baseline/test_cutoff_ticks.png +0 -0
- ultraplot/tests/baseline/test_data_keyword.png +0 -0
- ultraplot/tests/baseline/test_discrete_ticks.png +0 -0
- ultraplot/tests/baseline/test_discrete_vs_fixed.png +0 -0
- ultraplot/tests/baseline/test_drawing_in_projection_with_globe.png +0 -0
- ultraplot/tests/baseline/test_drawing_in_projection_without_globe.png +0 -0
- ultraplot/tests/baseline/test_edge_fix.png +0 -0
- ultraplot/tests/baseline/test_flow_functions.png +0 -0
- ultraplot/tests/baseline/test_font_adjustments.png +0 -0
- ultraplot/tests/baseline/test_geographic_multiple_projections.png +0 -0
- ultraplot/tests/baseline/test_geographic_single_projection.png +0 -0
- ultraplot/tests/baseline/test_gray_adjustment.png +0 -0
- ultraplot/tests/baseline/test_histogram_legend.png +0 -0
- ultraplot/tests/baseline/test_histogram_types.png +0 -0
- ultraplot/tests/baseline/test_ignore_message.png +0 -0
- ultraplot/tests/baseline/test_inbounds_data.png +0 -0
- ultraplot/tests/baseline/test_init_format.png +0 -0
- ultraplot/tests/baseline/test_inner_title_zorder.png +0 -0
- ultraplot/tests/baseline/test_inset_basic.png +0 -0
- ultraplot/tests/baseline/test_inset_colorbars.png +0 -0
- ultraplot/tests/baseline/test_inset_colors_1.png +0 -0
- ultraplot/tests/baseline/test_inset_colors_2.png +0 -0
- ultraplot/tests/baseline/test_inset_zoom_update.png +0 -0
- ultraplot/tests/baseline/test_invalid_dist.png +0 -0
- ultraplot/tests/baseline/test_invalid_plot.png +0 -0
- ultraplot/tests/baseline/test_keep_guide_labels.png +0 -0
- ultraplot/tests/baseline/test_label_settings.png +0 -0
- ultraplot/tests/baseline/test_level_restriction.png +0 -0
- ultraplot/tests/baseline/test_levels_with_vmin_vmax.png +0 -0
- ultraplot/tests/baseline/test_locale_formatting.png +0 -0
- ultraplot/tests/baseline/test_locale_formatting_en_US.UTF-8.png +0 -0
- ultraplot/tests/baseline/test_manual_labels.png +0 -0
- ultraplot/tests/baseline/test_multi_formatting.png +0 -0
- ultraplot/tests/baseline/test_multiple_calls.png +0 -0
- ultraplot/tests/baseline/test_on_the_fly_mappable.png +0 -0
- ultraplot/tests/baseline/test_outer_align.png +0 -0
- ultraplot/tests/baseline/test_panel_dist.png +0 -0
- ultraplot/tests/baseline/test_panels_suplabels_three_hor_panels.png +0 -0
- ultraplot/tests/baseline/test_panels_with_sharing.png +0 -0
- ultraplot/tests/baseline/test_panels_without_sharing_1.png +0 -0
- ultraplot/tests/baseline/test_panels_without_sharing_2.png +0 -0
- ultraplot/tests/baseline/test_parametric_colors.png +0 -0
- ultraplot/tests/baseline/test_parametric_labels.png +0 -0
- ultraplot/tests/baseline/test_patch_format.png +0 -0
- ultraplot/tests/baseline/test_pie_charts.png +0 -0
- ultraplot/tests/baseline/test_pint_quantities.png +0 -0
- ultraplot/tests/baseline/test_polar_projections.png +0 -0
- ultraplot/tests/baseline/test_projection_dicts.png +0 -0
- ultraplot/tests/baseline/test_qualitative_colormaps_1.png +0 -0
- ultraplot/tests/baseline/test_qualitative_colormaps_2.png +0 -0
- ultraplot/tests/baseline/test_reversed_levels.png +0 -0
- ultraplot/tests/baseline/test_scatter_alpha.png +0 -0
- ultraplot/tests/baseline/test_scatter_args.png +0 -0
- ultraplot/tests/baseline/test_scatter_cycle.png +0 -0
- ultraplot/tests/baseline/test_scatter_inbounds.png +0 -0
- ultraplot/tests/baseline/test_scatter_sizes.png +0 -0
- ultraplot/tests/baseline/test_seaborn_heatmap.png +0 -0
- ultraplot/tests/baseline/test_seaborn_hist.png +0 -0
- ultraplot/tests/baseline/test_seaborn_relational.png +0 -0
- ultraplot/tests/baseline/test_seaborn_swarmplot.png +0 -0
- ultraplot/tests/baseline/test_segmented_norm.png +0 -0
- ultraplot/tests/baseline/test_segmented_norm_ticks.png +0 -0
- ultraplot/tests/baseline/test_share_all_basic.png +0 -0
- ultraplot/tests/baseline/test_singleton_legend.png +0 -0
- ultraplot/tests/baseline/test_span_labels.png +0 -0
- ultraplot/tests/baseline/test_spine_offset.png +0 -0
- ultraplot/tests/baseline/test_spine_side.png +0 -0
- ultraplot/tests/baseline/test_standardized_input.png +0 -0
- ultraplot/tests/baseline/test_statistical_boxplot.png +0 -0
- ultraplot/tests/baseline/test_three_axes.png +0 -0
- ultraplot/tests/baseline/test_tick_direction.png +0 -0
- ultraplot/tests/baseline/test_tick_labels.png +0 -0
- ultraplot/tests/baseline/test_tick_length.png +0 -0
- ultraplot/tests/baseline/test_tick_width.png +0 -0
- ultraplot/tests/baseline/test_title_deflection.png +0 -0
- ultraplot/tests/baseline/test_triangular_functions.png +0 -0
- ultraplot/tests/baseline/test_tuple_handles.png +0 -0
- ultraplot/tests/baseline/test_twin_axes_1.png +0 -0
- ultraplot/tests/baseline/test_twin_axes_2.png +0 -0
- ultraplot/tests/baseline/test_twin_axes_3.png +0 -0
- ultraplot/tests/baseline/test_uneven_levels.png +0 -0
- ultraplot/tests/test_1dplots.py +373 -0
- ultraplot/tests/test_2dplots.py +354 -0
- ultraplot/tests/test_axes.py +179 -0
- ultraplot/tests/test_colorbar.py +253 -0
- ultraplot/tests/test_docs.py +78 -0
- ultraplot/tests/test_format.py +340 -0
- ultraplot/tests/test_geographic.py +116 -0
- ultraplot/tests/test_imshow.py +110 -0
- ultraplot/tests/test_inset.py +28 -0
- ultraplot/tests/test_integration.py +149 -0
- ultraplot/tests/test_legend.py +181 -0
- ultraplot/tests/test_projections.py +138 -0
- ultraplot/tests/test_statistical_plotting.py +77 -0
- ultraplot/tests/test_subplots.py +174 -0
- ultraplot/ticker.py +879 -0
- ultraplot/ui.py +233 -0
- ultraplot/utils.py +912 -0
- ultraplot-0.99.3.dist-info/LICENSE.txt +427 -0
- ultraplot-0.99.3.dist-info/METADATA +88 -0
- ultraplot-0.99.3.dist-info/RECORD +416 -0
- ultraplot-0.99.3.dist-info/WHEEL +5 -0
- ultraplot-0.99.3.dist-info/entry_points.txt +2 -0
- 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!
|