What’s new?

This page lists the API changes with each version. 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.


Please note that when classes, functions, keywords, or settings are deprecated, they are not removed – using the old syntax will result in a warning rather than an error and preserve the original functionality. Since proplot adheres to semantic versioning, we will not consider removing the deprecated syntax until the first major release (i.e., version 1.0.0).

Version 1.0.0 (####-##-##)

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

Version 0.10.0 (2022-##-##)


Style changes

  • Disable automatic reversal of dependent variable coordinates when the axis limits were previously fixed, and add documentation for this feature (GH#300).

  • Automatically disable minor colorbar and axis ticks when applying non-numeric major tick labels with a FixedFormatter (@c747ae44).

  • Use DiscreteLocator for major/minor discrete colorbar ticks instead of FixedLocator and auto-update the tick selection whenever the axes is drawn (@b94a9b1e, @92bb937e, @302c239e).

  • Disable matplotlib’s auto-removal of gridlines in presence of pcolor plots in all versions and silence the matplotlib 3.5 deprecation warning (@ba405ac0). Now gridlines appear on top of pcolor meshes by default, just like filled contours.

  • Apply the rc['geo.round'] setting (formerly rc['cartopy.circular']) when instantiating polar basemap projections (@5f1c67cc). Previously this setting was only used for cartopy projections.

  • Put outer legends or colorbars on the same panel axes if their align values differ and (for colorbars only) their lengths do not overlap (@91ac49b7). This permits e.g. aligned “bottom left” and “bottom right” outer legends.

  • Change the sample show_fonts text with math keyword to show math or non-math, sort fonts by input order or by their appearance in the rc list, and permit FontProperties or fontspec input and property keywords (@34d6ec14).

  • Change rc['mathtext.default'] from 'regular' to 'it', and change 'sans' appearing in the rc['mathtext.rm'], rc['mathtext.sf'], rc['mathtext.bf'], and rc['mathtext.it'] settings to 'regular' (@323). See below for details.

  • Change rc['grid.labelpad'] from 4.0 to 3.0 (@f95b828a). This makes cartopy grid labels and polar axes labels a bit more compact.

  • Change rc['legend.handleheight'] from 1.5 to 2.0 for less compressed Patch handles (e.g. with error shading) (@2a5f6b48).


Bug fixes

  • Fix matplotlib >= 3.5 issue preventing basic application of “shared” axes with share, sharex, sharey (GH#305).

  • Fix matplotlib >= 3.5 issue preventing basic usage of proplot.colors.DiscreteNorm and colorbars scaled by proplot.colors.DiscreteNorm (GH#302).

  • Fix matplotlib >= 3.5 issue where date axes are not correctly detected due to a new default date converter (@63deee21).

  • Fix matplotlib >= 3.4 issue with fixed-aspect log-log axes due to deprecation of get_data_ratio_log (@29ed6cce).

  • Fix matplotlib >= 3.4 issue where position of child axes in presence of subfigures is incorrect (@9246835f).

  • Fix matplotlib >= 3.4 issue where alternate axes are drawn twice due to adding them as child axes and failing to remove from the fig._localaxes stack (GH#303).

  • Fix matplotlib < 3.2.0 annoying rc['examples.directory'] deprecation warning message (GH#196).

  • Fix matplotlib < 3.2.0 issue where rc['axes.inbounds'] feature fails due to private API invocation (@e3e739e4).

  • Fix basic matplotlib < 3.1.2 usage issue due to missing validate_fontweight validator (@1d2d05b7).

  • Fix cartopy >= 0.20 issue where added projections like 'wintri' fail due to an ImportError (GH#324).

  • Fix cartopy >= 0.20 issue where inline longitude and latitude gridline labels can no longer be turned on (GH#307).

  • Fix cartopy >= 0.20 issue where user-specified longitude/latitude gridline label sides ignored due to using booleans instead of 'x', 'y' (@2ac40715).

  • Fix cartopy >= 0.18 issue where longitude gridlines and labels 360 degrees east of gridlines on the left edge of the map are unnecessarily removed (@bcf4fde3).

  • Fix cartopy < 0.18 issue where longitude gridlines and labels east of dateline are not drawn, and remove outdated gridliner monkey patches (@aa51512b).

  • Fix issue where tight layout algorithm can fail when labels from another subplot span over an empty gridspec slot (GH#313).

  • Fix issue where tight layout algorithm fails in the presence of subplots with overlapping or identical subplotspecs (@87f098b6).

  • Fix issue where super label settings (e.g. size) cannot be updated after they are initially created (@2cd72fd3).

  • Fix issue where proplot.axes.CartesianAxes.format keyword arguments cannot be passed to panel_axes (@1b3d0d48).

  • Fix issue where outer colorbars are drawn twice due to adding them as both figure-wide axes and child axes (GH#304).

  • Fix issue where silently-deprecated aspect parameter passed to proplot.ui.subplots is not translated to refaspect (@2406a2ae).

  • Fix issue where proplot.gridspec.GridSpec.figure is allowed to change – instead raise error that recommends copy (@d8898f5f).

  • Fix issue where proplot.gridspec.GridSpec.update cannot be called on gridspecs without companion Figures (@e69fd041).

  • Fix issues passing pandas datetime coordinates and object-type coordinate arrays to plotting methods (GH#320).

  • Fix issue where hatching passed to bar does nothing unless edgecolor is explicitly passed (GH#389).

  • Fix issue where boxpctiles is not recognized by e.g. bar but boxpctile is due to typo (GH#382).

  • Fix issue where list-of-string colors passed to scatter are interpreted as data values (GH#316).

  • Fix issue where step where parameter is ignored due to drawstyle conversion (GH#359).

  • Fix issue where x and y axis limits are reversed when passing to hexbin and hist2d (GH#334).

  • Fix regression where x or y axis limits are reversed when passing to hist and histh (GH#334).

  • Fix issue where settings passed to colorbar after calling e.g. pcolor with colorbar_kw are ignored (GH#314).

  • Fix issues where passing the colorbar orientation without a loc, or using a non- standard orientation for a given loc, triggers tickloc error (GH#314).

  • Fix issue where background properties like color and linewidth cannot be passed to Axes instantiation commands (@b67b046c).

  • Fix issue where manual data aspect ratio passed with format or set_aspect is inverted (@7cda3b23).

  • Fix issue where continuous normalizer vmin and vmax are not set to min and max of levels when passed to DiscreteNorm (@e9ed16c1).

  • Fix issue where unevenly-spaced levels combined with DiscreteColormap incorrectly samples the color list (GH#299).

  • Fix issue where legend ignores the user-input fontsize (GH#331).

  • Fix issue where legend ignores the user-input facecolor but not the shorthand fc (GH#402).

  • Fix issue where passing invalid rc setting to .format results in persistent invalid rc state requiring restarting the session/configurator (GH#348).

  • Fix issue where proplotrc settings are ignored if a subsequent line contains an overlapping meta-setting (GH#333).

  • Fix issue where setting rc['legend.facecolor'] or rc['legend.edgecolor'] to 'inherit' (or passing as keyword argument) raises error (GH#298).

  • Fix issue where settings rc['grid.pad'] and rc['grid.labelpad'] and settings rc['tick.pad'] and rc['tick.labelpad'] are not synced (@2b96eb0d).

  • Fix issue where the unchanged rc['figure.figsize'] setting is incorrectly included in the changed dictionary (@d862395b).


  • Indicate default values in type-specification rather than parameter descriptions (@50546dee).

  • Improve website style: lighter headers, wider text, and no more clumsy boxes around code literals (@450ede53).

  • Improve colorbar and legend documentation, expound added features more carefully (@43631840).

Version 0.9.5 (2021-10-19)

Style changes


  • Apply positive=True, negative=True, and symmetric=True by modifying vmin and vmax rather than levels (@fbca1063). This permits using these keywords even when discrete=False and fixes too-few-levels issues when discrete=True.

  • Improve default string representation of axes generated with altx, alty, or inset_axes (@a570fca7).

Bug fixes

  • Fix issue where “auto-diverging” application fails when colormap is not explicitly specified (@9ce6c61c).

  • Fix issue where “auto-diverging” application is not disabled when qualitative colormaps are specified with colors (@44322db2).

  • Fix issue where sequential=True, cyclic=True, or qualitative=True are ignored when “auto-diverging” is applied (@cb4910fa).

  • Fix issues where version 7.0 cyclic/diverging “scientific colour maps” are not internally recognized as cyclic/diverging (@df11445a).

  • Fix issue where rc['cmap.discrete'] set to False is used even for contour plots rather than ignored (@a527cc52).

  • Fix issue where “cyclic” colormaps are allowed to have extend other than 'neither' when specified with cyclic=True rather than passing a cyclic cmap (@e91d9bf3).

  • Fix issue where “qualitative” colormaps are allowed to have discrete set to False when specified with qualitative=True rather than passing a discrete cmap (@789f224b).

  • Fix issue where SegmentedNorm cannot be specified with norm='segmented' and norm_kw={'levels': level} when discrete is also disabled (@a4f6e838).

  • Fix issue where more than one of mutually-exclusive sequential, diverging, cyclic, and qualitative keywords can be set to True and others are silently ignored without warning (@f14aa263).

Version 0.9.4 (2021-10-16)


Bug fixes

  • Fix issue where arguments can only be passed to altx and alty, but not twinx and twiny (@223b55a6).

  • Fix issue where xbounds, ybounds, and fixticks fail due to errors in tick restriction algorithm (@a2396afe).

  • Fix issue where passing fontsize to format fails to update fontsize-relative title and a-b-c label sizes (@64406726).

  • Fix issue where lonlim, latlim, and latbounds cannot be passed to e.g. add_subplot during GeoAxes initialization (@d9d3c91a)

  • Fix issue where vmin and vmax are ignored when making plots with discrete levels (GH#276).

  • Fix issue where autodiverging is disabled even when known diverging colormaps are passed to PlotAxes commands (@2eca2198).

  • Fix issue where colormaps made with Colormap with unspecified name cannot be assigned as rc defaults (@0e93b7fa).

  • Fix issue where registered colormaps with trailing _r or _s cannot be retrieved due to automatic reversing/shifting feature (@345680c9).


  • Populate docs with examples of passing format arguments to figure and axes instantiation commands (e.g. pplt.figure, fig.subplot) (@803a889f).

  • Improve website colormap and cycle table rendering time by rasterizing colorbar data and add rasterize as optional keyword arg (@1a875fc2).

Version 0.9.3 (2021-10-09)

Style changes

  • Stop changing default background of figure when ThreeAxes is present – instead just set the default axes background to transparent (@e933614d).


  • Permit passing background patch-related format keywords like facecolor on axes instantiation (@f863afd8).

  • Add rc['land.alpha'], rc['ocean.alpha'], rc['coast.alpha'], rc['rivers.alpha'], rc['lakes.alpha'], rc['borders.alpha'], and rc['innerborders.alpha'] settings to change opacity of geographic features (@8bb49a02). Also add missing rc['coast.zorder'].

  • Add xtickcolor, ytickcolor, xticklabelcolor, and yticklabelcolor format keywords to control tick mark and label colors (@68cba1af). Also add documentation for xlabelcolor and ylabelcolor.

  • Add xticklenratio and yticklenratio format keywords to scale minor tick lengths (@26fdadf6).

  • Add xtickwidth, ytickwidth, xtickwidthratio, and ytickwidthratio keywords to format to scale tick widths (@30a250f0).

  • Set default gridlabelcolor to color when latter is passed to polar or geo axes format methods, consistent with proplot.axes.CartesianAxes color.

  • Add ticklen, ticklenratio, tickwidth, tickwidthratio keywords to colorbar to manage colorbar ticks (@08498abf).

  • Add labelloc keyword to colorbar to change the colorbar label location separately from tickloc (@32069370).

  • Permit specifying linewidth and markersize keywords (and aliases) with arbitrary physical units for format/colorbar/plotting commands (@c1ffbc8c).

  • Add absolute_size key to scatter (analogous to absolute_width used with bar) to bypass auto-scaling of array input (@b4701411).

  • Add more intuitive bars, boxes, shade, fade keywords as alternatives to barstds, boxstds, shadestds, and fadestds (@15812cd4).

  • Ignore masked and invalid values in datasets passed to boxplot and violinplot (@daa666e2).

  • Convert showextrema=True passed to violinplot to barpctiles=True (i.e., show 0–100 percentile range) (@42f613d6).

  • Add borderstyle text keyword to change the joinstyle used for the path effects border (@25e21c76).

Bug fixes

  • Fix fatal error instantiating ThreeAxes (GH#389).

  • Fix issue with plotting in ThreeAxes by inheriting from from Axes instead of PlotAxes (@64623d92).

  • Fix issue where format ignores margin rather than using it for both xmargin and ymargin (@ba32fd1a).

  • Fix issue where color passed to format triggers deprecation warning even though it is a valid background patch property (@a50eab0e).

  • Fix issue where calling violinplot always emits warning due to masked array input (@daa666e2).

  • Fix issue where calling pcolorfast with image output emits warning (@5d081306).

  • Fix issue where passing tickwidth=0 to format changes the tick length persistently outside of context block (@4966c8ab).

  • Fix issue where tickratio and lenratio applied in successive calls to format fails to update properly (@26fdadf6).

  • Fix issue with default scatter smin and smax (used to convert array-like input sizes s from data units to points ** 2) by switching defaults to 1 and rc['lines.markersize'] rather than the data minimum and maximum (@b4701411).


  • Change stylized name “ProPlot” to simply lowercase “proplot”, consistent with matplotlib, cartopy, numpy, etc. (@b876b214).

Version 0.9.2 (2021-09-30)


  • Permit passing includepanels and mathtext_fallback as proplot.figure.Figure.format keywords instead of just __init__ keywords (@33bff576).

  • Permit passing loc proplot.axes.CartesianAxes.format keyword argument(s) to alt[xy] (@eaab8658). For example ax.alty(loc='left') changes the spine, tick mark, tick label, axis label, and offset label sides to the opposite of the default: left for the new alternate axes, right for the original axes.

  • Improve documentation for loc proplot.axes.CartesianAxes.format keywords (@1fa90f87, @48dc346d). Inheritance order is loc or spineloc –> tickloc –> ticklabelloc –> labelloc and offsetloc, e.g. xloc='bottom' implies xtickloc='bottom' unless specified otherwise.

  • Do not inherit tickloc from spineloc if it is invalid (e.g., 'zero'), do not propagate spineloc and tickloc to other settings if they are inferred from updated rc settings, and issue error message if tickloc or ticklabelloc are invalid (@616d81fa, @219e4b21, @bc5a692c).

  • Add documentation for previously-hidden xticklabelloc, yticklabelloc, xlabelloc, and ylabelloc proplot.axes.CartesianAxes.format keywords (@1fa90f87).

  • Add xoffsetloc, yoffsetloc keywords to control position of order-of-magnitude indicator location for x and y axes (with large numbers) (@96a37e53).

  • Add xlabelcolor and ylabelcolor keywords as alternatives to xcolor and ycolor to change just the label color and nothing else (@d2f20970).

  • Add base keyword to SigFigFormatter to optionally round to multiples other than factors of 10 (@3b00e8a0).

  • Pass [major|minor]_[locator|formatter] FuncScale arguments through the constructor functions (@e238d4db).

  • Support single-color parametric plots with e.g. ax.parametric(x, y, color='red') as quick alternative to plot without “sticky edges” (@98504b86).

  • Support legend entries for parametric lines by interpreting label and value separately from labels and values (@14a0cfdc).

  • Increase zorder of title/a-b-c text from 3 to 3.5 so it overlies e.g. text contour labels (@77fa01da).

  • Ensure contour labels appear on top of inner titles/a-b-c labels by decreasing default zorder from cntr_zorder + 2 to cntr_zorder + 1 (@59222164).

  • Implement “descending level” support directly inside DiscreteNorm rather than cmap parser in PlotAxes commands, and auto-reverse descending levels passed to SegmentedNorm (@46d8bedc).

  • Improve show_cmaps and show_cycles: Stop passing arguments through constructor functions, preserve case for user colormap labels, and avoid showing leading _ and trailing _copy in labels (@c41db8d8).

Bug fixes

  • Fix accidental commit of debugging print statement (@259a263b).

  • Fix issue where includepanels is not applied for spanning axis labels in presence of panels but only one spanning subplot (@b8bc55ec).

  • Fix issue where default outer legend axes-relative loc does not take into account the underlying “panel” side (@2446acc1).

  • Fix issue where axis label color is overwritten during __init__ call to proplot.axes.CartesianAxes.format (@b454a513).

  • Fix issue where setting xspineloc or yspineloc to invalid tickloc (e.g., 'zero' or 'center') also disables the ticks (@616d81fa).

  • Fix issue where setting axis label color without specifying label text erases the old label text (@7a7852f9).

  • Fix issue where axis label settings are overridden by settings from invisible x/y axis on alternate axes (@c6db292b).

  • Fix AutoFormatter issue where orderOfMagnitude is not taken into account when correcting small tick values truncated to zero on (usually logarithmic) axis scales (@54fbef0b).

  • Fix issue where proplot.utils.arange is not endpoint-inclusive for negative (descending) step size (@ec1f8410).

  • Fix confusing behavior where explicitly passed vmin and vmax are ignored if norm was passed as an already-instantiated class (@1ee79d36).

  • Fix issue where segment data of matplotlib.cm colormap instances is overwritten during conversion to proplot subclasses (GH#283).

  • Fix issue where color of contour labels cannot be changed with labels_kw (@d101575d).

  • Fix keyword conflict where sizes are interpreted as Collection marker sizes when passed to barb (GH#287).

  • Fix issue where “sticky edges” fail for datetime data (@33fa9654).

Version 0.9.1 (2021-09-14)

Style changes

  • Revert back to original color names for 'cyan', 'magenta', and 'yellow' rather than overwriting with 'c', 'm', and 'y' (GH#280).

  • Treat 'ochre' and 'ocher' as synonyms (consistent with existing 'grey' and 'gray' synonyms) (@c949e505).


  • Permit passing format keywords when instantiating figures and axes (@ae98378d). For example: pplt.figure(suptitle='Super title') or fig.add_subplot(111, xcolor='gray', xticks=10) .

  • Add back color as a valid proplot.axes.CartesianAxes.format keyword arg for consistency with xcolor and ycolor (@ecb6fa3f).

Bug fixes

  • Fix issue where single-level single-color contour plots do not draw the contour (GH#281).

  • Fix issue with dictionaries passed to proj when calling add_subplots (@21b165df).

  • Fix issue with includepanels disabling spanning axis labels in the presence of panels (@332ba702).

  • Remove useless “unexpected version” warning when cartopy is not installed (@6dbab1bc).

  • Improve backwards compatibility with matplotlib.figure.Figure.colorbar by permitting positional cax and ax args (@5003f9a8).

  • Try to auto-disable relative bar widths for seaborn plots that use the bar and barh commands (@b79b9c60).


  • Fix documentation compiling issue due to Natural Earth server change (@d1d47911).

Version 0.9.0 (2021-09-08)


  • Rename rc['cmap.edgefix'] to rc.edgefix (@515f5132). It now applies to bar and area plot elements, not just scalar mappables (see below).

  • Deprecate passing lists of colors to boxplot and violinplot in favor of using the property cycler instead (see below) (@67d95349).

  • The violinplot functions now return PolyCollection of violin bodies or tuples of (bodies, error bars) instead of a singleton dictionary containing just the 'bodies' entry (@45774536).

  • Deprecate recently-introduced proplot.gridspec.SubplotGrid.legend and proplot.gridspec.SubplotGrid.colorbar methods (@d21a61a3). Idea was this could be used to add an auto-legend to each subplot with axs.legend() or identical colorbars with axs.colorbar(m), but in the future want to instead use these methods to add colorbars and legends along the edge of arbitrary subplots with e.g. axs[0, :2].colorbar(m, loc='bottom').

  • Deprecate recently-introduced proplot.gridspec.SubplotGrid.text (@80deb71a). Idea was this could be used to add identical text to each subplot but that is pretty niche, does not need a dedicated command.

Style changes

  • Fix issue where CSS/XKCD colors overwrite “base” color definitions, resulting in e.g. 'yellow' different from 'y' (@01db1223, @b90bee8c).

  • Make default label rotation for colorbar-of-artist string labels 0, consistent with string tick labels applied with autoformat=True (@3f191f3b).

  • Use default discrete=False for hist2d plots, consistent with hexbin (@267dd161). Now “discrete” levels are only enabled for pcolor/contour plots by default.

  • Trigger adjust_grays hue adjustments for gray-like color names passed to from_list that aren’t technically pure gray, including 'charcoal', 'light gray'/'light grey', and 'gray[0-9]'/'grey[0-9]' (@6cf42896, @49bb9370).

  • Implement “edgefix” and add edgefix keyword for bar, hist, area, and pie to fix the “white-lines-between-patches” issue with saved vector graphics, just like pcolor and contourf (@cc602349, @b291b2be).

  • Revert back to matplotlib default behavior of edgecolor='none' for bar and pie plots (@cc602349, @b291b2be). Previously this behavior often resulted in “white lines” issue but now edgefix is applied to these plots.

  • Skip “edgefix” option when patch/collection alpha is less than 1 to prevent appearance of overlapping edges (@5bf9b1cc). Previously this was only skipped if ScalarMappable colormap included transparency. Also remove manual blending of colorbar solids (no longer needed) (@4d059a31).

  • The boxplot and violinplot functions now iterate through the property cycler for each box/violin by default (similar to seaborn) (@67d95349). The cycle can be changed with cycle and cycle_kw arguments.


  • Add align keyword with options 'bottom', 'top', 'left', 'right', or 'center' (with optional single-char shorthands) to change alignment for outer legends/colorbars (@4a50b4b2). Previously they had to be centered.

  • Add transpose keyword as alternative to order for 2D PlotAxes commands (GH#72). transpose=True is equivalent to order='F'.

  • Return homogeneous groupings of matplotlib artists in silent_list objects to simplify repr (@d59f9c40, @667cc068, @240f0b31, @0a6d74b7).

  • Use built-in matplotlib logic for plotting multiple hist columns, with support for stack as alias of stacked and width as alias of rwidth (consistent with bar keywords) (@734329a5). By default, histograms for successive columns are now grouped side-by-side instead of overlaid.

  • Add fill and filled keywords to hist, analogous to stack and stacked, and make passage of these keywords set the corresponding default histtype (@4a85773b). Also add filled alias of fill to boxplot for consistency (@b5caf550).

  • Always copy colormaps returned by Colormap to avoid subsequently changing global colormap properties with e.g. set_alpha (@7a3c3f64).

  • Add leading underscore to all default colormap names (_name_r for reversed, _name_s for shifted, _name1_name2 for merged, and _name_copy for all other modifications) and never register colormaps returned by Colormap that begin with underscore (@a6fab19f, @1f6e6188). This is analogous to legend ignoring labels with leading underscore.

  • Control colorbar frame properties using same syntax as legend frame properties – edgewidth, edgecolor, and optional rounded box with fancybox=True (@58ce2c95). Colorbar outline is now controlled with linewidth and color. Previously these settings had to be in sync.

  • Auto-expand components of silent_list and Collection passed to legend that have valid labels, similar to tuple group expansion (GH#277)

  • Add handle_kw to legend to optionally control handle settings that conflict with frame settings (@58ce2c95). Example: handle_kw={'edgecolor': 'k'}.

  • Interpret 'grey' as a synonym of 'gray' by translating substrings in color database (@6cf42896, @04538bad). Permits e.g. color='grey1'.

  • Permit loading color names from files without .txt extension (@55481a9c). This restriction was unnecessary.

  • Set default=True automatically if users pass margin or space to register_colors to permit quickly/succinctly experimenting with XKCD color filtering algorithm (@cfc3cef6).

  • Add cartopy-based LongitudeLocator, LatitudeLocator, DegreeLocator, LongitudeFormatter, LatitudeFormatter, DegreeFormatter to public API for consistency with other “registered” tickers (@76e45c0c).

Bug fixes

  • Fix issue where tuple rc values are truncated to first scalar value when saving a proplotrc (@e731c709).

  • Fix issue where channel-setting and scaling functions like scale_luminance drop the opacity channel (@58ce2c95).

  • Fix issue where line plot coordinates get unnecessarily offset by 360 by removing unnecessary _geo_monotonic standardization (GH#274).

  • Fix regression where vmin is ignored without explicitly specifying vmax and vice versa (GH#276).

  • Fix issue where scatter ignores facecolors input by treating it the same as other color aliases (GH#275).

  • Fix issue where calling legend() without arguments generates duplicate labels for histograms (GH#277).

  • Fix issue where list-of-list style input to legend fails to trigger centered legend (@e598b470).

  • Fix issue where alpha passed to contour/pcolor/vlines/hlines commands was ignored due to translating as alphas rather than alpha (@e5faf4d6).

  • Fix unexpected behavior where PlotAxes tries to make list-of-artist style colorbars from successive calls to 2D plotting commands rather than making individual colorbars (@20ce93a1).

  • Fix issue where diverging=True is applied for datasets with both discrete=False and vmin or vmax equivalent to 0 (@84b9f86e).

  • Fix issue where scatter does not accept N x 3 or N x 4 RGB[A] style arrays (@13df1841).

  • Fix issue where importing seaborn issues 100 warnings due to overwriting seaborn colormaps added by proplot (@006aef5f).

  • Fix issue where inbounds passed to scatter applies only to axis-limit scaling, not cmap normalization scaling (@3d7636f2).

  • Fix issue with color-parsing due to _plot_errorshading coming after _parse_cycle rather than before (@acf545e2).

  • Fix issue where violin plots cannot be drawn without adding error bars (e.g., with means=True) or an error is raised (@c0d04835).

  • Fix issue where explicitly specifying bar[stds|pctiles] for violinplot turns off the boxes if they were not specified (and vice versa for box[stds|pctiles]) (@0edfff4e)


  • Add helpful warning message when legend detects invalid inputs rather than silently ignoring them (@b75ca185).

  • Improve warning message when users pass both colors and cmap by recommending they use edgecolor to set edges (@1067eddf).

  • Improve universal “rebuilding font cache” warning message when new users import proplot for the first time (@9abc894e).

  • Remove unused, mostly undocumented rc['axes.titleabove'] setting (@9d9d0db7). Users should be using rc['title.above'] instead.

  • Move SubplotGrid from figure.py to gridspec.py (@7b688fc8). Makes more sense there.

  • Improve organization of internal functions, add data.py, context.py, and text.py to internals and rename and re-sort related PlotAxes parsing utilities (@58ce2c95).

  • Hide the “registered” axes names (i.e., name attributes) from public API (@ece1102b). Users do not interact with the native matplotlib projection registration system.


Version 0.8.1 (2021-08-22)


  • 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 dimension reduction with e.g. barstds or barptiles no longer ignores NaN values (GH#257, @d1906fce).

  • Fix regression where legend() cannot be called without the input handles (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' (@06666296).

  • 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).


  • 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.

Version 0.8.0 (2021-08-18)


Style changes

  • 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.

  • 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).

  • 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.

  • 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.

  • 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.

  • 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).

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

  • Only modify heatmap major and minor tick locations if the default tickers are active (@6382cf91). Do not override user tickers.

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

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

  • 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.

  • 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.


  • 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).

  • 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'] = 'BuRd', rc['cmap.cyclic'] = 'twilight', and rc['cmap.qualitative'] = 'colorblind10' 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 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.

  • Add rc['colorbar.rasterize'] = False setting to control whether default colorbar solids are rasterized (@a50d5264).

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

  • 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).

  • 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).

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

  • Support expanded and consistent artist synonyms throughout plotting overrides, e.g. ec for edgecolor, lw for linewidth, fc and fillcolor for facecolor (@6382cf91). This is a superset of matplotlib.

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

  • 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 shade groups.

  • 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).

  • 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).

  • 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 (@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' (@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, controlled with keywords like rminorlocator, and thetaminorlocator (@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).


  • 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 “panel” tracking and translation of physical spacing units 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 avoid mysterious delayed 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.


  • 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).

  • Deprecate scattershot Figure immutable/documented properties (@51967ce3). These properties were just for documentation.

  • Remove ancient deprecated getters and setters for sharex, spanx, etc. once used with figure objects (@51967ce3). These properties were just for introspection, did not add any functionality.

  • Rename RcConfigurator to Configurator (@5626bc88). Previous name was redundant and needlessly verbose (the c in rc already stands for “configuration”…). This class is public just for documentation – was not directly used by users.

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

  • Make CartopyAxes and BasemapAxes private and remove the 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.

Version 0.7.0 (2021-07-11)


  • 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).

  • 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.

Style changes

  • Use proplot TeX Gyre fonts with use_style styles unless specified otherwise (@6d7444fe). Styles build on matplotlib defaults rather than proplot defaults for all other settings.

  • 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.

  • 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)

  • 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).

  • 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.

  • 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.

  • 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).

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


  • 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.

  • 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.

  • 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).

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

  • 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).


  • 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.


  • 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”.

  • Remove v0.6.0 renamed classes (e.g. ProjAxes) from top-level namespace (@442e6aa6). These classes were public just for documentation.

  • 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).

Version 0.6.4 (2020-06-13)


  • 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).

Version 0.6.3 (2020-06-02)

Bug fixes

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

Version 0.6.2 (2020-06-02)


  • 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).


  • Various improvements the API docstrings.

  • Improve overall website style (@89d6f5bd).

  • Make website “dark mode” darker (@979c8188).

  • Prevent website from flashing light mode when changing pages (@75e4d6a1).

  • Add documentation for proplot.figure.Figure.save method (@da25266a).

  • Remove Figure setters like set_sharex, replace with read-only properties (@7b455008). The getters were only for object introspection. The setters never worked properly/were unused in examples.

Version 0.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).

Version 0.6.0 (2020-05-20)


  • 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)

  • Rename the cartopy.global rc setting to cartopy.autoextent (@7c0f118a) and add an autoextent keyword (@23db0498).

  • Rename several “error indication” keyword arguments and rename add_errorbars wrapper to indicate_error (GH#166, @d8c50a8d).

  • Remove 'rgbcycle' setting (GH#166, @6653b7f0). This was complicated to implement/did not add critical functionality.

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

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

  • 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).

  • 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 MidpointNorm to more intuitive DivergingNorm, and make “fair” color scaling the default behavior (@2f549c9).

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

  • 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.

Style changes

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

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

  • 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).

  • Make default areax and areay bounds “sticky”, similar to histograms and barplots (GH#166). Also make vlines and hlines perpendicular bounds sticky if either the min/max coordinates are scalar.

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


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

  • Use _LonAxis and _LatAxis dummy axes with custom LongitudeLocator and LatitudeLocator to control geographic gridlines (GH#168). This improves accuracy of automatic gridline generation.

  • 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).

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

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

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

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

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

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

  • 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 building a colormap and DiscreteNorm inside scatter, just like contourf and pcolormesh (GH#162).

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

  • Support drawing colorbars with descending levels when input levels/values are monotonically descending lists (GH#149, @10763146)

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

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

  • 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).

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

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

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

  • 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).

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

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).

  • Fix issue where Scientific colour maps not interpreted as cyclic, so end colors not standardized properly (@e10a3109).


  • 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).


  • 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).

  • Remove the public objects normalizers, locators, formatters, cartopy_projs, basemap_kwargs, cmaps, colors, and fonts (GH#149). These objects were public just for introspection/documentation.

  • Rename rc_configurator and subplot_grid to RcConfigurator and SubplotsContainer to match capitalized class naming convention (GH#149). These classes are public just for documentation.

  • Rename XYAxes to CartesianAxes, GeoAxes to CartopyAxes, and ProjAxes to GeoAxes (GH#149, @4a6a0e34). These classes are public just for documentation.

  • Rename ColorDict to ColorDatabase, CmapDict to ColormapDatabase (GH#149, @9d7fd3e0). These classes are public just for documentation.

Version 0.5.0 (2020-02-10)


  • 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).


  • 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.


  • 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).

Version 0.4.3 (2020-01-21)


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

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


  • Use colorbar instead of imshow for show_cmaps and show_cycles displays (GH#107).

  • 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.

Version 0.4.2 (2020-01-09)


  • 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).

Version 0.4.1 (2020-01-08)


  • 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 section to docs (GH#101). To do this, conf.py auto-generates a file in _static.


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

  • Change the default .proplotrc format from YAML to the .matplotlibrc syntax (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).

Version 0.4.0 (2020-01-07)


  • 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).


  • 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 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).


  • 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).


  • 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.

Version 0.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).

Version 0.3.0 (2019-12-15)



  • 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).


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


Version 0.2.7 (2019-12-09)

Bug fixes

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



  • 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.

Version 0.2.6 (2019-12-08)

Bug fixes

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

Version 0.2.5 (2019-12-07)


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

Version 0.2.4 (2019-12-07)


  • Rename ColorCacheDict to ColorDict (@aee7d1be).

  • Rename lower-case colors to Colors (@aee7d1be)

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


  • Add params table for show_fonts (@861583f8).


  • Improve register_colors internals.

Version 0.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).


  • Organize ipython notebook documentation (@35cb21f2).


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

Version 0.2.2 (2019-12-04)


  • Rename axes_grid to subplot_grid (@ac14e9dd).

Bug fixes


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

Version 0.2.1 (2019-12-02)


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

Version 0.2.0 (2019-12-02)


  • 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).


  • 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).


  • 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.

Version 0.1.0 (2019-12-01)


  • 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.


Version 0.0.0 (2019-11-27)

The first version released on PyPi.