Revision history for Matplotlib-Simple


0.31 2026-07-25 CDT

 - Removed `Term::ANSIColor` as dependency

 - added `venn_proportional_area` as a plot helper

0.301 Unknown Release Date

 - Fixes for changes introduced in 0.30 for CPAN testers: https://www.cpantesters.org/cpan/report/143e86c6-77fa-11f1-b73a-21df6d8775ea

 - Removed files from build directory to shrink tarball

0.30 Unknown Release Date

 - non-ASCII key names (e.g. `ρ`, `τ`) no longer crash the writer. The generated-Python filehandle is now given a UTF-8 encoding layer, fixing a fatal "Wide character in say" that occurred under the module's strict-fatal warnings; the layer is added only when not already present, so a caller-supplied filehandle is never double-encoded.

 - `p` option: a flat array of subplots where one element is one subplot — a hash is a single-plot subplot, and an array of hashes is one subplot with the plots overlaid on the same axes (first hash is the base plot, the rest are additions). The two forms may be mixed in the same `p`. When no grid is given the subplots are laid out on an auto-sized near-square grid; giving only `ncol`/`nrow` (or `ncols`/`nrows`) derives the other dimension.

0.29 Unknown Release Date

 - addition of the `p` option

 - removal of SHA testing; changes in Matplotlib version 3.11 mean that SHA sums aren't compatible across different versions of Matplotlib

 - arguments can now be given as a flat hash

0.28 Unknown Release Date

 - colorbar options now work better in `scatter`.

 - Better warning when color key isn't defined for `scatter`

 - When giving two hash of hashes for a barplot, if one second key is defined in one subplot, but not the other, that subkey is initialized to 0.

 [Cross-platform support]

 - The module now should run on Windows in addition to Linux and macOS.

 - The generated Python script is written to the system temporary directory (via `File::Spec->tmpdir()`) instead of a hard-coded `/tmp`, which does not exist on Windows.

 - The Python interpreter is now discovered automatically by probing, in order, `python3`, `python`, and the Windows `py` launcher, accepting the first that reports Python 3. This fixes Windows, where the interpreter is typically named `python` (not `python3`), and correctly rejects the Microsoft Store `python3` stub and any Python 2. Set the `MPLS_PYTHON` (or `PYTHON`) environment variable to override the interpreter with a specific name or full path.

 - The Python script is now executed with the list form of `system` rather than a single shell string, so script paths containing spaces (common on Windows, e.g. `C:\Users\First Last\AppData\Local\Temp`) no longer break execution.

 - The `Creator` metadata embedded in the output file is now passed through `write_data` (base64), so Windows paths containing backslashes no longer produce invalid escape sequences (e.g. `\U` in `C:\Users`) in the generated Python string literal.

 - On Windows, `Win32::Console::ANSI` is loaded if available (it is optional, not a hard dependency) so colored status messages render on legacy consoles.

 [Crashes / generated-code fixes]

 - `violinplot` is now a callable wrapper; it was exported and dispatched but never defined, so calling it died with "Undefined subroutine".

 - `hist` with an array of `bins` no longer emits a stray double-quote (e.g. `[0,2,4"]`) that caused a Python `SyntaxError`.

 - `hexbin` and `hist2d` no longer pass `cblabel` twice (once inside the option string and again as `label => ...`), which previously caused a duplicate-keyword `SyntaxError`.

 - `scatter` with a scalar `set.options` no longer emits a doubled comma (`scatter(x, y, , ...)`), which was a `SyntaxError`.

 - Stacked `barh` now uses the `left` keyword for stacking instead of `bottom`, which collided with `barh`'s own `bottom` (y-position) parameter and raised "got multiple values for keyword argument 'bottom'".

 - `colored_table` with `cb_logscale` together with `cb_min`/`cb_max` no longer emits `LogNorm(, vmin=...)` with a leading comma (a `SyntaxError`).

 - `plot` with a hash of data and a scalar `set.options` no longer crashes by dereferencing a string as a hash under `strict refs`.

 - `plot` with a hash of data now accepts a scalar `twinx` naming a data key (e.g. `twinx => 'pressure'`); previously the value was wrongly required to be a digit string, making key-named `twinx` impossible.

 - Grouped bar plots with a single scalar `color` (e.g. `color => 'green'`) no longer crash trying to dereference the string as an array; the color is applied to all series.

 [Incorrect-output fixes]

 - `colored_table` no longer clobbers asymmetric data: filling undefined cells with `np.nan` previously also overwrote the mirror cell, destroying defined values (if `A->B` was defined but `B->A` was not, both became `NaN`).

 - `colored_table` now honors `cb_min` and `cb_max`; they were read from the wrong hash (`$args` instead of the plot options) and so were silently ignored.

 - `colored_table` now honors the `cmap` option; the color map and `set_bad` color were hard-coded to `gist_rainbow` regardless of the `cmap` given. The colormap is copied before calling `set_bad`, as registered colormaps are immutable in current matplotlib.

 - `colored_table` default row labels now mirror the column labels, matching the matrix that is actually built; with asymmetric data the old default could produce a row-label count mismatch ("'rowLabels' must be of length N").

 - `scatter` (single set, three keys) now honors the `cmap` option instead of always using `gist_rainbow`.

 - `scatter` now validates undefined values in *both* coordinate keys; the undefined-data check previously inspected only the first key.

 - Grouped, non-stacked bar widths are now divided by the number of bar series (plus one), not by a constant; the old divisor came from a hash that always held exactly one key, so groups with more than a few series overlapped their neighbors.

 - The `wide` plot no longer clamps the upper standard-deviation band at `1`; that clamp assumed data in the range `[0, 1]` and clipped ordinary data (the documented example reaches roughly `1.9`).

 - Numeric arguments to `plt` methods (e.g. `margins => 0.2`) are no longer quoted into strings; `print_type` now recognizes numbers.

 - `plt.show()` is now emitted after `plt.savefig()` (and only once), so using `show` no longer writes the file only after the interactive window is closed; `output.file` is no longer required when `show` is requested.

 - The `add` overlay's `plot.type` now correctly falls back to the parent plot's type when omitted, in both single- and multi-plot calls; the fallback was previously unreachable dead code, and an undefined type could be dispatched on.

 [Cleanups]

 - Removed corrupted entries from the method whitelists (`'set_mouseover( '` and a leading-space `' FixedFormatter'`) that made those options unusable.

 - Removed a stray default applied to the wrong hash in `violin`, two empty dead `if` blocks, and a duplicated `die`.

0.27 Unknown Release Date

 - Better warnings for undefined data in `scatter`

 - `color_key` didn't work properly for multiple sets of data in `scatter`, which has now been fixed

0.26 Unknown Release Date

 - `ncol` & `nrow` are synonymous with `ncols` and `nrows` respectively; testing now reflects these two specifically numeric options

 - no longer exports Data::Printer and Devel::Confess with the module, but is still used inside the module

 - 'show.legend' option added to "hist", which is automatically turned off if there is only 1 group

 - "add" group is no longer deleted

 - "boxplot", "hist", and "violin" can take a single array, simplifying calls without requiring useless single keys when calling a single distribution

 - `cb_min` and `cb_max` now work for colored_table

 - "write_data" is no longer used in hist, as it prints numbers as strings (python3's types are a headache)

 - Instead, all values are checked in hist for being numeric before being sent to "write_data"

 - re-use undefined error array in hist_helper (slightly less RAM use)

0.25 Unknown Release Date

 - re-used error array in scatter_helper

 - better warnings for undefined values in multiple-set scatterplots

 - fixed bug in scatterplot, where different sets would have the same label

 - "logscale" now available with "boxplot, "hist", "plot", "scatter"

 - $VERSION now prints with metadata for SVG output files, which required minor changes to testing

 - slightly better warnings in plot_helper

 - removed duplicate check from hist2d_helper

 - better warnings if wrong data types are given to "add"

 - Fixed bug in scatterplot, where color key could repeat on axes

 - colorbar can now be in logscale for colored_table

0.24 Unknown Release Date
 - Newlines are now possible in key names for barplot and pie; other characters may be fixed too

 - @prop_cycle is only now taking RAM/valid where it's needed

 - new dependencies in JSON::MaybeXS and MIME::Base64 to prevent errors in key names

 - slight improvement in violinplot: "print" changed to "say" (1 less concatenation)

 - dynamic method wrappers are used, which save ~120 lines of code

 - re-used error array in "plt" to save RAM

 - better warning for non-File::Temp objects

 - more tests for wrapper subroutines

 - duplicate check removed from hexbin_helper

 - removed whiskers option from boxplot_helper, which didn't work the way that I thought that it did

 - removed shebang, which isn't necessary in .pm files

 - hist2d was missing an option for logscale on the axes, which it now has

0.23 Unknown Release Date

 - colors for bar plots can be defined by hashes; e.g. colors => {A => 'red', B => 'green'}, etc

0.22 Unknown Release Date

 - minor under-the-hood changes; "execute" subroutine, which was only called once, is now built into "plt" to save a function call; execution should be slightly faster/more efficient

0.21 Unknown Release Date

 - "show" now works; files are still output if specified

0.20 Unknown Release Date
 - better warnings for incomplete data in "plot"
   "plot" can plot with "twinx" when data is given in array or hash form
   "tick_params" is removed from plt methods
   fewer "my" for error arrays, using empty arrays from earlier; should increase efficiency slightly
   added tests for twinx in plot for both array and hash variants

