Skip to content

Commit 84f4e66

Browse files
authored
Merge pull request #4865 from plotly/fix-bar-charts
Do not assign `offsetgroup` to traces in px unless `barmode="group"`
2 parents 2bc6a0f + 48b8d06 commit 84f4e66

File tree

1 file changed

+10
-10
lines changed
  • packages/python/plotly/plotly/express

1 file changed

+10
-10
lines changed

Diff for: packages/python/plotly/plotly/express/_core.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -652,9 +652,6 @@ def set_cartesian_axis_opts(args, axis, letter, orders):
652652

653653

654654
def configure_cartesian_marginal_axes(args, fig, orders):
655-
if "histogram" in [args["marginal_x"], args["marginal_y"]]:
656-
fig.layout["barmode"] = "overlay"
657-
658655
nrows = len(fig._grid_ref)
659656
ncols = len(fig._grid_ref[0])
660657

@@ -1497,17 +1494,14 @@ def build_dataframe(args, constructor):
14971494
# If data_frame is provided, we parse it into a narwhals DataFrame, while accounting
14981495
# for compatibility with pandas specific paths (e.g. Index/MultiIndex case).
14991496
if df_provided:
1500-
15011497
# data_frame is pandas-like DataFrame (pandas, modin.pandas, cudf)
15021498
if nw.dependencies.is_pandas_like_dataframe(args["data_frame"]):
1503-
15041499
columns = args["data_frame"].columns # This can be multi index
15051500
args["data_frame"] = nw.from_native(args["data_frame"], eager_only=True)
15061501
is_pd_like = True
15071502

15081503
# data_frame is pandas-like Series (pandas, modin.pandas, cudf)
15091504
elif nw.dependencies.is_pandas_like_series(args["data_frame"]):
1510-
15111505
args["data_frame"] = nw.from_native(
15121506
args["data_frame"], series_only=True
15131507
).to_frame()
@@ -1861,7 +1855,6 @@ def _check_dataframe_all_leaves(df: nw.DataFrame) -> None:
18611855
for row_idx, row in zip(
18621856
null_indices_mask, null_mask.filter(null_indices_mask).iter_rows()
18631857
):
1864-
18651858
i = row.index(True)
18661859

18671860
if not all(row[i:]):
@@ -1990,7 +1983,6 @@ def process_dataframe_hierarchy(args):
19901983

19911984
if args["color"]:
19921985
if discrete_color:
1993-
19941986
discrete_aggs.append(args["color"])
19951987
agg_f[args["color"]] = nw.col(args["color"]).max()
19961988
agg_f[f'{args["color"]}{n_unique_token}'] = (
@@ -2045,7 +2037,6 @@ def post_agg(dframe: nw.LazyFrame, continuous_aggs, discrete_aggs) -> nw.LazyFra
20452037
).drop([f"{col}{n_unique_token}" for col in discrete_aggs])
20462038

20472039
for i, level in enumerate(path):
2048-
20492040
dfg = (
20502041
df.group_by(path[i:], drop_null_keys=True)
20512042
.agg(**agg_f)
@@ -2487,6 +2478,10 @@ def make_figure(args, constructor, trace_patch=None, layout_patch=None):
24872478
constructor = go.Bar
24882479
args = process_dataframe_timeline(args)
24892480

2481+
# If we have marginal histograms, set barmode to "overlay"
2482+
if "histogram" in [args.get("marginal_x"), args.get("marginal_y")]:
2483+
layout_patch["barmode"] = "overlay"
2484+
24902485
trace_specs, grouped_mappings, sizeref, show_colorbar = infer_config(
24912486
args, constructor, trace_patch, layout_patch
24922487
)
@@ -2558,7 +2553,12 @@ def make_figure(args, constructor, trace_patch=None, layout_patch=None):
25582553
legendgroup=trace_name,
25592554
showlegend=(trace_name != "" and trace_name not in trace_names),
25602555
)
2561-
if trace_spec.constructor in [go.Bar, go.Violin, go.Box, go.Histogram]:
2556+
2557+
# Set 'offsetgroup' only in group barmode (or if no barmode is set)
2558+
barmode = layout_patch.get("barmode")
2559+
if trace_spec.constructor in [go.Bar, go.Box, go.Violin, go.Histogram] and (
2560+
barmode == "group" or barmode is None
2561+
):
25622562
trace.update(alignmentgroup=True, offsetgroup=trace_name)
25632563
trace_names.add(trace_name)
25642564

0 commit comments

Comments
 (0)