All Versions
22
Latest Version
Avg Release Cycle
158 days
Latest Release
7 days ago

Changelog History
Page 1

  • v0.15.5 Changes

    June 03, 2026

    🐛 Bug Fixes

    • For interactive output, binary image data is now base64 encoded, making the output visible for pyodide blocks in quarto-live pages.
  • v0.15.4 Changes

    May 05, 2026

    🆕 New

    • Bundled agent skills

    🐛 Bug Fixes

    • 👍 Allow statsmodels==0.14.4 on pyodide, which bundles that version. Other platforms still require statsmodels>=0.14.6 for pandas 3 compatibility.
  • v0.15.3 Changes

    January 29, 2026

    ✨ Enhancements

    • ✂ Removed warnings about copy-on-write for pandas >= 3.0.0

    Full Changelog : v0.15.2...v0.15.3

  • v0.15.2 Changes

    December 12, 2025

    🐛 Bug Fixes

    • 🛠 Fixed random failures for when using plotnine in quarto == 1.8.26. #1017

    Full Changelog : v0.15.1...v0.15.2

  • v0.15.1 Changes

    November 03, 2025

    What's Changed

    • Do not overwrite labels set with labs by @has2k1 in #958
    • 🛠 Fix changing composition figure size when plot_spacer is the last plot by @has2k1 in #961
    • 🛠 Fix stat_quantile to handle formula that use environment variables by @has2k1 in #964
    • Add missing scale_stroke_identity by @has2k1 in #965
    • Prefer _repr_mimebundle_ for notebook display by @manzt in #969

    🆕 New Contributors

    Full Changelog : v0.15.0...v0.15.1

  • v0.15.0 Changes

    July 15, 2025

    API Changes

    • Themeables axis_ticks_pad, axis_ticks_pad_minor, axis_ticks_pad_major, axis_ticks_pad_minor_x, axis_ticks_pad_minor_y, axis_ticks_pad_major_x and axis_ticks_pad_major_y have been deprecated. Use the margin parameter of element_text with axis_text, axis_text_x or axis_text_y to control the spacing between the axis text and the ticks. (#843)
    • The stat class methods stat.compute_layer, stat.compute_panel and stat.compute_group are now instance methods and they no longer accept **params arguments. Access to the parameters is through self.params.
    • The geom class methods geom.draw_layer and geom.draw_panel do no longer accept **param arguments. Access to the parameters is through self.params.
    • Method geom.draw_group now accepts the params argument as a dictionary and not **params.

    🆕 New Features

    • Plot Composition is here. Using an intuitive algebra, you can now put combine multiple plots into a single graphic. e.g.

      p1=ggplot(...)p2=ggplot(...)p3=ggplot(...)

      (p1|p2)/p3

    • Using plot_title_position and plot_caption_position e.g.

      theme(plot_title_position="plot",plot_caption_position="plot", )

    You can now position the plot_title, plot_subtitle and plot_caption by alignment them with respect to the plot. (#838)

    • Gained new label tag to create a tag for a plot. You can set it with labs e.g.

      labs(tag="A")

    🏷 and customise it using these themeables plot_tag and plot_tag_position and plot_tag_location e.g.

    theme(plot\_tag="plot",plot\_tag\_location="plot",plot\_tag\_position="topright",
    )
    
    • Geoms geom_bar and geom_col have gained new parameter just that controls how the bars align with the axis break point.
    • geom_sina has gained new parameter style just like geom_violin, which make one-sided (half) sina plots.
    • Gained the Anscombe Quartet dataset, anscombe_quartet.
    • Gained new module plotnine.helpers to be a place for some helper functions.
    • Gained new helper function get_aesthetic_limits.
    • geom_point gained the ability to handle shapes of the form Sequence[tuple[float, float]] e.g.

      ((-2,-4), (-2,-1), (0,1), (2,-1), (2,-4), (-2,-4))

    Which declares the vertices of a polygon shape.

    ✨ Enhancements

    • Included datasets mpg, msleep and midwest no longer have any of their columns as categoricals. This matches the respective datasets in R. (#913)
    • When the width of the violins in geom_violin is wider than their normal area, they now overlap with those closest to the origin on top. This makes it possible to create overlapping ridge plots using half violins.
    • legend_key now inherits from panel_background and the default themes have been adjusted to rely on this inheritance. So when using the default themes, altering fill parameter of the panel_background will also affect the background of the legend_key.
    • The default value for the guide parameter for the identity scales (scale_*_identity) has been reverted to None. This means by default using these scales will not generate a legend.

    🐛 Bug Fixes

    • Fixed bug in with the legend_key_height themeable where it wasn’t applied. (#921)
    • Fixed bug where justifying axis_text_x and axis_text_y using horizontal and vertical alignment did not work as expected. (#927)
    • Fixed justifying strip_text within the strip_background. (#867)
    • 🛠 Fixed bug where faceting along a column with unused categories could raise an error. (#930)
    • 🛠 Fixed bug where computed aesthetic from after_scale are were not applied to the legend. (#926)
    • 🛠 Fixed theming of minor x axis ticks.
    • Fixed theming of axis_text, axis_text_x and axis_text_y so when they can be overriden if previously set to element_blank().
    • Fixed strip_text_x_backgrounds to always have equal heights and strip_text_y_backgrounds to have equal widths. This applies to cases where the texts have unequal number of lines or they are rotated but have different lengths.
    • Fixed the empty space below the plot title (or subtitle) when strip_text_x_backgrounds are partly or fully aligned within the panel. This space (hole), was not accounted for by any of the themeables. This affected theme_xkcd and any theme settings that tried to slide the text / background into the panel.
    • Fixed the empty space to the left the right margin when the strip_text_y_backgrounds are partly or fully aligned within the panel. This space (hole), was not accounted for by any of the themeables. This affected theme_xkcd and any theme settings that tried to slide the text / background into the panel.
    • Fixed bug in geom_histogram where mapping to the weight aesthetic lead to an error. (#936)
    • Fixed bug in geom_vline where you could not map the xintercept aesthetic to a discrete variable.
    • Fixed bug in geom_hline where you could not map the yintercept aesthetic to a discrete variable.
    • Fixed bug in all manual scales (scale_*_manual) where if you set values to a dict then setting the breaks would lead to an error. (#949)
    • Fixed using theme_void with facetting so that the strip text are always fully within the figure bounds.
    • Fixed the ordinal color scales scale_color_ordinal, scale_color_cmap_d scale_fill_ordinal and scale_fill_cmap_d to handle missing (NaN or None) values. (#953)
  • v0.14.6 Changes

    June 25, 2025

    🚀 This release prevents plotnine from pulling in scipy v1.16.0 because it does not play well with statsmodels.

  • v0.14.5 Changes

    January 02, 2025

    🛠 Fixes

    Fixed geom_text with adjust_text so that the the arrows are drawn between layers with the text/label on top.

  • v0.14.4 Changes

    December 16, 2024

    🐛 Bug Fixes

    • Fixed geom_text with adjust_text so that the the arrows are drawn at the same layer (zorder) as the text.

    • Fixed geom_text with adjust_text for some cases where the text are placed outside the panels. #899

    • 0️⃣ The default aesthetics and aesthetic parameters of geoms (and stats) are now transformed. So you can now set date values as aesthetic parameters. e.g.

    • Fixed bug for matplotlib>3.10 where the axis_ticks_length for the x-axis had no effect.

  • v0.14.3 Changes

    November 26, 2024

    ✨ Enhancements

    • 🌲 Got rid of a logging information about the fontsize that is recorded for all plots that have a legend. (#889)
    • When using geom_text with adjust_text, some sensible default arrow properties will be applied.
    • 🔄 Changed the threshold number of keys for when the legend is split into multiple columns from 20 to 15. This only applies in the default case when the user does not set the number of rows or columns i.e. guide_legend(nrow=None, ncol=None). (#757)