@@ -652,9 +652,6 @@ def set_cartesian_axis_opts(args, axis, letter, orders):
652
652
653
653
654
654
def configure_cartesian_marginal_axes (args , fig , orders ):
655
- if "histogram" in [args ["marginal_x" ], args ["marginal_y" ]]:
656
- fig .layout ["barmode" ] = "overlay"
657
-
658
655
nrows = len (fig ._grid_ref )
659
656
ncols = len (fig ._grid_ref [0 ])
660
657
@@ -1497,17 +1494,14 @@ def build_dataframe(args, constructor):
1497
1494
# If data_frame is provided, we parse it into a narwhals DataFrame, while accounting
1498
1495
# for compatibility with pandas specific paths (e.g. Index/MultiIndex case).
1499
1496
if df_provided :
1500
-
1501
1497
# data_frame is pandas-like DataFrame (pandas, modin.pandas, cudf)
1502
1498
if nw .dependencies .is_pandas_like_dataframe (args ["data_frame" ]):
1503
-
1504
1499
columns = args ["data_frame" ].columns # This can be multi index
1505
1500
args ["data_frame" ] = nw .from_native (args ["data_frame" ], eager_only = True )
1506
1501
is_pd_like = True
1507
1502
1508
1503
# data_frame is pandas-like Series (pandas, modin.pandas, cudf)
1509
1504
elif nw .dependencies .is_pandas_like_series (args ["data_frame" ]):
1510
-
1511
1505
args ["data_frame" ] = nw .from_native (
1512
1506
args ["data_frame" ], series_only = True
1513
1507
).to_frame ()
@@ -1861,7 +1855,6 @@ def _check_dataframe_all_leaves(df: nw.DataFrame) -> None:
1861
1855
for row_idx , row in zip (
1862
1856
null_indices_mask , null_mask .filter (null_indices_mask ).iter_rows ()
1863
1857
):
1864
-
1865
1858
i = row .index (True )
1866
1859
1867
1860
if not all (row [i :]):
@@ -1990,7 +1983,6 @@ def process_dataframe_hierarchy(args):
1990
1983
1991
1984
if args ["color" ]:
1992
1985
if discrete_color :
1993
-
1994
1986
discrete_aggs .append (args ["color" ])
1995
1987
agg_f [args ["color" ]] = nw .col (args ["color" ]).max ()
1996
1988
agg_f [f'{ args ["color" ]} { n_unique_token } ' ] = (
@@ -2045,7 +2037,6 @@ def post_agg(dframe: nw.LazyFrame, continuous_aggs, discrete_aggs) -> nw.LazyFra
2045
2037
).drop ([f"{ col } { n_unique_token } " for col in discrete_aggs ])
2046
2038
2047
2039
for i , level in enumerate (path ):
2048
-
2049
2040
dfg = (
2050
2041
df .group_by (path [i :], drop_null_keys = True )
2051
2042
.agg (** agg_f )
@@ -2487,6 +2478,10 @@ def make_figure(args, constructor, trace_patch=None, layout_patch=None):
2487
2478
constructor = go .Bar
2488
2479
args = process_dataframe_timeline (args )
2489
2480
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
+
2490
2485
trace_specs , grouped_mappings , sizeref , show_colorbar = infer_config (
2491
2486
args , constructor , trace_patch , layout_patch
2492
2487
)
@@ -2558,7 +2553,12 @@ def make_figure(args, constructor, trace_patch=None, layout_patch=None):
2558
2553
legendgroup = trace_name ,
2559
2554
showlegend = (trace_name != "" and trace_name not in trace_names ),
2560
2555
)
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
+ ):
2562
2562
trace .update (alignmentgroup = True , offsetgroup = trace_name )
2563
2563
trace_names .add (trace_name )
2564
2564
0 commit comments