From b6d2eb1a296a49890f1def3e6dde902ddb8a56fb Mon Sep 17 00:00:00 2001 From: Nathan Date: Thu, 24 Oct 2024 10:49:57 -0400 Subject: [PATCH 1/4] Promote subtitle param to Plotly Express figures --- .../plotly/plotly/express/_chart_types.py | 39 +++++++++++++++++++ .../python/plotly/plotly/express/_core.py | 6 +-- packages/python/plotly/plotly/express/_doc.py | 1 + 3 files changed, 43 insertions(+), 3 deletions(-) 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..562602ca86e 100644 --- a/packages/python/plotly/plotly/express/_core.py +++ b/packages/python/plotly/plotly/express/_core.py @@ -2338,6 +2338,8 @@ def make_figure(args, constructor, trace_patch=None, layout_patch=None): layout_patch["legend"]["title_text"] = ", ".join(trace_name_labels) if args["title"]: layout_patch["title_text"] = args["title"] + if args["subtitle"]: + layout_patch["title_subtitle_text"] = args["subtitle"] elif args["template"].layout.margin.t is None: layout_patch["margin"] = {"t": 60} if ( @@ -2476,9 +2478,7 @@ def _spacing_error_translator(e, direction, facet_arg): e.args = ( e.args[0] + """ -Use the {facet_arg} argument to adjust this spacing.""".format( - facet_arg=facet_arg - ), +Use the {facet_arg} argument to adjust this spacing.""".format(facet_arg=facet_arg), ) raise e 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.", From 854ea0fba20eed14ecc5758098b0063daa053f66 Mon Sep 17 00:00:00 2001 From: Nathan Date: Thu, 24 Oct 2024 11:37:10 -0400 Subject: [PATCH 2/4] Apply subtitle fully after title --- packages/python/plotly/plotly/express/_core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/python/plotly/plotly/express/_core.py b/packages/python/plotly/plotly/express/_core.py index 562602ca86e..20cc0e40a28 100644 --- a/packages/python/plotly/plotly/express/_core.py +++ b/packages/python/plotly/plotly/express/_core.py @@ -2338,10 +2338,10 @@ def make_figure(args, constructor, trace_patch=None, layout_patch=None): layout_patch["legend"]["title_text"] = ", ".join(trace_name_labels) if args["title"]: layout_patch["title_text"] = args["title"] - if args["subtitle"]: - layout_patch["title_subtitle_text"] = args["subtitle"] 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"] From 7120e2362527de9a01c6cadde4779edddcb321c3 Mon Sep 17 00:00:00 2001 From: Nathan Date: Thu, 24 Oct 2024 11:43:38 -0400 Subject: [PATCH 3/4] =?UTF-8?q?Apply=20formatting=20=F0=9F=92=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/python/plotly/plotly/express/_core.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/python/plotly/plotly/express/_core.py b/packages/python/plotly/plotly/express/_core.py index 20cc0e40a28..0e71f41becf 100644 --- a/packages/python/plotly/plotly/express/_core.py +++ b/packages/python/plotly/plotly/express/_core.py @@ -2478,7 +2478,9 @@ def _spacing_error_translator(e, direction, facet_arg): e.args = ( e.args[0] + """ -Use the {facet_arg} argument to adjust this spacing.""".format(facet_arg=facet_arg), +Use the {facet_arg} argument to adjust this spacing.""".format( + facet_arg=facet_arg + ), ) raise e From 2cf87dc8e3841f43c868d83e340a731bdd381056 Mon Sep 17 00:00:00 2001 From: Nathan Date: Thu, 24 Oct 2024 11:44:35 -0400 Subject: [PATCH 4/4] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b65ef5faa41..0a3b67a5506 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,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