NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #2596 most downloaded on PyPI
Scales for Python
Last release 27 days ago
07 Sep 2026
Release timing varies
gaps range from 8 days to 7 months
Nearly every release is documented
notes for 51 of 52 stable releases
1 version withdrawn
withdrawn after publishing
10 years old
53 releases · first in 2016
Fix numpy.timedelta DeprecationWarning on import by @davidnewman-ont in #72
Full Changelog: v0.14.5...v0.14.6
2026-09-07
breaks_extended accepts a pair for only_inside , one flag per end, so a break sequence can be held inside the limits at one end and allowed past them at the other.
One column per quarter.
2026-09-07
~mizani.breaks.breaks_extended accepts a pair for only_inside, one flag per end, so a break sequence can be held inside the limits at one end and allowed past them at the other.
Fix named Brewer palettes selecting the wrong type by @has2k1 in #75
Full Changelog: v0.14.4...v0.14.5
2026-09-04
brewer_pal() now resolves a named palette to its own type, so the name no longer has to match the type argument. brewer_pal(palette="Set2") now works even though type defaults to sequential and Set2 is qualitative. An unknown name raises a ValueError listing the valid names. This resolves (plotnine #1048) .
Fall back to pandas to recognise null types by @has2k1 in #69
Full Changelog: v0.14.3...v0.14.4
2026-01-28
Fixed handling of null types so that we can recognise as null whatever pandas sees as null. This resolves (plotnine #1021) .
Fixed bug in hue_pal where drawing 24 or more colors broke the palette and you got colors from a very narrow hue band close to the first color.
hue_pal where drawing 24 or more colors broke the palette and you got colors from a very narrow hue band close to the first color.Full Changelog: v0.14.2...v0.14.3
2025-10-30
Fixed bug in hue_pal() where drawing 24 or more colors broke the palette and you got colors from a very narrow hue band close to the first color.
2025-10-30
Fixed bug in ~mizani.palettes.hue_pal where drawing 24 or more colors broke the palette and you got colors from a very narrow hue band close to the first color.
Nothing new, only fixed bad test cases that were failing for the upcoming python 3.14 release.
Nothing new, only fixed bad test cases that were failing for the upcoming python 3.14 release.
2025-06-30
Fixed test cases that were failing for the upcoming python 3.14 release.
Fixed but in to_rgba() used by plotnine to recognise numpy integers and floats as alpha values. And also to recognise None and and an empty string to
to_rgba() used by plotnine to recognise numpy integers and floats as alpha values. And also to recognise None and and an empty string to also mean "none", which is recognised by Matplotlib.2025-06-24
Fixed but in ~mizani._colors.to_rgba used by plotnine to recognise numpy integers and floats as alpha values. And also to recognise None and and an empty string to also mean "none", which is recognised by Matplotlib.
Changed hue_pal to use HCL color space from HSL (or HSLuv) space. The previous functionality is now available with hls_pal.
2025-06-18
Changed ~mizani.palettes.hue_pal to use HCL color space from HSL (or HSLuv) space. The previous functionality is now available with ~mizani.palettes.hls_pal.
~mizani.breaks.breaks_date now only accepts parameter n, the desired number of breaks. To generate breaks by the width, use ~mizani.breaks.breaks_date_width.
Added tableau color in the "tab:*" colorname space. e.g. "tab:red".
~mizani.breaks.breaks_width to generate numeric breaks by specifying the width (interval between the breaks).
~mizani.breaks.breaks_timedelta_width to generate timedelta breaks by specifying the width (interval between the breaks).
Added name "gray" aliases to all XKCD colors partially named "grey".
New algorithms to calculate datetime breaks by either n the desired number of breaks or width the interval between the breaks. When using the new ~mizani.breaks.breaks_date_width, you can align the dates by using an offset. (58)
Fixed using a discrete palette and requesting less colours than than the smallest swatch in the palette. Among the affected palettes are category10 ,
category10, category20, category20b, category20c.Full Changelog: v0.13.4...v0.13.5
2025-05-02
Fixed using a discrete palette and requesting less colours than than the smallest swatch in the palette. Among the affected palettes are category10 , category20 , category20b , category20c .
Added aliases to the vega colormaps for the names used in matplotlib. (plotnine issue #938 )
Added aliases to the vega colormaps for the names used in matplotlib. (plotnine issue #938)
2025-05-02
Added aliases to the vega colormaps for the names used in matplotlib. plotnine issue [#938]
Make it possible to train discrete data that is a sequence of tuples. (plotnine issue #933 )
Enhancements
2025-04-11
Make it possible to train discrete data that is a sequence of tuples. plotnine issue [#933]
- For python >=3.13 ~mizani.bounds.squish_infinite and ~mizani.bounds.squish do not warning about invalid values when passed arrays with dtype=uint64
2025-04-03
For python >=3.13 ~mizani.bounds.squish_infinite and ~mizani.bounds.squish do not warning about invalid values when passed arrays with dtype=uint64 and a range with negative values.
- Type checking pass with numpy 2.2.
2024-12-10
Type checking pass with numpy 2.2.
- mizani.transforms.trans_new function has been deprecated.
2024-10-24
Support for numpy timedelta64 has been removed. It was not well supported in the first place, so removing it should be of consequence.
mizani.transforms.trans_new function has been deprecated.
~mizani.breaks.breaks_date has been slightly improved for the case when it generates monthly breaks.
trans gained new method diff_type_to_num that should be helpful with some arithmetic operations for non-numeric domains.
- Fixed squish and squish_infinite to work for non writeable pandas series. This is broken for numpy 2.1.0.
2024-09-04
Fixed squish and squish_infinite to work for non writeable pandas series. This is broken for numpy 2.1.0.
2024-09-04
Fixed ~mizani.bounds.squish and ~mizani.bounds.squish_infinite to work for non writeable pandas series. This is broken for numpy 2.1.0.
- Renamed "husl" color palette type to "hsluv". "husl" is the old name but we still work although not part of the API.
2024-08-19
Renamed "husl" color palette type to "hsluv". "husl" is the old name but we still work although not part of the API.
2024-08-19
Renamed "husl" color palette type to "hsluv". "husl" is the old name but we still work although not part of the API.
- mizani now requires python 3.9 and above.
2024-07-30
mizani now requires python 3.9 and above.
Fixed bug where a date with a timezone could lose the timezone. #45 .
2024-07-30
mizani now requires python 3.9 and above.
Fixed bug where a date with a timezone could lose the timezone. 45.
2024-05-24
2024-05-09
2024-04-26
2024-03-27
2024-02-12
- mpl_format has been removed, number_format takes its place.
2023-07-28
mpl_format has been removed, number_format takes its place.
mpl_breaks has been removed, extended_breaks has always been the default and it is sufficient.
matplotlib has been removed as a dependency of mizani.
mizani now requires python 3.9 and above.
The units parameter for of timedelta_format now accepts the values "min", "day", "week", "month" , instead of "m", "d", "w", "M" .
The naming convention for break formatting methods has changed from format to label . Specifically these methods have been renamed.
comma_format is now label_comma
custom_format is now label_custom
currency_format is now label_currency
label_dollar is now label_dollar
percent_format is now label_percent
scientific_format is now label_scientific
date_format is now label_date
number_format is now label_number
log_format is now label_log
timedelta_format is now label_timedelta
pvalue_format is now label_pvalue
ordinal_format is now label_ordinal
number_bytes_format is now label_bytes
The naming convention for break calculating methods has changed from breaks to breaks . Specifically these methods have been renamed.
log_breaks is now breaks_log
trans_minor_breaks is now minor_breaks_trans
date_breaks is now breaks_date
timedelta_breaks is now breaks_timedelta
extended_breaks is now breaks_extended
dataspace_is_numerical has changed to domain_is_numerical and it is now determined dynamically.
The default minor_breaks for all transforms that are not linear are now calculated in dataspace. But only if the dataspace is numerical.
symlog_trans for symmetric log transformation
2023-07-28
~mizani.formatters.mpl_format has been removed, ~mizani.formatters.number_format takes its place.
~mizani.breaks.mpl_breaks has been removed, ~mizani.breaks.extended_breaks has always been the default and it is sufficient.
matplotlib has been removed as a dependency of mizani.
mizani now requires python 3.9 and above.
The units parameter for of ~mizani.formatters.timedelta_format now accepts the values "min", "day", "week", "month", instead of "m", "d", "w", "M".
The naming convention for break formatting methods has changed from *_format to label_*. Specifically these methods have been renamed.
comma_format is now ~mizani.formatters.label_comma
custom_format is now ~mizani.formatters.label_custom
currency_format is now ~mizani.formatters.label_currency
label_dollar is now ~mizani.formatters.label_dollar
percent_format is now ~mizani.formatters.label_percent
scientific_format is now ~mizani.formatters.label_scientific
date_format is now ~mizani.formatters.label_date
number_format is now ~mizani.formatters.label_number
log_format is now ~mizani.formatters.label_log
timedelta_format is now ~mizani.formatters.label_timedelta
pvalue_format is now ~mizani.formatters.label_pvalue
ordinal_format is now ~mizani.formatters.label_ordinal
number_bytes_format is now ~mizani.formatters.label_bytes
The naming convention for break calculating methods has changed from *_breaks to breaks_*. Specifically these methods have been renamed.
log_breaks is now ~mizani.breaks.breaks_log
trans_minor_breaks is now ~mizani.breaks.minor_breaks_trans
date_breaks is now ~mizani.breaks. breaks_date
timedelta_breaks is now ~mizani.breaks. breaks_timedelta
extended_breaks is now ~mizani.breaks. breaks_extended
~mizani.transforms.trans.dataspace_is_numerical has changed to ~mizani.transforms.trans.domain_is_numerical and it is now determined dynamically.
The default minor_breaks for all transforms that are not linear are now calculated in dataspace. But only if the dataspace is numerical.
~mizani.transforms.symlog_trans for symmetric log transformation
Nothing published for this version
- Fixed regression in but in date_format where it cannot deal with UTC timezone from timezone #30 .
2023-05-25
Fixed regression in but in date_format where it cannot deal with UTC timezone from timezone #30 .
2023-05-25
Fixed regression in but in ~mizani.formatters.date_format where it cannot deal with UTC timezone from ~datetime.timezone 30.
- Fixed but in date_format to handle datetime sequences within the same timezone but a mixed daylight saving state. (plotnine #687)
2023-05-19
Fixed but in date_format to handle datetime sequences within the same timezone but a mixed daylight saving state. (plotnine #687)
2023-05-19
Fixed but in ~mizani.formatters.date_format to handle datetime sequences within the same timezone but a mixed daylight saving state. (plotnine #687)
- palettable dropped as a dependency.
2023-04-15
palettable dropped as a dependency.
Fixed bug in datetime_trans where a pandas series with an index that did not start at 0 could not be transformed.
Install tzdata on pyiodide/emscripten. #27
2023-04-15
palettable dropped as a dependency.
Fixed bug in ~mizani.transforms.datetime_trans where a pandas series with an index that did not start at 0 could not be transformed.
Install tzdata on pyiodide/emscripten. 27
- Fixed regression bug in log_format for where formatting for bases 2, 8 and 16 would fail if the values were float-integers.
2022-09-28
Fixed regression bug in log_format for where formatting for bases 2, 8 and 16 would fail if the values were float-integers.
log_format now uses exponent notation for bases other than base 10.
2022-09-28
Fixed regression bug in ~mizani.formatters.log_format for where formatting for bases 2, 8 and 16 would fail if the values were float-integers.
~mizani.formatters.log_format now uses exponent notation for bases other than base 10.
- The lut parameter of cmap_pal and cmap_d_pal has been deprecated and will removed in a future version.
2022-09-26
The lut parameter of cmap_pal and cmap_d_pal has been deprecated and will removed in a future version.
datetime_trans gained parameter tz that controls the timezone of the transformation.
log_format gained boolean parameter mathtex for TeX values as understood matplotlib instead of values in scientific notation.
Fixed bug in zero_range where uint64 values would cause a RuntimeError.
2022-09-26
The lut parameter of ~mizani.palettes.cmap_pal and ~mizani.palettes.cmap_d_pal has been deprecated and will removed in a future version.
~mizani.transforms.datetime_trans gained parameter tz that controls the timezone of the transformation.
~mizani.formatters.log_format gained boolean parameter mathtex for TeX values as understood matplotlib instead of values in scientific notation.
Fixed bug in ~mizani.bounds.zero_range where uint64 values would cause a RuntimeError.
- comma_format is now imported automatically when using * .
2022-04-02
comma_format is now imported automatically when using * .
Fixed issue with scale_discrete so that if you train on data with Nan and specify and old range that also has NaN , the result range does not include two NaN values.
2022-04-02
~mizani.formatters.comma_format is now imported automatically when using *.
Fixed issue with ~mizani.scales.scale_discrete so that if you train on data with Nan and specify and old range that also has NaN, the result range does not include two NaN values.
- Fixed log_breaks for narrow range if base=2 ( #76 ).
(2020-10-29)
Fixed log_breaks for narrow range if base=2 ( #76 ).
- Fixed bug in rescale_max() to properly handle values whose maximum is zero ( #16 ).
(2020-10-29)
Fixed bug in rescale_max() to properly handle values whose maximum is zero ( #16 ).
(2020-10-29)
Fixed bug in ~mizani.bounds.rescale_max to properly handle values whose maximum is zero (16).
- Fixed regression in mizani.scales.scale_discrete.train() when trainning on values with some categoricals that have common elements.
(2020-06-05)
Fixed regression in mizani.scales.scale_discrete.train() when trainning on values with some categoricals that have common elements.
(2020-06-05)
Fixed regression in mizani.scales.scale_discrete.train when trainning on values with some categoricals that have common elements.
- Fixed issue with mizani.formatters.log_breaks where non-linear breaks could not be generated if the limits where greater than the largest integer sy
(2020-06-04)
Fixed issue with mizani.formatters.log_breaks where non-linear breaks could not be generated if the limits where greater than the largest integer sys.maxsize .
Fixed mizani.palettes.gradient_n_pal() to return nan for nan values.
Fixed mizani.scales.scale_discrete.train() when training categoricals to maintain the order. (plotnine #381)
mizani.breaks.date_breaks now supports intervals in the order of seconds.
(2019-08-15)
Added pvalue_format
Added ordinal_format
Added number_bytes_format
Added pseudo_log_trans()
Added reciprocal_trans
Added modulus_trans()
mizani.breaks.date_breaks now supports intervals in the order of seconds.
mizani.palettes.brewer_pal now supports a direction argument to control the order of the returned colors.
boxcox_trans() now only accepts positive values. For both positive and negative values, modulus_trans() has been added.
(2019-08-15)
Added ~mizani.formatters.pvalue_format
Added ~mizani.formatters.ordinal_format
Added ~mizani.formatters.number_bytes_format
Added ~mizani.transforms.pseudo_log_trans
Added ~mizani.transforms.reciprocal_trans
Added ~mizani.transforms.modulus_trans
order of seconds.
mizani.palettes.brewer_pal now supports a direction argument to control the order of the returned colors.
~mizani.transforms.boxcox_trans now only accepts positive values. For both positive and negative values, ~mizani.transforms.modulus_trans has been added.
- mizani.formatters.log_format now does a better job of approximating labels for numbers like 3.000000000000001e-05 .
(2019-03-26)
mizani.formatters.log_format now does a better job of approximating labels for numbers like 3.000000000000001e-05 .
(2019-03-26)
mizani.formatters.log_format now does a better job of approximating labels for numbers like 3.000000000000001e-05.
(2018-12-24)
- Fixed issue where some functions that took pandas series would return output where the index did not match that of the input.
(2018-10-17)
Fixed issue where some functions that took pandas series would return output where the index did not match that of the input.
(2018-10-17)
Fixed issue where some functions that took pandas series would return output where the index did not match that of the input.
- Fixed issue with log_breaks , so that it does not fail needlessly when the limits in the (0, 1) range.
(2018-10-15)
Fixed issue with log_breaks , so that it does not fail needlessly when the limits in the (0, 1) range.
Changed log_format to return better formatted breaks.
(2018-10-15)
Fixed issue with ~mizani.breaks.log_breaks, so that it does not fail needlessly when the limits in the (0, 1) range.
Changed ~mizani.formatters.log_format to return better formatted breaks.
- Support for python 2 has been removed.
(2018-11-10)
Support for python 2 has been removed.
call() and meth: ~mizani.breaks.trans_minor_breaks.call now accept optional parameter n which is the number of minor breaks between any two major breaks.
The parameter nan_value has be renamed to na_value .
The parameter nan_rm has be renamed to na_rm .
Better support for handling missing values when training discrete scales.
Changed the algorithm for log_breaks , it can now return breaks that do not fall on the integer powers of the base.
(2018-11-10)
Support for python 2 has been removed.
meth:~mizani.breaks.trans_minor_breaks.call now accept optional parameter n which is the number of minor breaks between any two major breaks.
The parameter nan_value has be renamed to na_value.
The parameter nan_rm has be renamed to na_rm.
Better support for handling missing values when training discrete scales.
Changed the algorithm for ~mizani.breaks.log_breaks, it can now return breaks that do not fall on the integer powers of the base.
(2018-03-20) - Added squish
(2018-03-20)
Added squish
(2018-03-09) - Added identity_pal - Added cmap_d_pal
(2018-03-09)
Added identity_pal
Added cmap_d_pal
- Fixed date_format to respect the timezones of the dates ( #8 ).
(2017-12-13)
Fixed date_format to respect the timezones of the dates ( #8 ).
- Changed date_breaks to have more variety in the spacing between the breaks.
(2017-12-01)
Changed date_breaks to have more variety in the spacing between the breaks.
Fixed date_format to respect time part of the date ( #7 ).
(2017-12-01)
Changed ~mizani.breaks.date_breaks to have more variety in the spacing between the breaks.
Fixed ~mizani.formatters.date_format to respect time part of the date (7).
- Fixed (regression) break calculation for the non ordinal transforms.
(2017-11-06)
Fixed (regression) break calculation for the non ordinal transforms.
- trans objects can now be instantiated with parameter to override attributes of the instance. And the default methods for computing breaks and minor
(2017-11-04)
trans objects can now be instantiated with parameter to override attributes of the instance. And the default methods for computing breaks and minor breaks on the transform instance are not class attributes, so they can be modified without global repercussions.
(2017-11-04)
~mizani.transforms.trans objects can now be instantiated with parameter to override attributes of the instance. And the default methods for computing breaks and minor breaks on the transform instance are not class attributes, so they can be modified without global repercussions.
- Breaks and formatter generating functions have been converted to classes, with a __call__ method. How they are used has not changed, but this makes
(2017-10-24)
Breaks and formatter generating functions have been converted to classes, with a call method. How they are used has not changed, but this makes them move flexible.
ExtendedWilkson class has been removed. extended_breaks() now contains the implementation of the break calculating algorithm.
(2017-10-24)
Breaks and formatter generating functions have been converted to classes, with a __call__ method. How they are used has not changed, but this makes them move flexible.
ExtendedWilkson class has been removed. ~mizani.breaks.extended_breaks now contains the implementation of the break calculating algorithm.
- Fixed issue where some formatters methods failed if passed empty breaks argument.
(2017-09-12)
Fixed issue where some formatters methods failed if passed empty breaks argument.
Fixed issue with log_breaks() where if the limits were with in the same order of magnitude the calculated breaks were always the ends of the order of magnitude.
Now log_breaks ()(( 35 , 50 )) returns [35, 40, 45, 50] as breaks instead of [1, 100] .
(2017-09-12)
Fixed issue where some formatters methods failed if passed empty breaks argument.
Fixed issue with ~mizani.breaks.log_breaks where if the limits were with in the same order of magnitude the calculated breaks were always the ends of the order of magnitude.
Now log_breaks()((35, 50)) returns [35, 40, 45, 50] as breaks instead of [1, 100].
- Fixed SettingWithCopyWarnings in squish_infinite() .
(2017-08-30)
Fixed SettingWithCopyWarnings in squish_infinite() .
Added log_format() .
Added log_trans now uses log_format() as the formatting method.
(2017-08-30)
Fixed SettingWithCopyWarnings in ~mizani.bounds.squish_infinite.
Added ~mizani.formatters.log_format.
Added ~mizani.transforms.log_trans now uses ~mizani.formatters.log_format as the formatting method.
- Added expand_range_distinct()
(2017-07-14)
Added expand_range_distinct()
- Fixed bug where using log_breaks() with Numpy 1.13.0 led to a ValueError .
(2017-06-22)
Fixed bug where using log_breaks() with Numpy 1.13.0 led to a ValueError .
- Added xkcd_palette() , a palette that selects from 954 named colors.
(2017-04-24)
Added xkcd_palette() , a palette that selects from 954 named colors.
Added crayon_palette() , a palette that selects from 163 named colors.
Added cubehelix_pal() , a function that creates a continuous palette from the cubehelix system.
Fixed bug where a color palette would raise an exception when passed a single scalar value instead of a list-like.
extended_breaks() and mpl_breaks() now return a single break if the limits are equal. Previous, one run into an Overflow and the other returned a sequence filled with n of the same limit.
mpl_breaks() now returns a function that (strictly) expects a tuple with the minimum and maximum values.
(2017-04-24)
Added ~mizani.palettes.xkcd_palette, a palette that selects from 954 named colors.
Added ~mizani.palettes.crayon_palette, a palette that selects from 163 named colors.
Added cubehelix_pal, a function that creates a continuous palette from the cubehelix system.
Fixed bug where a color palette would raise an exception when passed a single scalar value instead of a list-like.
~mizani.breaks.extended_breaks and ~mizani.breaks.mpl_breaks now return a single break if the limits are equal. Previous, one run into an Overflow and the other returned a sequence filled with n of the same limit.
~mizani.breaks.mpl_breaks now returns a function that (strictly) expects a tuple with the minimum and maximum values.
- Fixed bug in censor() where a sequence of values with an irregular index would lead to an exception.
(2017-01-27)
Fixed bug in censor() where a sequence of values with an irregular index would lead to an exception.
Fixed boundary issues due internal loss of precision in ported function seq() .
Added mizani.breaks.extended_breaks() which computes breaks using a modified version of Wilkinson's tick algorithm.
Changed the default function mizani.transforms.trans.breaks_() used by mizani.transforms.trans to compute breaks from mizani.breaks.mpl_breaks() to mizani.breaks.extended_breaks() .
mizani.breaks.timedelta_breaks() now uses mizani.breaks.extended_breaks() internally instead of mizani.breaks.mpl_breaks() .
Added manual palette function mizani.palettes.manual_pal() .
Requires pandas version 0.19.0 or higher.
(2017-01-27)
Fixed bug in ~mizani.bounds.censor where a sequence of values with an irregular index would lead to an exception.
Fixed boundary issues due internal loss of precision in ported function ~mizani.utils.seq.
Added mizani.breaks.extended_breaks which computes breaks using a modified version of Wilkinson's tick algorithm.
Changed the default function mizani.transforms.trans.breaks_ used by mizani.transforms.trans to compute breaks from mizani.breaks.mpl_breaks to mizani.breaks.extended_breaks.
mizani.breaks.timedelta_breaks now uses mizani.breaks.extended_breaks internally instead of mizani.breaks.mpl_breaks.
Added manual palette function mizani.palettes.manual_pal.
Requires pandas version 0.19.0 or higher.
(2016-06-30) First public release
(2016-06-30)
First public release
Your coding agent can read these notes before it upgrades. Set up the MCP server →