diff --git a/CHANGELOG.md b/CHANGELOG.md index 26d6c70c8af..d6d90085713 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Updated - Updated plotly.py to use base64 encoding of arrays in plotly JSON to improve performance. +- Add `subtitle` attribute to all Plotly Express traces ## [5.24.1] - 2024-09-12 diff --git a/packages/python/plotly/plotly/express/_chart_types.py b/packages/python/plotly/plotly/express/_chart_types.py index ff44d0780b9..614431f19a2 100644 --- a/packages/python/plotly/plotly/express/_chart_types.py +++ b/packages/python/plotly/plotly/express/_chart_types.py @@ -55,6 +55,7 @@ def scatter( range_y=None, render_mode="auto", title=None, + subtitle=None, template=None, width=None, height=None, @@ -105,6 +106,7 @@ def density_contour( nbinsy=None, text_auto=False, title=None, + subtitle=None, template=None, width=None, height=None, @@ -175,6 +177,7 @@ def density_heatmap( nbinsy=None, text_auto=False, title=None, + subtitle=None, template=None, width=None, height=None, @@ -253,6 +256,7 @@ def line( line_shape=None, render_mode="auto", title=None, + subtitle=None, template=None, width=None, height=None, @@ -303,6 +307,7 @@ def area( range_y=None, line_shape=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -362,6 +367,7 @@ def bar( range_y=None, text_auto=False, title=None, + subtitle=None, template=None, width=None, height=None, @@ -412,6 +418,7 @@ def timeline( range_x=None, range_y=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -467,6 +474,7 @@ def histogram( nbins=None, text_auto=False, title=None, + subtitle=None, template=None, width=None, height=None, @@ -541,6 +549,7 @@ def ecdf( range_x=None, range_y=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -597,6 +606,7 @@ def violin( points=None, box=False, title=None, + subtitle=None, template=None, width=None, height=None, @@ -650,6 +660,7 @@ def box( points=None, notched=False, title=None, + subtitle=None, template=None, width=None, height=None, @@ -700,6 +711,7 @@ def strip( range_x=None, range_y=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -765,6 +777,7 @@ def scatter_3d( range_y=None, range_z=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -816,6 +829,7 @@ def line_3d( range_y=None, range_z=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -856,6 +870,7 @@ def scatter_ternary( opacity=None, size_max=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -896,6 +911,7 @@ def line_ternary( markers=False, line_shape=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -941,6 +957,7 @@ def scatter_polar( log_r=False, render_mode="auto", title=None, + subtitle=None, template=None, width=None, height=None, @@ -987,6 +1004,7 @@ def line_polar( range_theta=None, log_r=False, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1030,6 +1048,7 @@ def bar_polar( range_theta=None, log_r=False, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1080,6 +1099,7 @@ def choropleth( fitbounds=None, basemap_visible=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1137,6 +1157,7 @@ def scatter_geo( fitbounds=None, basemap_visible=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1193,6 +1214,7 @@ def line_geo( fitbounds=None, basemap_visible=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1236,6 +1258,7 @@ def scatter_map( center=None, map_style=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1273,6 +1296,7 @@ def choropleth_map( center=None, map_style=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1308,6 +1332,7 @@ def density_map( map_style=None, radius=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1344,6 +1369,7 @@ def line_map( center=None, map_style=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1383,6 +1409,7 @@ def scatter_mapbox( center=None, mapbox_style=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1420,6 +1447,7 @@ def choropleth_mapbox( center=None, mapbox_style=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1455,6 +1483,7 @@ def density_mapbox( mapbox_style=None, radius=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1491,6 +1520,7 @@ def line_mapbox( center=None, mapbox_style=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1526,6 +1556,7 @@ def scatter_matrix( opacity=None, size_max=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1553,6 +1584,7 @@ def parallel_coordinates( range_color=None, color_continuous_midpoint=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1577,6 +1609,7 @@ def parallel_categories( range_color=None, color_continuous_midpoint=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1612,6 +1645,7 @@ def pie( category_orders=None, labels=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1664,6 +1698,7 @@ def sunburst( custom_data=None, labels=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1714,6 +1749,7 @@ def treemap( custom_data=None, labels=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1764,6 +1800,7 @@ def icicle( custom_data=None, labels=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1823,6 +1860,7 @@ def funnel( range_x=None, range_y=None, title=None, + subtitle=None, template=None, width=None, height=None, @@ -1849,6 +1887,7 @@ def funnel_area( custom_data=None, labels=None, title=None, + subtitle=None, template=None, width=None, height=None, diff --git a/packages/python/plotly/plotly/express/_core.py b/packages/python/plotly/plotly/express/_core.py index c8682aa4c5e..0e71f41becf 100644 --- a/packages/python/plotly/plotly/express/_core.py +++ b/packages/python/plotly/plotly/express/_core.py @@ -2340,6 +2340,8 @@ def make_figure(args, constructor, trace_patch=None, layout_patch=None): layout_patch["title_text"] = args["title"] elif args["template"].layout.margin.t is None: layout_patch["margin"] = {"t": 60} + if args["subtitle"]: + layout_patch["title_subtitle_text"] = args["subtitle"] if ( "size" in args and args["size"] diff --git a/packages/python/plotly/plotly/express/_doc.py b/packages/python/plotly/plotly/express/_doc.py index 75f09b6fab1..8e4678101fc 100644 --- a/packages/python/plotly/plotly/express/_doc.py +++ b/packages/python/plotly/plotly/express/_doc.py @@ -371,6 +371,7 @@ "If provided, overrides auto-scaling on the angular axis in polar coordinates.", ], title=["str", "The figure title."], + subtitle=["str", "The figure subtitle."], template=[ "str or dict or plotly.graph_objects.layout.Template instance", "The figure template name (must be a key in plotly.io.templates) or definition.",