What’s new?

This page lists the API changes with each version. Please note that when functions and keywords are renamed, they are not removed – requesting the old name will issue a warning rather than an error. Authors are shown next to each change. Where not indicated, Luke Davis was the author.

See the author page for a list of contributors, and see the contribution guide if you are interested in submitting your own changes.

ProPlot v1.0.0 (2022-##-##)

This will be published when more comprehensive testing is completed and stability is improved.

ProPlot v0.8.1 (2021-08-22)

Features

  • Add from_list adjust_grays option (enabled by default) to help make diverging colormaps with an intermediate hueless white, gray, or black color (@2e8cb495).

  • Add the axis sharing level 4 or 'all' to share the limits, scales, and tick labels between axes not in the same row/column (@73f355a2).

  • Allow adding contours to legend by interpreting label keyword and using central handle from ContourSet.legend_elements (@26bc77a4).

  • Extend mixed auto-manual legend label input (e.g. labels=[None, 'override']) to case where legend handles are automatically retrieved from the axes rather than manually passed to legend() (@26bc77a4).

  • Add inlinelabels option to format to set both loninline=True and latinline=True at once, and change the rc['grid.loninline'] and rc['grid.latinline'] settings to the single rc['grid.inlinelabels'] (consistent with rc['grid.rotatelabels'] and rc['grid.dmslabels']) (@560ed978).

Bug fixes

  • Fix regression where np.std and np.percentile no longer ignore NaN values (GH#257, @d1906fce).

  • Fix regression where legend() cannot be called without the input labels (GH#188, @fdd53a6c).

  • Fix issue where edge colors of area plots with negpos=True cannot be changed (@bb50dea4).

  • Fix issue where legend order keyword arg is ignored and default is changed back to 'F' (@###).

  • Fix issues where setup_matplotlib is not called for pint quantity input and column iteration of 2D input to 1D funcs fails (@e57d238e).

  • Fix issue where pint quantity x and y coordinates fail when passing as pcolor centers or when rc['cmap.inbounds'] enabled (@fd76af3a).

  • Fix issue where pint quantity z data do not have units stripped unless in xarray dataarray (@aadc65f9).

  • Fix issue where making single-color contour plots creates just one contour by making default levels count independent from colors (@63eaf10e).

  • Fix issue where common legend handle properties cannot be overridden due to searching for collection props rather than line props (@26bc77a4).

  • Fix issue where title/abc padding is overwritten in the presence of top panels and make title deflection to top panels generally more robust (@d27d05cf).

  • Fix issues with the %qt backend using forward=False during subplot additions (GH#244, @ac12bbc2)

  • Fix issue where %matpolotlib notebook and %matplotlib widget display unusable/cutoff figure previews by fixing the figure size at creation time and issuing one-time warning if size was not fixed explicitly (@88fc2868).

Documentation

  • Make docstring utils explicitly private and convert _snippets dictionary to callable dictionary-like _SnippetsManager instance (@b73fe9e3). This helps prevent bug where assigned snippets have unfilled %(snippet)s markers.

ProPlot v0.8.0 (2021-08-18)

Deprecated

  • Numbers passed to pad, wpad, hpad, space, wspace, hspace, left, right, top, and bottom are now interpreted as em-widths instead of inches (@20502345). Unfortunately this is a major breaking change that cannot be “gently” phased in with warnings, but this will be much more convenient going forward.

  • Make default reference subplot size, panel widths, colorbar widths independent of rc['font.size'] (@a50d5264). Default space size should definitely sync with font size, since larger fonts produce larger labels between subplots, but the same reasoning does not apply for subplot size.

  • Interpret sharex/sharey=True as 3 (i.e., “turn all sharing on”) instead of 1 (integer conversion of True) (GH#51967ce3). This is more intuitive and matches convention elsewhere. Also allow specifying level 1 with 'labels' and level 2 with 'limits'.

  • Rename SubplotsContainer to simpler SubplotGrid and move definition to figure.py (@51967ce3).

  • Deprecate arbitrary __getattr__ override for SubplotGrid (@51967ce3). Instead have dedicated format, colorbar, legend, [alt|dual|twin][xy], panel[_axes], and inset[_axes] methods.

  • Deprecate scattershot Figure immutable/documented properties (@51967ce3). Really not necessary.

  • Remove ancient deprecated getters and setters for sharex, spanx, etc. once used with figure objects (@51967ce3).

  • Make CartopyAxes and BasemapAxes private and remove documentation (@25e759b0). These classes are just for internal implementation of different cartographic “backends” – behavior of public methods is the same for both. Instead just document proplot.axes.GeoAxes.

  • Rename Axes3D to ThreeAxes so that class name fits more nicely amongst other class names (@30a112bd).

  • Sync 3D axes figure background color with axes background to avoid weird misaligned white square behind axes (@30a112bd).

  • Rename RcConfigurator to Configurator (@5626bc88). Previous name was redundant and needlessly verbose (the c in rc already stands for “configuration”…).

  • Add rc['leftlabel.rotation'], rc['toplabel.rotation'], rc['rightlabel.rotation'], rc['bottomlabel.rotation'] settings, and make default row label rotation match y label rotation (@bae85113).

  • Rename image category settings to rc['cmap.inbounds'], rc['cmap.discrete'], rc['cmap.edgefix'], rc['cmap.levels'], and rc['cmap.lut'] (@a50d5264).

  • Rename confusing rc['text.labelsize'] and rc['text.titlesize'] settings to clearer rc['font.smallsize'] and rc['font.largesize'] with shorthands rc['font.small'] and rc['font.large'] (analogous to rc['font.size']) (GH#a50d5264). Previous names were bad because “label size” applies to more than just axis or tick labels and “title size” applies to more than just axes titles.

  • Rename rc['tick.ratio'] to rc['tick.widthratio'] and add missing rc['tick.width'] setting (@a50d5264).

  • Rename vague shorthands rc.alpha and rc.facecolor back to native rc['axes.alpha'] and rc['axes.facecolor'] and rename rc.linewidth and rc.color to rc['meta.width'] and rc['meta.color'] (@41b5e400). However axes can still be updated by passing alpha, linewidth, facecolor, and edgecolor to format, and now format supports arbitrary patch artist settings and aliases like lw, ec, fc, hatch, etc.

  • Treat rc['tick.label'] and rc['grid.label'] font size, color, and weight settings as synonyms (@a50d5264). In general the tick vs. grid distinction is not meaningful for text labels. However we often want different padding so still allow rc['tick.labelpad'] and rc['grid.labelpad'] to be distinct.

  • Rename proplot.config.Configurator.load_file to proplot.config.Configurator.load in order to match save (@1769d349).

  • Change the default Configurator save location from the home directory to the current directory and change the default filename to proplotrc (without the leading dot) (@41b5e400).

  • Rename obscure LinearSegmentedColormap, PerceptuallyUniformColormap, and ListedColormap to more intuitive/succinct ContinuousColormap, PerceptualColormap, and DiscreteColormap (@ade787f9). Important due to the “qualitative colormap” behaviors triggered when a DiscreteColormap is passed to plot commands (see features).

  • Following above change, rename LinearSegmentedNorm to simpler SegmentedNorm, rename Colormap argument to_listed to discrete, change listmode options from 'listed', 'linear' to 'discrete', 'continuous', and add filemode option (@ade787f9, @5ccd6c01).

  • Allow omitting the colormap name when instantiating colormap classes or using class methods like from_list (@ade787f9). This is more intuitive.

  • Capture colors passed to commands like contour and pcolor and use it to build qualitative DiscreteColormap maps (@6382cf91). This matches the behavior of xarray plotting utilities. No longer use color to change “edge color” of filled contours/grid boxes.

  • Set default linewidth to 0.25 when adding “edges” to filled contours (@6382cf91). This matches matplotlib behavior when passing edgecolor to a pcolor command.

  • Deprecate boxes and violins shorthands in favor of singular box and violin (@6382cf91). This feel analogous to existing bar and barh.

  • Treat 2D scatter arguments by iterating over columns and default-styling each column with the property cycle rather than unraveling 2D arguments into 1D arrays (@6382cf91). Can also iterate over s and c columns.

  • Rename the confusingly-capitalized Colors to get_colors and move to utils.py (@51d480da). This is not a “class constructor” – it just returns lists of colors.

  • Rename the show function keyword categories to include, consistent with the new ignore keyword (@c45d5fa1).

  • Change default rc['legend.facecolor'] to white instead of inheriting from axes background (@6382cf91). Also set default rc['legend.edgecolor'] to rc['meta.color'] (black by default) and have legend read from rc settings rather than setting default legend input arguments.

  • Control edge width for legend frames with ew or edgewidth rather than lw and linewidth to avoid conflict with feature that permits modifying legend handle properties (@6382cf91).

Features

  • Dynamically add classes that are “registered” by contructor functions to the top-level namespace (@4382a1b1). This is consistent with behavior of importing custom-ProPlot tickers, norms, etc. to top-level namespace. Now e.g. pplt.MultipleLocator or pplt.LogNorm are allowed.

  • Allow creating subplots with figure and either (1) subsequently calling subplots or (2) passing integers or subplot specs generated by GridSpec to add_subplot (@51967ce3). This is convenient for complex grids or mixed proj types.

  • Add consistent/intuitive aliases subplot and add_subplots for native matplotlib commands add_subplot and subplots (@51967ce3).

  • Add subplotgrid property to access a SubplotGrid after drawing subplots one-by-one (@fb83384f).

  • Implement physical-units left, right, top, bottom, wspace, and hspace spaces directly on the GridSpec rather than externally (@20502345). Now absolute spaces are always preserved when figure size changes even if tight layout is disabled.

  • Have GridSpec directly handle “panel slots” (@20502345). Adding panels to a figure adds row or column “panel slots” to the gridspec and subsequently indexing the gridspec ignores those slots.

  • Add tight layout “padding” arguments to GridSpec and add gridspec parameters as optional arguments to Figure (@20502345). When a gridspec is added to the figure the arguments are passed to the gridspec. This replaces matplotlib’s subplotpars and subplots_adjust.

  • Allow variable tight layout padding between subplot panels using wpad and hpad, analogous to wspace and hspace (@20502345). Previously this was fixed at rc['subplots.innerpad'].

  • Add pad keyword to legend, colorbar, and panel that controls local tight layout padding, analogous to space (@20502345). Previously this was fixed at rc['subplots.panelpad'].

  • Ensure wequal and hequal only apply to the main subplot rows and columns; always ignore panel and colorbar spaces (@20502345).

  • Improve default behavior in presence of ‘outer’ colorbars + legends when rc['subplots.tight'] is disabled (@20502345).

  • Add a format method for formatting every subplot in the figure when you don’t have a SubplotGrid available (@20502345). Also move internal implementation of figure-wide settings there. Figure-wide settings like suptitle can still be updated from Axes.format.

  • Permit mutability of SubplotGrid (@51967ce3). Power users may want to manipulate their own grids.

  • Permit 2d indexing of SubplotGrid with arbitrary gridspec geometry by looking up subplotspec indices (@51967ce3). Previously 2d indexing of SubplotGrid with complex geometry would just return a wrong result.

  • Issue warning message when users try fig.subplots_adjust() or pplt.figure(subplotpars=SubplotParams) and auto-disable and warn when matplotlib “tight layout” rc settings are toggled (@51967ce3).

  • Add nicer string representations of figures, gridspecs, subplotspecs, and axes clearly showing the geometry and layout (@51967ce3, @6382cf91).

  • Rename setting rc['abc.style'] to rc.abc (@a50d5264). Setting this to False still “turns off” labels, setting to True “turns on” labels with the default style 'a', and setting to a string “turns on” labels with this style.

  • Set default location for new axes panels to 'right', allowing for empty ax.panel_axes() calls (@51967ce3).

  • Convert valid keyword arguments to positional arguments for virtually all plotting functions rather than a subset (@6382cf91). This expands the use of the data keyword and permits a seaborn-like workflow (for example, ax.plot(x='x_key', y='y_key', data=xarray_dataset)).

  • Support pint.Quantity arguments by auto-applying setup_matplotlib with the quantity’s unit registry when a quantity is passed (@6382cf91).

  • Support pint.Quantity input for z coordinates (e.g., to ax.contourf) by stripping the units to prevent warning (@6382cf91).

  • Support xarray.DataArray arguments containing pint.Quantity arrays by accessing data rather than accessing .values (@6382cf91).

  • Apply pint.Quantity default unit labels to plots by formatting the units with the new rc.unitformat setting (@6382cf91).

  • Add rc['cmap.sequential'] = 'fire', rc['cmap.diverging'] = 'negpos', rc['cmap.cyclic'] = 'twilight', and rc['cmap.qualitative'] = 'flatui' settings to control the default sequential, diverging, cyclic, and qualitative cmaps, and add boolean sequential, diverging, cyclic, and qualitative keywords to select corresponding default cmaps (@6382cf91).

  • Add special qualitative cmap handling when colors=colors, qualitative=True, or cmap=pcolors.DiscreteColormap(...) – always apply DiscreteNorm (ignore and warn if user passed discrete=False), truncate or wrap colors if there are too many/not enough for the levels, and add default extremes with set_under or set_over depending on user extend (@6382cf91).

  • Select rc['cmap.diverging'] and apply DivergingNorm automatically based on input data, similar to xarray and seaborn (@6382cf91). This is controlled with autodiverging and the rc['cmap.autodiverging'] setting. It is also disabled when a cmap is explicitly passed (unless it is a known diverging cmap).

  • Add robust keyword argument and rc['cmap.robust'] = False setting to ignore outliers when selecting auto colormap ranges (GH#6382cf91). It can take the value True, a percentile range, or a 2-tuple percentile interval.

  • Improve matplotlib-proplot colormap translation by converting matplotlib.colors.ListedColormap to proplot.colors.DiscreteColormap only if it has fewer than rc['cmap.listedthresh'] levels (@ade787f9). This is critical in case users import cmaps from other projects.

  • Permit constructing property cycles with Cycle by passing color as keyword argument (@86a50eb2). This is matplotlib-like workflow.

  • Permit disabling property cycling with e.g. cycle=False, cycle='none', or cycle=(), and re-enabling the default with cycle=True (@86a50eb2).

  • Override set_prop_cycle to pass the input arguments through Cycle (@86a50eb2). Features are a superset and this also lets me cache the cycler for comparison with on-the-fly inputs.

  • Add shorthands rc['grid.width'], rc['grid.style'], rc['gridminor.width'], and rc['gridminor.style'] for the respective linewidth and linestyle settings (@a50d5264)

  • Permit “registering stuff” by passing files or objects to register_cmaps, register_cycles, register_colors, and register_fonts rather than forcing users to use the .proplot folder (@ad999e95).

  • Support case insensitivity when calling matplotlib’s unregister_cmap by improving ColormapDatabase so it derives from a MutableMapping rather than dict (@ade787f9).

  • Make Configurator a MutableMapping subclass and change iteration behavior to loop over keys, not item pairs (@5626bc88).

  • Rename get to find (@e8559f3d). Confusing since get didn’t accept a “fallback” second positional argument. Now get is the “dictionary-like” inherited method.

  • Add public changed property to display a dictionary of settings changed from proplot defaults (@41b5e400).

  • Add public user_file and user_folder static methods for displaying folder locations (@b11d744a).

  • Support XDG directories for proplot config files on Linux (GH#204, @5e6367dc). Also accept the file ~/.proplotrc and the folder ~/.proplot on all systems and raise a warning if duplicate valid files or folders are found.

  • Make rc_proplot and rc_matplotlib containers of proplot/matplotlib settings part of the public API (@a50d5264).

  • Allow conversion of numeric inputs with units using e.g. pplt.units(num, 'in', 'cm') (@88f3dc88).

  • Add more intuitive rc['grid.labelpad'] and rc['tick.labelpad'] as aliases for rc['grid.pad'] and rc['tick.pad'] (@a50d5264).

  • Add line and linex command aliases for plot and plotx (@6382cf91). This is more intuitive.

  • Add stepx and stemx commands analogous to plotx, and add histh, boxploth (shorthand boxh), and violinploth (shorthand violinh) commands analogous to barh (@6382cf91).

  • Exclude out-of-bounds data when determining automatic y (x) axis limits when x (y) limits have been explicitly set for plot and scatter plots (@6382cf91). Controlled by the rc['axes.inbounds'] property, analogous to rc['cmap.inbounds'] used for cmap scaling. This feature leverages proplot’s input standardization.

  • Let 1D plotting commands iterate over columns of 2D x and y coordinate arrays instead of only 2D y coordinate arrays (@6382cf91.)

  • Only modify heatmap major and minor tick locations if the default tickers are active (GH#6382cf91).

  • Support more artist synonyms throughout plotting overrides, e.g. ec for edgecolor, lw for linewidth, fc and fillcolor for facecolor (@6382cf91). This expands matplotlib synonyms.

  • Support passing positional fifth-argument colors to barbs and quiver, just like scatter (@6382cf91). This was previously not possible.

  • Use default luminance of 90 rather than 100 for auto-colormaps generated for barb, scatter, and streamline plots (@6382cf91).

  • Support automatic labels for tricontour and tripcolor plots alongside the more common contour and pcolor. (@6382cf91).

  • Add rasterize keyword to colorbar so that colorbar solids rasterization can be turned on (proplot turns off by default) (@6382cf91).

  • Add edgefix keyword to colorbar to control colorbar-solid edges and use shared _fix_edges function (@6382cf91).

  • Add location keyword as alternative to loc for legend and colorbar funcs (@5cb839fd).

  • Add alphabetize keyword to legend to optionally alphabetize handles by their labels (@6382cf91).

  • Apply auto-detected xarray and pandas legend/colorbar titles even if the legend/colorbar are not drawn on-the-fly (GH#6382cf91).

  • Add rc['colorbar.facecolor'] and rc['colorbar.edgecolor'] properties analogous to legend properties for controlling frame (@6382cf91).

  • Treat singleton lists and tuple legend input same as scalar handle input, i.e. never triggers “centered row” specification (@6382cf91).

  • Support auto-detection of tuple-grouped legend handle labels when labels not passed explicitly (@6382cf91).

  • Automatically pull out grouped tuples of artists passed to legend if they have differing labels (@6382cf91). This is useful for passing error shading to legend.

  • Silently ignore non-artist and non-container legend input – e.g., ignore the bins and values returned by hist (@6382cf91).

  • Allow list-of-list “centered row” legend specification with e.g. [h, [h1, h2, h3]] (i.e., mixed list and non-list input) (@6382cf91).

  • Permit partial specification of legend labels, e.g. [h1, h2] paired with ['label', None] overrides the artist label for h1 but uses the artist label for h2 (@6382cf91).

  • Interpret all native matplotlib legend spacing arguments (e.g., borderpad and columnspacing) with units (@6382cf91).

  • Make proplot.axes.Axes.colorbar capture matplotlib-native format keyword as alias for formatter and ticklabels (GH#262).

  • Support list-of-string parametric coordinates and format on-the-fly colorbar ticks with those string labels (@02fbda45). This may be a common use case for parametric plots.

  • Add ignore keyword to omit specific show_cmaps, show_cycles, and show_colors categories from the tables (GH#c45d5fa1).

  • Allow case-insensitive specification of show_cmaps, show_cycles, and show_colors categories and never ignore input colormaps even if they match an ignored name like 'jet' (GH#c45d5fa1).

  • Support restricting cartopy bounds in cartopy 0.19 by leveraging the ylim Gridliner property (@e190b66c).

  • Add xlabelpad, ylabelpad, xticklabelpad, yticklabelpad keywords to format and read and apply changed rc['axes.labelpad'] (@e7d86b8f).

  • Add support for “minor” radial and azimuthal gridlines in proplot.axes.PolarAxes.format (@59c85f0e).

  • Add thetagrid, rgrid, thetagridminor, and rgridminor keys to proplot.axes.PolarAxes.format to toggle gridlines, and read and apply changed toggles from rc settings – consistent with Cartesian axes (@59c85f0e).

  • Add title_kw, suptitle_kw, leftlabels_kw, rightlabels_kw, toplabels_kw, and bottomlabels_kw to proplot.axes.Axes.format for arbitrarily modifying label text objects – consistent with xlabel_kw and ylabel_kw used for proplot.axes.CartesianAxes.format (@6382cf91).

Bug fixes

  • Fix issue with unpacking iterables inside return statements in python < 3.8 (GH#268) by Eli Knaap.

  • Fix issue where auto layout algorithm recurses in popup backends (@51967ce3).

  • Fix issue where auto layout algorithm blows up in mpl 3.4+ (@51967ce3).

  • Fix issue where tight layout is effectively deactivated in mpl >= 3.4 due to set_position automatically calling set_in_layout(False) (@20502345).

  • Fix issue where thin pyplot-function wrappers e.g. isinteractive do not return results (@e62e3655).

  • Fix issue where proplot.config.Configurator.save preserves the '#' in HEX strings, resulting in values that cannot be read back in with proplot.config.Configurator.load (@41b5e400).

  • Fix issue where deprecated aspect subplots argument is ignored (@70a8b87d).

  • Fix issue where explicit user-input width is ignored when creating colorbars or panels and gridspec slot already exists (@51967ce3).

  • Fix bug where the default space selection failed to use the figure-wide share setting (@51967ce3).

  • Fix bug where the reference subplot aspect ratio not preserved in presence of complex geometry with panels (@51967ce3).

  • Fix issue where a-b-c labels are removed in presence of 'top' panels with titleabove=True (@7873d5e0).

  • Fix issue where ‘aligned’ labels fail in recent matplotlib versions due to private matplotlib API change (@51967ce3).

  • Fix issue where cmap.reverse() returns strange monochrome colormaps when channel values are specified by functions (e.g., cubehelix) due to loop scope overwriting a non-local lambda function variable (@ade787f9).

  • Fix issue where _restrict_inbounds fails for reversed/descending axis limits (@6382cf91).

  • Fix issues where cartopy minor gridlines are toggled on when map bounds are changed and basemap map boundary props cannot be modified (@c1f1a7de).

  • Turn off _restrict_inbounds for geographic projections to prevent issue where lon/lat coordinates are compared to map coordinates (@6382cf91). In-bounds colormap scaling for geographic projections may be added in a future version.

  • Fix issue where error indications do not ignore masked values in masked numpy arrays (@6382cf91).

  • Fix issue where error shading objects are grouped into lists rather than tuples and are not combined into single handle when passed to legend (GH#260).

  • Fix issue where parametric ignores interp when selecting DiscreteNorm colormap levels (@152a3a81).

  • Fix issue where tight layout padding is not respected for panels created from twin axes by ensuring panel parent is always the main axes (@e7d86b8f).

  • Fix obscure bug where axis labels in presence of mixed panels and non-panels are improperly shared (@06666296).

  • Stop overwriting user-input spineloc when combined with user-input spine bounds (@e7d86b8f).

  • Include children of key when triggering complex synced settings (e.g., now we trigger application of rc['tick.widthratio'] when either rc['tick.width'] or rc['meta.width'] are changed) (@5626bc88).

Internals

  • Convert all plotting wrappers to dedicated overrides of individual functions in PlotAxes class (@6382cf91). This massively simplifies the internals and makes learning and adopting proplot much easier for users.

  • Implement interpretation of physical units and “panel” accounting directly on the GridSpec instead of cumbersome hidden methods in Figure (@20502345).

  • Validate all setting assignments to Configurator using a new rc_proplot dictionary, analogous to rcParams (GH#109, @5626bc88). This helps prevent bugs.

  • Move text, legend, and colorbar overrides to base Axes class separate from PlotAxes (@6382cf91).

  • Automatically redirect all internal plotting calls to native matplotlib methods (@6382cf91). This significantly improves stability.

  • Move register_colors internals from config.py to colors.py by breaking up into smaller functions (@ad999e95).

  • Move _version to a separate dependencies.py file and allow more versatile comparison operations (@8806631d).

  • Efficiently impose GeoAxes defaults latlon=True and transform=PlateCarree() in 90% fewer lines by looping over funcs.

Documentation

  • Move all plotting wrapper documentation to dedicated methods and remove references to wrappers in User Guide and Getting Started.

  • Embed proplot.figure.Figure documentation inside proplot.ui.subplots instead of just referencing it.

  • Embed proplot.axes.Axes.format documentation inside format documentation for subclasses instead of just referencing it.

  • Document the relative font size scalings with a table in text (@6382cf91).

ProPlot v0.7.0 (2021-07-11)

Deprecated

  • Remove v0.6.0 renamed classes (e.g. ProjAxes) from top-level namespace (@442e6aa6). These were kept available just for documentation. The renamed functions shade, saturate, and inline_backend_fmt remain available.

  • Change default rc['savefig.transparent'] back to False (GH#252). Dubious justification for True in the first place, and makes default PNG proplot figures unreadable wherever “dark mode” is enabled.

  • Rename SciVisColor colormaps from Blue1, Blue2, etc. to plurals Blues1, Blues2, etc. to avoid name conflict with open-color colors (@8be0473f). Requesting the old names (case-sensitive) redirects to the new names (@3f0794d0). This permits making monochromatic open-color maps with e.g. plot.Colormap('blue9') and feels more consistent with ColorBrewer convention of using plurals like Blues, Reds, etc.

  • Shuffle various SciVisColor colormap names to make them consistent/succinct. Make Browns1 the most colorful/vibrant one, just like Greens1 and Blues1; split up the RedPurple maps into Reds and Purples; and add the Yellows category from the Oranges maps (@8be0473f). Requesting the old names (case-sensitive) redirects to the new names (@3f0794d0).

  • Add rc['image.discrete'] options and discrete keyword for toggling DiscreteNorm application, and disable by default for imshow, matshow, spy, hexbin, and hist2d plots (GH#233, @5a7e05e4). Also make hexbin and hist2d behavior with discrete=True more sane by using maximum possible counts for autoscaling, and change DiscreteNorm argument extend to more intuitive name unique.

  • Rename rc['subplots.pad'] and rc['subplots.axpad'] to more intuitive rc['subplots.outerpad'] and rc['subplots.innerpad'] (@3c7a33a8). Also rename Figure keywords.

  • Rename width and height subplots keyword args to figwidth and figheight to avoid confusion with refwidth/refheight (@12d01996). Will accept old keyword args without warning since they are used heavily.

  • Rename aspect, axwidth, and axheight keyword args to more intuitive refaspect, refwidth, and refheight (@12d01996). Will accept old keyword args without warning since they are used heavily.

  • Rename abovetop keyword for moving title/abc labels above top panels, colorbars, and legends to rc['title.above'] (@9ceacb7b). Example usage: ax.format(title='Title', titleabove=True).

  • Rename the proplot.colors.PerceptuallyUniformColormap.from_color keywords shade, fade to luminance, saturation keyword (@3d8e7dd0). These can also be passed to Colormap when it is called with positional arguments.

  • Rename seldom-used Figure argument fallback_to_cm to more understandable mathtext_fallback (GH#251).

  • Reduce default rc['savefig.dpi'] to 1000 (@bfda9c98). Nature recommends 1000, Science recommends “more than 300”, PNAS recommends 1000–1200. So 1000 is fine.

  • Increase default rc['colorbar.insetpad'] to avoid recurring issue where ticklabels run close to the background patch (@f5435976)

  • Use proplot TeX Gyre fonts with use_style styles unless specified otherwise (@6d7444fe). Styles otherwise build on matplotlib defaults.

  • When using medians=True or means=True with indicate_error plot simple error bars by default instead of bars and “boxes” (@4e30f415). Only plot “boxes” with central “markers” by default for violin plots (@13b45ccd).

  • legend_extras no longer returns the background patch generated for centered-row legends (GH#254). This is consistent with colorbar_extras not returning background patches generated for inset colorbars. Until proplot adds new subclasses, it makes more sense if these functions only return Legend and Colorbar instances.

Features

  • Add the remaining commonly-used backend-related pyplot functions ion, ioff, isinteractive, and switch_backend to the top-level proplot namespace (@cd440155). This avoids forcing users to import pyplot inside a proplot session (the remaining pyplot functions are related to the “non-object-oriented” workflow, which proplot explicitly discourages).

  • Add support for local proplotrc files in addition to “hidden” .proplotrc files with leading dot (@8a989aca).

  • Add minimal support for “3D” Axes3D axes (GH#249). Example usage: fig.subplots(proj='3d').

  • Add wequal, hequal, and equal options to still use automatic spacing but force the tight layout algorithm to make spacings equal (GH#215, GH#64) by Zachary Moon.

  • Determine colormap levels using only in-bounds data if the x or y axis limits were explicitly set (GH#209). Add inbounds apply_cmap keyword and rc['image.inbounds'] setting to control this.

  • Allow calling proplot.colors.PerceptuallyUniformColormap.from_hsl by passing hue, saturation, or luminance to Colormap without any positional arguments (@3d8e7dd0).

  • Allow passing alpha, luminance, saturation to Colormap as lists to be applied to each component cmap (@3d8e7dd0).

  • Add convenient shorthands for channel references throughout colormap functions – e.g. h for hue, l for luminance, etc. (@3d8e7dd0).

  • Add the 'Flare' and 'Crest' seaborn colormaps (@14bc16c9). These are seaborn’s color cycle-friendly alternatives to existing maps.

  • Add the shift_hue function analogous to scale_saturation and scale_luminance (@67488bb1).

  • Add the to_hex function and make all color-manipulation funcs return HEX strings by default (@67488bb1). Otherwise scatter throws warnings.

  • Use 90 as the default luminance when creating monochromatic colormaps with to_listed set to True (as when Cycle calls Colormap; @3d8e7dd0).

  • Add plotx and scatterx commands that interpret plotting args as (y, x) rather than (x, y), analogous to areax (GH#258).

  • Add support for indicate_error horizontal error bars and shading for horizontal plotting commands barh, plotx, and scatterx (GH#258).

  • Add support for ax.plot_command('x_key', 'y_key', data=dataset) for virtually all plotting commands using standardize_1d and standardize_2d (GH#258). This was an existing plot feature.

  • Add support for the plotting style ax.plot(x1, y1, fmt1, x2, y2, fmt2, ...) as allowed by matplotlib (GH#258).

  • Add absolute_width keyword to bar_extras to make width argument absolute (GH#258). Remains False by default.

  • Use “sticky” edges in x-direction for lines drawn with plot() and in y-direction for lines drawn with plotx() (GH#258). This eliminates padding along the “dependent” axis when limits are not specified, similar to histograms and barplots and matching a feature we previously added to fill_between (GH#166).

  • Add support for “stacked” plots to vlines and hlines (GH#258).

  • Add stack as alternative to stacked for bar and area plots (@4e30f415). Imperative keywords are better.

  • Allow passing e.g. barstds=3 or barpctiles=90 to request error bars denoting +/-3 standard deviations and 5-95 percentile range (@4e30f415).

  • Add singular indicate_error keywords barstd, barpctile, etc. as alternatives to barstds, barpctiles, etc. (@81151a58). Also prefer them in the documentation.

  • Permit different colors for boxplot and violinplot using color lists (GH#217, GH#218) by Mickaël Lalande. Also allow passing other args as lists (@4e30f415).

  • Allow passing means=True to boxplot to toggle mean line (@4e30f415).

  • Allow setting the mean and median boxplot linestyle with (mean|median)(ls|linestyle) keywords (@4e30f415).

  • Automatically set fill=True when passing a fill color or color(s) to boxplot_wrapper (@4e30f415).

  • Allow updating vlines and hlines styling with singular color and linestyle and all of their aliases (GH#258).

  • Allow updating axes fonts that use scalings like 'small' and 'large' by passing fontsize=N to format (GH#212).

  • Add titlebbox and abcbbox as alternatives to titleborder and abcborder for “inner” titles and a-b-c labels (GH#240) by Pratiman Patel. Borders are still used by default.

  • Allow putting title and abc in the same location – the title and label are simply offset away from ech other (GH#402214f9). Padding between them is controlled by the new param rc['abc.titlepad'].

  • Add new rc['suptitle.pad'], rc['leftlabel.pad'], rc['toplabel.pad'], rc['bottomlabel.pad'], rc['rightlabel.pad'] settings to control padding used when aligning super labels (@402214f9). These can also be passed to format and applied locally. The new defaults increase super title padding by a bit.

  • More robust interpretation of rc['abc.style'] – now match case with first 'a' or 'A' in string, and only replace that one (GH#201).

  • Interpret fontsize-relative legend rc params like legend.borderpad with 'em' as default units rather than 'pt' (@6d98fd44).

  • Add rc.basemap setting for changing the default backend (@c9ca0bdd). If users have a cartopy vs. basemap preference, they probably want to use it globally.

  • Add rc['cartopy.circular'] setting for optionally disabling the “circular bounds on polar projections” feature (@c9ca0bdd).

  • Support the standard aliases 'ls', 'linestyle', 'linestyles', etc. in Cycle calls (@3d8e7dd0).

  • Add queue keyword to colorbar and legend to support workflow where users successively add handles to location (GH#254).

  • Add nozero keyword arg to apply_cmap to remove the zero contour from automatically generated levels (@10e0f13b). Example usage: ax.contour(x, y, z, nozero=True).

  • Add positive and negative keyword args to apply_cmap for requesting automatically-generated all-positive or all-negative levels (@335d58f4). Example usage: ax.contourf(x, y, z, positive=True).

  • Add rotation keyword to colorbar_wrapper for rotating colorbar tick labels, like xrotation and yrotation (@2d835f20).

  • Add tickdir and tickdirection keywords to colorbar_wrapper for controlling tick style, like xtickdir and ytickdir (@f377f090).

  • Allow specifying labels for auto-generated legends using a 'labels' key in a legend_kw keyword argument (@a11d1813).

  • Replace legends drawn in the same location by default rather than drawing two legends on top of each other (GH#254).

  • Use Artist labels for the default list-of-artist colorbar tick labels if values was not passed – and if labels are non-numeric, rotate them 90 degrees for horizontal colorbars by default (@ed8e1314). Makes the choice between “traditional” legends and “colorbar-style” legends more seamless.

  • Use same default-level generation algorithm for contour plots without colormaps as for all other colormap plots (@10e0f13b). Makes automatically-generated solid-color contours and colormap-style contours identical.

  • Add suffix '_copy' to colormaps converted with to_listed and to_linear_segmented to avoid accidental overwriting (@91998e93).

  • If available, use rc['pcolormesh.snap'] to repair overlap in transparent colorbar solids rather than manual-blending workaround (@c9f59e49).

  • Add xmin, xmax, ymin, and ymax keyword args to format as alternatives to xlim and ylim (@ae0719b7). Example usage: ax.format(xmin=0) as opposed to ax.format(xlim=(0, None)).

  • Allow passing full “side” names to lonlabels and latlabels rather than abbreviations, e.g. 'left' instead of 'l' (@a5060f67). This is more consistent with rest of package.

  • Set default transform to ccrs.PlateCarree when calling matplotlib.axes.Axes.fill on CartopyAxes (GH#193). This is more consistent with rest of package.

Bug fixes

  • Fix 3 fatal issues preventing proplot import and basic usage in matplotlib >= 3.4 (GH#251).

  • Fix deprecation warnings associated with matplotlib 3.4 refactoring of subplot classes (GH#251).

  • Fix deprecated reference to rc.fallback_to_cm in matplotlib >= 3.3 (GH#251).

  • Fix IndexFormatter deprecation warning in matplotlib >= 3.3 by replacing with proplot-local copy (GH#251).

  • Fix deprecation warning in matplotlib >= 3.3 – add extend as mappable attribute rather than passing it to colorbar() (@a23e7043).

  • Fix issue where figures with fixed-aspect axes don’t scale properly in matplotlib >= 3.3 (GH#210, GH#235).

  • Fix issue where “twin” (“alternate”) axes content always hidden beneath “parent” content due to adding as children (GH#223).

  • Fix issue where default layout in complex subplot grids with non-adjacent edges is incorrect (GH#221).

  • Fix issue where apply_cycle fails to merge mean-uncertainty legend handles due to presence of placeholder labels (@4e30f415).

  • Fix issue where standardize_1d inappropriately infers legend entries from y-coordinate metadata rather than column metadata (@4e30f415).

  • Fix issue where barb and quiver cannot accept 1D data arrays (GH#255).

  • Fix issue where cannot set rc.style = 'default' (GH#240) by Pratiman Patel.

  • Fix issue where get_legend returns None even with legends present (GH#224).

  • Fix issue where new child axes reset row/col label settings (@f32d9703).

  • Fix issue where DataArray string coordinates are not extracted from container before applying as tick labels (GH#214).

  • Fix issue where cannot set extend other than 'neither' for scatter colorbars (GH#206).

  • Fix issue where hexbin ignores vmin and vmax keywords (GH#250).

  • Fix issue where parametric plot x axis is reversed (@3bde6c47).

  • Fix issue where e.g. ax.area(x, 0, y2, negpos=True has positive colors below x-axis and negative above x-axis (GH#258).

  • Fix issue where “negpos” plots ignore edgecolor because they pass color rather than facecolor to plotting commands.

  • Fix issue where cannot have datetime labels on area plots (GH#255).

  • Fix issue where default orientation of barh vertical axis is reversed (@258).

  • Fix issue where hist with xarray.DataArray or pandas.Dataframe input causes erroneous axis labels; use labels for legend instead (GH#195).

  • Fix issue where axis is accidentally inverted for histogram plots (GH#191).

  • Fix issue where [xy]minorlocator=1 is not allowed (GH#219).

  • Fix issue where inner titles ignore axes-local titlepad (@14f3d0e3).

  • Fix issue where we again fail to sufficiently pad title above tick marks with tick marks on top x-axis (@402214f9).

  • Fix issue where non-Cartesian heatmap errors rather than warns (GH#238).

  • Fix issue where labels=True with no contours causes error (GH#238).

  • Fix issue where Cycle fails to register new names and fails to display in show_cycles (@94ffc1dc, @4a7a3c79).

  • Fix issue where proplot ignores set_under and set_over values when translating matplotlib colormap classes to proplot subclasses (GH#190).

  • Fix issue where DiscreteNorm does not account for set_under and set_over colors distinct from adjacent in-bounds colors (GH#190).

  • Fix issue where proplot fails to detect legend entries for “outer” legends (GH#189).

  • Fix issue where list-of-list-style legend() handle and label input fails completely (@a298f81f). This input style is used to specify “centered” legend rows.

  • Fix error message when no legend handles are found (@2c6bf3e2).

  • Fix issue where multiple-artist legend entries (e.g., for lines indicating means and shading indicating uncertainty) are accidentally truncated (@a11d1813).

  • Fix issue where numeric zero cannot be applied as legend label (@02417c8c).

  • Fix issue where simple pandas.DataFrame.plot calls with legend=True fail (GH#254, GH#198).

  • Fix unnecessary restriction where users can only draw <2 “alt” axes and clean up the alt[xy] and dual[xy] internals (GH#226).

  • Fix matplotlib bug where altx and alty reset the minor locator of the shared axis to AutoMinorLocator even if the axis scale is 'log' (@2f64361d).

  • Fix issue where axis coordinates are incorrect when violinplot or boxplot receive non-DataFrame input (@b5c3ec4c).

  • Fix issue where indicate_error cannot accept 1D error bounds (@ef2d72cd).

  • Fix issue where show_cmaps cannot display reversed colormaps (@2dd51177).

  • Fix issue where 'grays_r' translated to 'greys' (@074c6aef).

  • First reverse, then shift cmap_r_s colormaps (@e5156294).

  • Fix obscure parametric bug where numpy.stack tries to make nested ragged arrays from parametric coords (@b16d56a8).

  • Fix issue where where SubplotSpec.get_active_rows_columns returned incorrect number of “active” rows and columns (@5cf20b84).

  • For rc lookup with context=True, use most restrictive search mode rather than least. Otherwise ax.format() calls inside context blocks can be overwritten with the default rc values in subsequent ax.format() calls (@8005fcc1).

Internals

  • Refactor massive standardize_(1d|2d) and (cmap|cycle)_changer wrappers to break things into manageable chunks (GH#258, @6af22567, @d3352720).

  • Refactor colorbar and legend methods and their massive wrappers to clean things up and expand the “queueing” feature beyond wrappers (GH#254).

  • Add prefix 'proplot_' to registered axes “projections” (@be7ef21e). More clear and guards against conflicts with external packages and other mpl versions.

  • Add system for processing flexible keyword arguments across different commands to internals/__init__.py. Analogous to mpl _alias processing.

Documentation

  • Finally use pplt as the recommended abbreviation: import proplot as pplt.

  • Major clean up of “Why ProPlot?” page and user guide pages.

  • Fix incomplete cmap.from_file docstrings (@54f1bc7c).

  • Rename “Changelog” to “What’s New?” and list all contributors in “About the Authors”.

  • Rename public/documented funcs ending in _wrapper to ending in _extras to avoid implication they are the only funcs wrapping those commands (@d1e1e85b).

  • Rename public/documented func make_mapping_array to private function, following lead of matplotlib’s makeMappingArray (@66ae574b).

  • Rename public/documented funcs cmap_changer and cycle_changer to apply_cmap and apply_cycle (@86f7699a).

ProPlot v0.6.4 (2020-06-13)

Features

  • Change autoformat from a Figure keyword argument into the rc.autoformat rc setting (@3a7e5a7c).

  • Combine shading and lines when drawing on-the-fly legends with indicate_error shading using tuple of fill_between, plot handles, and have shadelabel and fadelabel instead create separate entries only when passed (GH#187).

Bug fixes

  • Fix major issue where calling legend() without any handles triggers error rather than using default handles (GH#188).

  • Fix issue where on-the-fly colorbar labels were ignored (@a642eeed).

  • Stop overwriting existing axis labels when autoformat=True and DataArrays or DataFrames passed to plotting command (@76c7c586).

  • Support single-level contours with colormap colors (GH#182).

  • Support changing line width, line style, and color properties for barb, quiver, streamplot, matshow, spy, and hist2d plots (GH#177).

  • Use rc['patch.linewidth'] for default bar edge width, stop setting default histogram plot linewidth to zero, and set rc['patch.linewidth'] to 0.6 to match proplot’s default line width for lines, axes edges, and hatches (GH#186).

ProPlot v0.6.3 (2020-06-02)

Bug fixes

  • Fix issue where proplot import fails if cartopy is not installed (@e29d49e8).

ProPlot v0.6.2 (2020-06-02)

Deprecated

  • Remove Figure setters like set_sharex, replace with read-only properties (@7b455008). These did not work and did not add critical functionality.

Features

  • Add autoformat as standardize_1d and standardize_2d keyword arg, so inheriting labels can be turned on/off for individual plots (@61258280).

  • Share initial limits/scales/tickers from parent subplots when making new panels (@cf0d5d4e).

  • Permit negative “cuts” with cut to expand the neutral zone of a diverging cmap (@94548d09).

  • Add valid format arguments to altx and alty, including [x|y]lim (@734f5940).

  • Pass string dual[x|y] arguments like 'inverse' through the Scale constructor (@413e1781).

  • Add 'dms' locator and formatter, for degree-minute-second labels without cardinal direction indicators (@1b180cd2).

  • Add “tau” formatter (@fc6a9752).

  • Restore default rc['title.pad'] to matplotlib value, stop artificially bumping up rc['title.pad'] for “inner” titles (@7de1c1f4).

  • Make custom formatters like SciFormatter classes rather than functions returning FuncFormatter (@7591f474).

Bug fixes

  • Various improvements to auto-figure sizing with Qt backend and when calling print_figure (@db4e48d5, @82457347, @744d7d37).

  • Suppress warning when matplotlibrc contains non-style param (@4a0c7f10).

  • Fix fatal standardize_2d error when autoformat=False (GH#181)

  • Fix issue where Colormap(..., alpha=alpha) made persistent changes to the original registered colormap (@cb24ea51).

  • Prevent matplotlib deprecation warning by removing set_smart_bounds dependency and improving axis scale transforms (@432576d8).

  • Fix panel sharing issue in presence of stacked or multiple panels (@28eaf0ca).

  • Fix geographic feature toggling, zorder bugs (@acf0d5d4, @ea151b25).

  • Fix hist bug due to bar(..., width=width) now being relative to the x step size (@e32ed0bc).

  • Fix bug where savefig receives Path instead of string (GH#176).

Documentation

ProPlot v0.6.1 (2020-05-20)

Bug fixes

  • Fix issue where cartopy version checking fails if cartopy is not installed (@86cd50b8).

  • Fix issue where “tight” layout of geographic plots was broken in pre-v0.18 cartopy (@72cb93c6).

  • Fix issue where gridline coverage was incomplete in some zoomed-in projections (@458c6d7c).

  • Fix issue where basemap minor gridlines did not update when major gridlines were updated (@427326a7).

ProPlot v0.6.0 (2020-05-20)

Deprecated

  • Remove the geoaxes and geogrid rc settings (GH#168). Gridline settings are now controlled with grid.

  • Remove the lonstep and latstep settings – we now use LongitudeLocator and LatitudeLocator to select “nice” gridline locations even when zoomed in (GH#168)

  • Change default rc settings closer to matplotlib, including margins and line width (GH#166, @f801852b). Many were changed for no good reason.

  • Change default line style for geographic gridlines from ':' to '-' and match style from primary gridlines (GH#166, @f801852b).

  • Rename add_errorbars to indicate_error and rename various keyword args (GH#166, @d8c50a8d).

  • Remove 'rgbcycle' setting (GH#166, @6653b7f0).

  • Deprecate support for “parametric” plots inside plot, instead use parametric (@64210bce).

  • Change units units keyword argument to more natural dest (@62903b48).

  • Remove the public objects normalizers, locators, formatters, cartopy_projs, basemap_kwargs, cmaps, colors, and fonts (GH#149).

  • Drop support for .xrgb and .xrgba files (@4fa72b0c). Not sure if any online sources produce these kinds of files.

  • Drop support for .rgba files, but optionally read 4th opacity column from .rgb and .txt files (@4fa72b0c).

  • Stop reversing the 'Spectral' colormap when ProPlot is imported (GH#149, @ce4ef6a0).

  • Remove 'Blue0' SciVisColor colormap (GH#149, @7cb4ce0f). It was odd man out in the table, and not even really perceptually uniform.

  • Remove custom ProPlot cycles – these should be thought out much more carefully (@43f65d17).

  • Remove “crayola” colors and clean up the register_colors algorithm (GH#149, @8922d6de). Crayola color names less intuitive than XKCD.

  • Use 'cmap_s' instead of 'cmap_shifted' to quickly get a 180 degree-shifted colormap, similar to 'cmap_r' (GH#149, @da4ccb08).

  • Rename GrayCycle colormap to MonoCycle to more accurately reflect colormap design origins (GH#149, @d67e45bf).

  • Rename rc_configurator and subplot_grid to RcConfigurator and SubplotsContainer to match capitalized class naming convention (GH#149).

  • Rename MidpointNorm to more intuitive DivergingNorm, and make “fair” color scaling the default behavior (@2f549c9).

  • Rename XYAxes to CartesianAxes, GeoAxes to CartopyAxes, and ProjAxes to GeoAxes (GH#149, @4a6a0e34).

  • Rename BinNorm to DiscreteNorm and fix issues with diverging norm color scaling (GH#149, @98a976f1).

  • Rename ColorDict to ColorDatabase, CmapDict to ColormapDatabase (GH#149, @9d7fd3e0).

  • Rename concatenate to append, updated to copy, truncated to truncate, and punched to cut (GH#149, @e1a08930). The old method names remain with a deprecation warning.

Features

  • Add SigFigFormatter (GH#149, @da6105d2) and SciFormatter (GH#175, @c43f7f91) axis formatters.

  • Make default areax and areay bounds “sticky”, similar to histograms and barplots (GH#166).

  • Use _LonAxis and _LatAxis dummy axes with custom LongitudeLocator and LatitudeLocator to control geographic gridlines (GH#168).

  • Add 'dmslat' and 'dmslon' as formatters for cartopy projections, along with dms format keyword argument. This labels points with degrees/minutes/seconds when appropriate (GH#168).

  • Support “minor” geographic gridlines with the gridminor keyword arg and existing gridminor settings (GH#168). Default locator used for minor gridlines is AutoMinorLocator.

  • Add loninline, latinline, and rotatelabels keywords for controlling cartopy gridliner behavior (GH#168).

  • Add proplot.config.RcConfigurator.save and proplot.config.RcConfigurator.from_file methods (GH#167, @e6dd8314).

  • Increase default rc['savefig.dpi'] to 1200, matching recommendations from academic journals (GH#167, @c00e7314). Also add detailed discussion to user guide.

  • No longer distinguish between “quick” settings and proplot’s “added” settings (GH#167, @e6dd8314). Quick settings, added settings, and matplotlib settings can all have “children” so the distinction no longer makes sense.

  • Add opacity-preserving functions to_rgba and to_xyza, plus set_alpha for changing alpha channel of arbitrary color (GH#171, @81c647da).

  • Add to set_alpha the ability to create an opacity gradation, rather than just an opacity for the entire colormap (GH#171, @4583736).

  • Support passing colormap objects, not just names, to show_cmaps and show_cycles (GH#171, @7f8ca59f).

  • Add options to indicate_error for adding shading to arbitrary plots (GH#166, @d8c50a8d). Also support automatic legend entries for shading and ensure indicate_error preserves metadata.

  • Wrap pcolorfast just like pcolor and pcolormesh are wrapped (GH#166, @50a262dd).

  • Add negpos feature to bar_wrapper and new rc.negcolor and rc.poscolor rc keyword arguments (GH#166, @ab4d6746).

  • Support vlines and hlines flexible arguments and add negpos feature (GH#166, @1c53e947, @e42ee913).

  • Support cartopy 0.18 locators, formatters, deprecations, and new labelling features (GH#158).

  • Support building a colormap and DiscreteNorm inside scatter, just like contourf and pcolormesh (GH#162).

  • Add rc['geogrid.labelpad'] and rc['geogrid.rotatelabels'] settings for cartopy gridline labels (GH#158).

  • Support more AutoFormatter features on SimpleFormatter (GH#152, @6decf962).

  • Support drawing colorbars with descending levels (GH#149, @10763146)

  • Add support for matplotlib stylesheets with use_style function and style rc param (GH#149, @edc6f3c9).

  • Add categories keyword arg to show_cmaps and show_cycles (GH#149, @79be642d).

  • Hide bad colormaps like 'jet' from the show_cmaps table instead of deleting them outright, just like CSS4 colors (GH#149, @ce4ef6a0).

  • Draw show_colors table as single figure with category labels, similar to show_cmaps (GH#149, @c8ca2909).

  • Make 'Grays' and 'Greys' synonyms for the same ColorBrewer colormap (GH#149, @da4ccb08).

  • Permit drawing “outer” axes and figure legends without explicitly passing handles (GH#149, @a69b48eb). Figure legends use the handles from all axes.

  • Add to_listed and to_linear_segmented methods for handling conversions (GH#149, @e1a08930).

  • Permit merging mixed colormap types LinearSegmentedColormap with PerceptuallyUniformColormap (@972956b1).

  • Include the alpha channel when saving colormaps and cycles by default (GH#149, @117e05f2).

  • Permit 8-character hex strings with alpha channels when loading colormaps and color cycles from hex files (GH#149, @381a84d4).

  • Publicly support “filling” axes with colorbars using loc='fill' (GH#149, @057c9895).

  • Return both figure and axes in show_ functions; this gives users access to the axes and prevents drawing them twice in notebooks (GH#149, @2f600bc9).

  • Enable passing callables to Formatter to create a FuncFormatter instance.

  • Support sampling LinearSegmentedColormap into ListedColormaps inside of Colormap rather than Cycle (GH#84, @972956b1).

Bug fixes

  • Fix various issues with axis label sharing and axis sharing for twinned axes and panel axes (GH#164).

  • Permit modifying existing cartopy geographic features with successive calls to format (GH#168).

  • Fix issue drawing bar plots with datetime x axes (GH#156).

  • Fix issue where AutoFormatter tools were not locale-aware, i.e. use comma as decimal point sometimes (GH#152, @c7636296).

  • Fix issue where AutoFormatter nonzero-value correction algorithm was right for wrong reasons and could be wrong in rare circumstances (GH#152, @c7636296).

  • Fix issue where matplotlib.style.use resets backend (GH#149, @c8319104).

  • Fix issue with colormaps with dots in name (GH#149, @972956b1).

  • Fix logarithmic scale argument parsing deprecation (GH#149, @6ed7dbc5).

  • Fix deprecation of direct access to matplotlib.cm.cmap_d in matplotlib >=3.2.0 (GH#149, @a69c16da).

  • Fix issues with string font sizes (GH#149, @6121de03). Add hidden _get_font_size method to translate font size to numeric.

  • Fix issue where passing actual projection instances generated with Proj to subplots could incorrectly pair cartopy projections with basemap axes and vice versa (GH#149).

  • Fix issue where could not draw colorbar from list of single-color PathCollections, i.e. scatter plots (GH#149, @e893900b).

  • Fix issue where importing proplot in jupyter notebooks resets the default inline backend (GH#149, @6121de03).

  • Improve axis label sharing algorithm (@6535b219).

  • Fix main axis label sharing bugs in presence of panels (@7b709db9).

  • Fix v0.4.0 regression where panel sharing no longer works (@289e5538).

  • Fix AutoFormatter bug with values close to zero (GH#124, @9b7f89fd)

  • Fix AutoFormatter bug with small negative numbers (GH#117).

  • Label cyclic Scientific colour maps as cyclic (@e10a3109).

  • Permit special colormap normalization and level scaling for colormap-colored contour plots, just like contourf (GH#149, @054cceb5).

Internals

  • Major internal change: Move functions into smaller separate files to mimic how matplotlib library is divided up (GH#149).

  • Add internals folder containing default proplot rc params, deprecation helper functions, and other internal tools (GH#149).

  • Make colorbar axes instances of CartesianAxes, just like panel axes.

  • Rename ubiquitous _notNone function to _not_none and change to more sensible behavior.

  • Turn some private config functions into static methods (@6121de03).

  • Remove “smart bounds” feature from FuncScale (GH#166, @9ac149ea).

  • Clean up axes iterators (GH#149, @c8a0768a).

Documentation

  • Call figure objects fig instead of f.

  • Major clean up of notebook examples (@f86542b5).

  • Major clean up wrappers documentation (@9648c18f)

  • Fix dead “See Also” links (@d32c6506).

  • Use “Other parameters” tables more often (@d32c6506).

ProPlot v0.5.0 (2020-02-10)

Deprecated

  • Remove abcformat from format (@2f295e18).

  • Rename top to abovetop in format (@500dd381).

  • Rename abc.linewidth and title.linewidth to borderwidth (@54eb4bee).

  • Rename text_wrapper linewidth and invert to borderwidth and borderinvert (@54eb4bee).

Features

  • Add back Fabio Crameri’s scientific colour maps (GH#116).

  • Permit both e.g. locator and xlocator as keyword arguments to altx, etc. (@57fab860).

  • Permit descending BinNorm and LinearSegmentedNorm levels (GH#119).

  • Permit overriding the font weight, style, and stretch in the show_fonts table (@e8b9ee38).

  • Permit hiding “unknown” colormaps and color cycles in the show_cmaps and show_cycles tables (@cb206f19).

Bug fixes

  • Fix issue where show_cmaps and show_cycles colormap names were messed up (@13045599)

  • Fix issue where show_cmaps and show_cycles did not return figure instance (@98209e87).

  • Fix issue where user values passed to colorbar_wrapper were sometimes ignored (@fd4f8d5f).

  • Permit passing lists of colors to manually shade line contours and filled contours in cmap_changer.

  • Prevent formatting rightmost meridian label as 1e-10 on cartopy map projections (@37fdd1eb).

  • Support CF-time axes by fixing bug in standardize_1d and standardize_2d (GH#103, GH#121).

  • Redirect to the “default” location when using legend=True and colorbar=True to generate on-the-fly legends and colorbars (@c2c5c58d). This feature was accidentally removed.

  • Let colorbar_wrapper accept lists of colors (@e5f11591). This feature was accidentally removed.

Internals

  • Remove various unused keyword arguments (@33654a42).

  • Major improvements to the API controlling axes titles and a-b-c labels (@1ef7e65e).

  • Always use full names left, right, top, and bottom instead of l, r, b, and t, for clarity (@1ef7e65e).

  • Improve GrayCycle colormap, is now much shorter and built from reflected Fabio GrayC colormaps (@5b2c7eb7).

ProPlot v0.4.3 (2020-01-21)

Deprecated

  • Remove ipython_autoreload, ipython_autosave, and ipython_matplotlib (GH#112, GH#113). Move inline backend configuration to a hidden method that gets called whenever the rc_configurator is initalized.

Features

  • Permit comments at the head of colormap and color files (@0ffc1d15).

  • Make parametric match plot autoscaling behavior (@ecdcba82).

Internals

ProPlot v0.4.2 (2020-01-09)

Features

  • Add family keyword arg to show_fonts (GH#106).

  • Package the TeX Gyre font series with ProPlot (GH#106). Remove a couple other fonts.

  • Put the TeX Gyre fonts at the head of the serif, sans-serif, monospace, cursive, and fantasy rcParams font family lists (GH#104, GH#106).

Bug fixes

  • Fix issues with Fira Math weights unrecognized by matplotlib (GH#106).

ProPlot v0.4.1 (2020-01-08)

Deprecation

  • Change the default .proplotrc format from YAML to the .matplotlibrc syntax (GH#101).

Features

  • Comments (lines starting with #) are now permitted in all RGB and HEX style colormap and cycle files (GH#100).

  • Break down show_cycles bars into categories, just like show_cmaps (GH#100).

Bug fixes

  • Fix issue where show_cmaps and show_cycles draw empty axes (GH#100).

  • Add back the default .proplorc file to docs (GH#101). To do this, conf.py auto-generates a file in _static.

Internals

  • Add geogrid.color/linewidth/etc and gridminor.color/linewidth/etc props as children of grid.color/linewidth/etc (GH#101).

  • Various rc_configurator improvements, remove outdated global variables (GH#101).

  • Better error handling when loading colormap/cycle files, and calls to Colormap and Cycle now raise errors while calls to register_cmaps and register_cycles still issue warnings (GH#100).

ProPlot v0.4.0 (2020-01-07)

Deprecated

  • Rename basemap_defaults to basemap_kwargs and cartopy_projs to cartopy_names (@431a06ce).

  • Remove subplots.innerspace, subplots.titlespace, subplots.xlabspace, and subplots.ylabspace spacing arguments, automatically calculate default non-tight spacing using _get_space based on current tick lengths, label sizes, etc.

  • Remove redundant use_fonts, use rcParams['sans-serif'] precedence instead (GH#95).

  • dualx and dualy no longer accept “scale-spec” arguments. Must be a function, two functions, or an axis scale instance (GH#96).

  • Remove Axes share[x|y], span[x|y], and align[x|y] kwargs (GH#99). These settings are now always figure-wide.

  • Rename Cycle samples to N, rename show_colors nbreak to nhues (GH#98).

Features

  • Add from_file static methods (GH#98). You can now load files by passing a name to Colormap.

  • Add TeX Gyre Heros as open source Helvetica-alternative; this is the new default font. Add Fira Math as DejaVu Sans-alternative; has complete set of math characters (GH#95).

  • Add xlinewidth, ylinewidth, xgridcolor, ygridcolor keyword args to format (GH#95).

  • Add getters and setters for various Figure settings like share[x|y], span[x|y], and align[x|y] (GH#99).

  • Let twinx, twiny, altx, and alty accept format keyword args just like dualx and dualy (GH#99).

  • Add Figure fallback_to_cm kwarg. This is used by show_fonts to show dummy glyphs to clearly illustrate when fonts are missing characters, but preserve graceful fallback for end user.

  • Improve Proj constructor function. It now accepts Projection and Basemap instances, just like other constructor functions, and returns only the projection instance (GH#92).

  • rc __getitem__ always returns the setting. To get context block-restricted settings, you must explicitly pass context=True to get, fill, or category (GH#91).

Bug fixes

  • Fix context bug (GH#80 and GH#91).

  • Fix issues with dualx and dualy with non-linear parent scales (GH#96).

  • Ignore TTC fonts because they cannot be saved in EPS/PDF figures (GH#94 and GH#95).

  • Do not try to use Helvetica Neue because “thin” font style is read as regular (GH#94 and GH#95).

Documentation

  • Use the imperative mood for docstring summaries (GH#92).

  • Fix show_cycles bug (GH#90) and show cycles using colorbars rather than lines (GH#98).

Internals

  • Define rc default values with inline dictionaries rather than with a default .proplotrc file, change the auto-generated user .proplotrc (GH#91).

  • Remove useless panel_kw keyword arg from legend_wrapper and colorbar_wrapper (GH#91). Remove wflush, hflush, and flush keyword args from subplots that should have been removed long ago.

ProPlot v0.3.1 (2019-12-16)

Bug fixes

  • Fix issue where custom fonts were not synced (@a1b47b4c).

  • Fix issue with latest versions of matplotlib where %matplotlib inline fails silently so the backend is not instantiated (@cc39dc56).

ProPlot v0.3.0 (2019-12-15)

Deprecated

Features

  • Add use_font, only sync Google Fonts fonts (GH#87).

  • New 'DryWet' colormap is colorblind friendly (@0280e266).

  • Permit shifting arbitrary colormaps by 180 degrees by appending the name with '_shifted', just like '_r' (@e2e2b2c7).

Bug fixes

  • Add brute force workaround for saving colormaps with callable segmentdata (@8201a806).

  • Fix issue with latest versions of matplotlib where %matplotlib inline fails silently so the backend is not instantiated (@cc39dc56).

  • Fix shifted when shift is not 180 (@e2e2b2c7).

  • Save the cyclic and gamma attributes in JSON files too (@8201a806).

Documentation

  • Cleanup notebooks, especially the colormaps demo (e.g. @952d4cb3).

Internals

ProPlot v0.2.7 (2019-12-09)

Bug fixes

  • Fix issue where AutoFormatter logarithmic scale points are incorrect (@9b164733).

Documentation

Internals

  • Remove prefix, suffix, and negpos keyword args from SimpleFormatter, remove precision keyword arg from AutoFormatter (@8520e363).

  • Make 'deglat', 'deglon', 'lat', 'lon', and 'deg' instances of AutoFormatter instead of SimpleFormatter (@8520e363). The latter should just be used for contours.

ProPlot v0.2.6 (2019-12-08)

Bug fixes

  • Fix issue where twin axes are drawn twice (@56145122).

ProPlot v0.2.5 (2019-12-07)

Features

  • Much better CutoffScale algorithm, permit arbitrary cutoffs (GH#83).

ProPlot v0.2.4 (2019-12-07)

Deprecated

  • Rename ColorCacheDict to ColorDict (@aee7d1be).

  • Rename colors to Colors (@aee7d1be)

  • Remove fonts_system and fonts_proplot, rename colordict to colors, make top-level variables more robust (@861583f8).

Documentation

Internals

  • Improvements to register_colors.

ProPlot v0.2.3 (2019-12-05)

Bug fixes

  • Fix issue with overlapping gridlines using monkey patches on gridliner instances (@8960ebdc).

  • Fix issue where auto colorbar labels are not applied when globe=True (@ecb3c899).

  • More sensible zorder for gridlines (@90d94e55).

  • Fix issue where customized super title settings are overridden when new axes are created (@35cb21f2).

Documentation

  • Organize ipython notebook documentation (@35cb21f2).

Internals

  • Major cleanup of the colorbar_wrapper source code, handle minor ticks using the builtin matplotlib API just like major ticks (@b9976220).

ProPlot v0.2.2 (2019-12-04)

Deprecated

  • Rename axes_grid to subplot_grid (@ac14e9dd).

Bug fixes

Documentation

  • Make notebook examples PEP8 compliant (@97f5ffd4). Much more readable now.

ProPlot v0.2.1 (2019-12-02)

Deprecated

  • Rename autoreload_setup, autosave_setup, and matplotlib_setup to ipython_autoreload, ipython_autosave, and ipython_matplotlib, respectively (@84e80c1e).

ProPlot v0.2.0 (2019-12-02)

Deprecated

  • Remove the nbsetup rc setting in favor of separate autosave, autoreload, and matplotlib settings for triggering the respective % magic commands. (@3a622887; nbsetup is still accepted but no longer documented).

  • Rename the format rc setting in favor of the inlinefmt setting (@3a622887; format is still accepted but no longer documented).

  • Rename FlexibleGridSpec and FlexibleSubplotSpec to GridSpec and SubplotSpec (@3a622887; until GH#110 is merged it is impossible to use these manually, so this won’t bother anyone).

Features

  • Support manual resizing for all backends, including osx and qt (@3a622887).

Bug fixes

  • Disable automatic resizing for the nbAgg interactive inline backend. Found no suitable workaround (@3a622887).

Internals

  • Organize the rc documentation and the default .proplotrc file (@3a622887).

  • Rename rcParamsCustom to rcParamsLong (@3a622887; this is inaccessible to the user).

  • When calling fig.canvas.print_figure() on a stale figure, call fig.canvas.draw() first. May be overkill for savefig but critical for correctly displaying already-drawn notebook figures.

ProPlot v0.1.0 (2019-12-01)

Internals

  • Include flake8 in Travis CI testing (@8743b857).

  • Enforce source code PEP8 compliance (@78da51a7).

  • Use pre-commit for all future commits (@e14f6809).

  • Implement tight layout stuff with canvas monkey patches (@67221d10). ProPlot now works for arbitrary backends, not just inline and qt.

Documentation

ProPlot v0.0.0 (2019-11-27)

The first version released on PyPi.