.. image:: ../artwork/toyplot.png :width: 200px :align: right .. _release-notes: Release Notes ============= Toyplot 2.1.0 - March 19th, 2026 -------------------------------- * Toyplot requires Numpy >= 2.0.0, consequently Python 3.8 is no longer supported. * Added support for Python 3.13 and 3.14. * Added `toyplot.hou` module providing integration with SideFX Houdini, https://sidefx.com. * Removed deprecated `numpy.row_stack` calls - thanks to @harmsm! * Added support for cubic paths in rendered outputs - thanks to @eaton-lab! * Numerous fixes for problems with markers, styles and extents, ensuring data never gets clipped - thanks to @eaton-lab! Toyplot 2.0.0 - September 23rd, 2024 ------------------------------------ * Added support for Numpy 2 - thanks to @harmsm! * Removed all animation-related functionality. * Switched to modern Python packaging tools. * Added Python 3.11 and 3.12 testing. Toyplot 1.0.3 - October 12th, 2022 ---------------------------------- * Use matrix multiplication to transform text - thanks to @eaton-lab! * Some experiments with computational-graph based layout. Toyplot 1.0.2 - August 24th, 2022 --------------------------------- * Replace deprecated Numpy calls for compatibility with Numpy 1.22 - thanks to @harmsm! Toyplot 1.0.1 - Febrary 18th, 2022 ---------------------------------- * Officially compatible with Python 3.10. * Corrected usage of deprecated collections API - thanks to @StuntsPT! * Began exploring Graphcat - https://graphcat.readthedocs.io - as the basis for future Toyplot versions. Toyplot 1.0.0 - January 6th, 2022 --------------------------------- * First stable release of the Toyplot API! * Switched to nbsphinx for notebook-based documentation. * Added a violin plot case study. * DOM testing was broken by changes to Python dict key ordering behavior. * Require Arrow >= 1.0, and fix calls to obsolete Arrow API. * toyplot.mp4 module can be imported even if ffmpeg isn't available. * Switched to Github Actions for continuous integration. * Switched to Github Discussions for support. Toyplot 0.19.0 - April 21st, 2020 --------------------------------- * First Toyplot release that only supports Python 3. * Colormaps return the first color instead of the last when the domain is empty. * The `target` attribute is supported in rich text hyperlinks, useful for opening hyperlinks in separate tabs from Juypter notebooks. * Provide an explicit default style for rich text hyperlinks, for consistent default outputs regardless of render context. * Add rich text support for styling underlines. * `toyplot.locator.Timestamp` didn't produce correctly positioned labels in some cases with non-UTC timezones. * Warn callers who try to use with Python 2. * Markers and marks are formattable objects, for easier embedding in rich text. * Switched to an explicit scenegraph to manage relationships among internal objects. * Fixed a bug that affect the domain and range of shared axes. * Expanded the user guide section on rendering. * Include the LICENSE file in source distributions, for downstream maintainers. * Fixed code that used obsolete Pandas ix API. Toyplot 0.18.0 - December 24th, 2018 ------------------------------------ * This will be the final release of Toyplot with Python 2 support! * Added unit and currency formatting classes, courtesy of @ben-cunningham and @dahuget. * Reduced code duplication in the `toyplot.format` module. * Canvas borders are supported in PDF output. * Improved output previewing `toyplot.data.Table` in Jupyter notebooks. * Added ellipse visualizations. * Added hyperlink support for bar visualizations. * Redesigned `toyplot.mark.Rect` as `toyplot.mark.Range`, and added range visualization on numberlines. * Converted all remaining regression tests from nose to behave. * `toyplot.canvas.Canvas.matrix` formats cell titles properly. * Redesigned regression tests to use the DOM for comparisons. * Documentation notebooks are included in regression testing. * Documentation notebooks are included in coverage testing. * `toyplot.reportlab` backend ignores hyperlinks instead of failing. Toyplot 0.17.0 - April 1st, 2018 -------------------------------- * Moved sample datasets into the `toyplot.data` module. * toyplot.mp4.render() generates H.264 output. * Restored `toyplot.canvas.AnimationFrame.set_datum_text()`, which was broken by the debut of rich text. * Use the Python warnings module for deprecation warnings. * Disabled pylint testing on Travis-CI, it was too much of a moving target. * Simplified the animation API. * Switched to Python 3 as the primary build and test environment. * Removed obsolete dependencies from the Travis build. * Disabled PNG downscaling for ghostscript versions < 9.14. * Table cell data can be rotated. * Moved image manipulation into a new `toyplot.bitmap` module. * Added a bitdepth option to `toyplot.bitmap.to_png()`. * Allow default canvas width and height to be set in `toyplot.config`. * Fixed a false-positive comparing XML documents. * Explicit colormap domains aren't required for toyplot.canvas.matrix(). Toyplot 0.16.0 - October 26th, 2017 ----------------------------------- * The -toyplot-anchor-shift property didn't affect text layout extents correctly - thanks to Deren Eaton. * Corrected a broken link in the documentation - thanks to Github user @kannes. * Removed the dependency on colormath, which is currently broken by an API change in networkx. * Replaced toyplot.compatibility with six, since the latter is already a transitive dependency. * Replaced toyplot.color.near_black with toyplot.color.black * A hyperlink can be set for an entire canvas. * A hyperlink can be set for a set of Cartesian axes. * Per-datum hyperlinks can be set for scatterplots. * Moved documentation- and test-specific code out of the main library. * Set a reasonable stroke width when drawing text layout boxes for troubleshooting. * Clarified in the documentation how tick locators can affect the visible domain. * Corrected copy-n-paste errors in many docstrings. * Fixed many broken documentation crosslinks. * Supplied many missing docstrings. * Removed the WebM rendering backend, which has been broken and unused for a long time. Toyplot 0.15.1 - July 27, 2017 ------------------------------ * Markers can be embedded in any text, including tick marks, legends, labels, and table contents. * Hyperlinks can be embedded in any text using the tag. * Legends are implemented using table coordinates, so legends can be customized using any table feature. * Started a new documentation section for case-studies, with graph community and neural network examples. * Started a new section in the documentation for projects using Toyplot. * Callers can define their own custom marks, and modify rendering for existing marks, using the new rendering API. * Defined a new API for embedding Javascript in HTML markup, for use with custom marks. * Graph visualizations can export vertex and edge data as CSV tables. * Added support for head, middle, and tail markers on graph edges. * Added an `offset` property for Cartesian axis labels. * Toyplot colors are allowed as style property values. * Per-series and per-datum colors can be specified using Python sequences as well as numpy arrays. * Error messages specify which CSS properties are allowed. * Deprecated the `gutter` parameter in favor of `margin`, which can specify separate left / right / top / bottom margins, if desired. * Added `toyplot.html.tostring()` to simplify generating HTML. * Added a style option to `toyplot.html.render()` and `toyplot.html.tostring()`. * Added a `palette` argument to override the default series palette when creating axes. * Text markup didn't include units for font-size, causing incorrect results on Firefox. Toyplot 0.14.0 - April 17, 2017 ------------------------------- * Completely new text layout that explicitly positions all text. * Experimental support for hyperlinks in table cells. * Return a scalar instead of an array when accessing toyplot.data.Table using a single column name and row index. * Correct a bug that caused text baselines to be computed incorrectly in PDF output. * Add pylint to the regression test suite. * Allow font-family to be used in inline rich text styles. * Created an API to retrieve font metrics. * Disable obnoxious colormath logging by default. * Mention XML escaping for rich text in the user guide. * The "<" and ">" markers were rendered reversed. * Eliminate warnings using a Pandas series as the baseline for a bar plot. * Make it easier to disable graph vertex labels. * Allow stroke-linecap for CSS line styles. * Improve rasterized PNG output quality. * Warn when using older versions of ghostscript that produce lower-quality PNG output. * Suppress the "No handlers could be found for logger toyplot" warning. * Rewrote the logic for detecting Ghostscript. Toyplot 0.13.0 - July 22, 2016 ------------------------------ * Allow fill marks to be used as annotation. * Explicitly disable data export from annotation marks. * Add an experimental `.domain.show` parameter to control whether the domain is displayed using axis spines. * `toyplot.data.read_csv(convert=True)` will try to parse integer as well as floating-point types. * Completely rewrote the table coordinates implementation. * Table coordinates support advanced, numpy-style indexing for all rows, columns, cells, gridlines, and gaps. * Added API to delete table coordinate rows and columns. * Added API to insert table coordinate rows and columns. * By default, all table cells are vertically and horizontally centered with a default font. * Matrix visualizations no longer bold row and column indices by default. * End-users can export CSV data from table coordinates and matrix visualizations. * Added table-cell bar plots and line plots that use the data already contained in the table. Toyplot 0.12.0 - May 27, 2016 ----------------------------- * Pandas data frame indices (including hierarchical indices) can optionally be included when converting to `toyplot.data.Table`. * Fixed a Python 3 portability issue. * Table coordinates didn't format NaN values properly when using a custom formatting string. * The `arrow` module is only imported when needed. * New documentation on grouping table rows. * Documented platform-specific timezone naming issues. * Improved documentation of the color factory objects in `toyplot.color`. * Use consistent naming for numberline coordinates. * Made it easier to iterate over `toyplot.data.Table` rows. * Interactive mouse coordinates work correctly with numberlines and shared axes, and are only displayed by click / touch events. * Position ticks relative to axes with a `location` property, and deprecate the tick labels `location` property. * Fixed a problem rendering bars with a log scale and nonzero domain minimum. * Removed the API to change text during animation. * Significant cleanup and organization of HTML backend code and generated markup. * Renamed the `toyplot.axes` module to `toyplot.coordinates` for consistency, clarity. * Added `toyplot.canvas.Canvas.cartesian()` and deprecated `toyplot.canvas.Canvas.axes()`. * Added `toyplot.locator.Uniform` and deprecated `toyplot.locator.Basic`. * Added documentation links to external libraries, where practical. * Added `text-shadow` to the list of valid CSS text attributes. * Updated dependencies to require numpy >= 1.8.0, and eliminated code that inadvertently depended on numpy >= 1.9. * Experimental support for displaying `PIL` and `scikit-image` images. * Added a `style` property to `toyplot.canvas.Canvas`. * Deprecated implicit conversion from palettes to colormaps for matrix visualization. * Provide better error messages if a caller passes anything but a canvas to a rendering backend. * Add support for multi-series marks in legends. * Updated links to point to our new documentation domain, `http://toyplot.readthedocs.io`. * Axis labels support the same `location` and `offset` parameterization as axis ticks / tick labels. Toyplot 0.11.0 - February 18, 2016 ---------------------------------- * Added more complex indexing / slicing options to toyplot.data.Table. * Deprecated `toyplot.data.Table.rows()` and `toyplot.data.Table.columns()`. * Removed support for custom markers. * `-toyplot-anchor-shift` didn't work correctly with rotated text. * Documented text alignment behavior for rotated text. * Added `location` parameter for axis labels. * Improved text alignment defaults for rotated and unrotated axis labels. * Don't alter the axis domain if tick labels aren't visible. * Change the default linear color map to a diverging blue-red palette. * Pandas data frames with duplicate column names can be converted to `toyplot.data.Table`. * Allow callers to suppress NaNs in table visualization cells. * Render color arrays as swatches in Jupyter notebooks. * Added `toyplot.color.brewer.palette()`, `toyplot.color.brewer.map()`, and `toyplot.color.diverging.map()`. * Deprecated `toyplot.color.brewer()` and `toyplot.color.diverging()`. * `toyplot.color.LinearMap` color stops can be explicitly positioned. * Added `toyplot.color.linear.map()` with "Blackbody", "ExtendedBlackbody", "Kindlmann" and "ExtendedKindlmann" color maps. * Deprecated implicit conversions from color palettes to color maps during color mapping. * Split color-related documentation into separate "Color" and "Color Mapping" sections of the user guide. * Improved debugging output when a regression test fails. * Many code coverage improvements. Toyplot 0.10.0 - January 12, 2016 --------------------------------- * Added rich text support, using a limited subset of HTML markup. * Added a tick locator for displaying timestamp data with properly formatted times. * Created a new, pure-Python PDF backend using ReportLab. * Created a new PNG backend that renders by rasterizing PDFs with Ghostscript. * Removed deprecated PDF and PNG backends. * Added numberline axes, for displaying one-dimensional data. * Refactored the scatterplot mark to support data with any number of dimensions. * Added one-dimensional scatterplot support to numberlines. * Completely redesigned the color scale implementation to use numberlines. * Added API for easily adding color scales to axes and matrix visualizations. * Provided both size and area parameters to specify marker sizes. * Moved log scales to a dedicated section of the user guide. * Optimized graph layout when every vertex already has a position. * Removed the GraphViz graph layout strategy. * Use consistent naming for matrix visualization parameters. * toyplot.data.read_csv() can optionally convert string values to numeric values. * Replaced toyplot.color.lighten() with toyplot.color.spread(), which is more flexible. * Display toyplot color values as swatches in Jupyter notebooks. * Expanded the color documentation in the user guide. * Reduced regression test boilerplate code. * Test coverage improvements. Toyplot 0.9.0 - November 22, 2015 --------------------------------- * Documented installation for Anaconda and FreeBSD. * Experimental support for graph visualization, with flexible layout algorithms, shared layouts and node "pinning". * Allow cartesian axes to fill the available range while maintaining their aspect ratio. * Axis ticks can extend above or below the axis spine. * Positioning an axis spine positions its ticks and tick labels as well. * Added support for shared axes / multiple axes, to display multiple overlapping domains in a single plot. * Format specifiers are available for the Extended and Heckbert tick locators, courtesy of Johann du Toit. * Began using pylint as a regular code quality check. * Pandas data frames are automatically converted when creating data tables / table axes. * Created a new default PDF backend using the ReportLab library. * Switched to toyplot.qt.png as the default PNG backend. * Provide better feedback when using the toyplot.pdf and toyplot.png meta backends. Toyplot 0.8.0 - September 7, 2015 --------------------------------- * Removed deprecated colormap and palette parameters from the API. * Allow simplified color mapping specifications. * Improved test coverage. * Fix a problem embedding embedding axes in tables using more than one merged cell. * Add table cell width / height support for real-world units. * Hide masked values in table axes. * Reorganize the installation documentation. * Add support for rotated text in table cells. * Add top/bottom/left/right label support for matrix visualizations. * Add new toyplot.locator.Null do-nothing tick locator. * Add matrix visualization support for right / bottom ticks. * Add custom locator support for matrix visualizations. * Make matrix visualization color parameters consistent with the rest of the API. * Add missing reference documentation for toyplot.projection module. * Cleanup the toyplot.color.broadcast(...) API and implementation. * Make the API for specifying color mapping consistent across all visualization types. * Allow per-datum titles on line plots and scatterplots. * Expand the color section in the user guide to cover color mapping. * Add a new section on null data to the user guide. * Eliminate nuisance warnings from numpy. * Automatically validate source notebooks as part of the documentation build. Toyplot 0.7.0 - August 12, 2015 ------------------------------- * Added a user guide section on embedding plots. * Added a user guide example of datetime objects as tick labels. * Make the Toyplot sourcecode fully PEP-8 conforming - thanks to Chris Morgan. * Worked around problems with numpy.broadcast_arrays() in numpy 1.8. * Removed LaTeX table formatting functionality that was replaced by table axes. * Added a new backend to display figures in a standalone Qt window. * Switched to the Python logger module for warnings / errors. * Updated the public API for specifying scalar color palettes / maps, and deprecated separate color palette / map API parameters. * Changed the way we encode opacities, for compatibility with Inkscape and Adobe Illustrator. * Removed the obsolete toyplot.selenium backend. * Treat hlines() and vlines() as annotation (so they don't affect the data domain), unless the caller specifies otherwise. * Created new Qt backends to generate PDF and PNG figures. * Figures can be resized consistently across all browsers, particularly Firefox and IE. * Reorganized the backend documentation, and explicitly documented the distinction between backends and displays. * Fixed a case where canvas resizing didn't handle explicit units correctly. * Added a new section on interaction to the user guide. * Allow figure creators to override the default filename when users export data from an interactive figure. * Significant changes to our travis-ci.org test environment. * toyplot.data.Table.matrix() didn't work in Python 3. * Removed toyplot.data.Table.to_csv(), we want to discourage people from using Toyplot for data manipulation. * Many objects didn't render properly in Jupyter notebooks with Python 3. * Added parameters to disable the row and column labels in matrix visualizations. Toyplot 0.6.0 - July 13, 2015 ----------------------------- * Unicode text wasn't handled correctly by text marks. * Added an experimental matrix visualization using table axes. * Added a "title" property for table cells. * Fix inconsistencies in our use of alignment-baseline and text-anchor CSS properties. * Added a new section to the user guide on the convenience API. * Allow real-world units for canvas layouts, and tweak the parameter order for corner layouts. * Expanded user guide documentation on canvas layouts. * Added table axes regions for all four sides and corners, plus a property to access every cell in a region. * Added automatic conversion from numpy NpzFile to toyplot.data.Table. * Added experimental support for graph visualization. * Allow toyplot.data.Table initialization from a sequence of 2-tuples. * Cairo backends were ignoring -toyplot-anchor-shift. * Cairo backends didn't handle all supported alignment-baseline values. * Added matrix and table visualizations to the convenience API. * Added accessors for shape, row count, and column count for table axes and regions. * Added toyplot.locator.Integer, and a step parameter to control labelling for matrix visualizations. * Always return a unicode string from toyplot.canvas.Canvas._repr_html_(), for compatibility with Jupyter / IPython notebooks running Python 3 kernels. * Assign a sensible default filename for CSV downloads, for browsers that support it. * Added a contributed Conda build recipe. * Allow toyplot.data.Table to be initialized from a 2D numpy array. * Rename the toyplot.axes.Table "title" parameter to "label" for consistency with the other axes. * Added a new "Labels and Legends" section to the user guide. * Added a new "Tick Locators" section to the user guide. * Added experimental toyplot.data.contiguous() function to identify contiguous ranges in an array. * Fix a problem with interactive Y coordinates when using a log scale that straddled the origin. Toyplot 0.5.0 - May 26, 2015 ---------------------------- * Switched to https://travis-ci.org/sandialabs/toyplot for continuous integration testing. * Switched to https://coveralls.io/r/sandialabs/toyplot to track test coverage. * Added a custom CSS style `-toyplot-anchor-shift` for controlling horizontal text offsets. * Added new documentation on color, text alignment, units, data tables, and table axes to the user guide. * Callers can increase the number of table rows and columns when creating table axes from a data table. * Overhauled Toyplot's handling of real-world units, allowing arbitrary units throughout the API, and made it explicit that the default canvas units are CSS pixels. * Added axis visibility options to the convenience API. * `toyplot.data.Table` can be converted to a `numpy` matrix. * Positive angles yield counterclockwise rotation throughout the API, for consistency with trigonometry. * Rendered text automatically expands a plot's domain to avoid clipping. * Fixed a longstanding problem displaying mouse coordinates outside the data domain for a plot. * Moved interaction-specific markup from the SVG backend to the HTML backend. * When exporting data from a figure, only the caller-supplied data is exported. * The API makes an explicit distinction between text used for "annotation" and text used for data. * Many small fixes. Toyplot 0.4.0 - January 27, 2015 -------------------------------- * Began continuous integration testing. * Switched from ost.io to https://gitter.im/sandialabs/toyplot for support requests. * Made the HTML backend the primary renderer. * Improved logarithmic tick formatting and customization. * Increased consistency between the fill() and plot() APIs. * Simplified the way colors are inherited for line plots and scatter plots. * Added basic functionality for reading and writing CSV files. * Note: for pedagical purposes only - Toyplot is *not* a data manipulation tool! * Ongoing improvements to the table axes API: * Added support for table titles. * Added support for hiding table headers. * Table headers can have multiple rows. * Ensure that visible cells are rendered in a deterministic order. * Create a default grid line between table header and body. * Added support for user-configurable gaps between cells. Toyplot 0.3.0 - November 5, 2014 -------------------------------- * Switched to toyplot.data.Table for all internal data storage. * Reorganized the codebase into smaller, more focused modules. * Added a new backend to produce WebM video. * Data tables can be rendered to LaTeX. * New table axes for rendering tables as data graphics. Toyplot 0.2.0 - September 2, 2014 --------------------------------- * Introduced support for Python 3. * Removed pure black from the default styling. * Allow regression tests to run without optional dependencies. Toyplot 0.1.0 - August 25, 2014 ------------------------------- a Initial Release