diff --git a/src/arviz_plots/backend/bokeh/__init__.py b/src/arviz_plots/backend/bokeh/__init__.py index 7452c317..7e0f5c94 100644 --- a/src/arviz_plots/backend/bokeh/__init__.py +++ b/src/arviz_plots/backend/bokeh/__init__.py @@ -354,6 +354,12 @@ def scatter( return target.scatter(np.atleast_1d(x), np.atleast_1d(y), **kwargs) +def step(x, y, target, *, color=unset, alpha=unset, width=unset, linestyle=unset, **artist_kws): + """Interface to bokeh for a step line.""" + kwargs = {"color": color, "alpha": alpha, "line_width": width, "line_dash": linestyle} + return target.step(np.atleast_1d(x), np.atleast_1d(y), **_filter_kwargs(kwargs, artist_kws)) + + def text( x, y, diff --git a/src/arviz_plots/backend/matplotlib/__init__.py b/src/arviz_plots/backend/matplotlib/__init__.py index f539b888..1892546d 100644 --- a/src/arviz_plots/backend/matplotlib/__init__.py +++ b/src/arviz_plots/backend/matplotlib/__init__.py @@ -353,6 +353,13 @@ def scatter( return target.scatter(x, y, **_filter_kwargs(kwargs, None, artist_kws)) +def step(x, y, target, *, color=unset, alpha=unset, width=unset, linestyle=unset, **artist_kws): + """Interface to matplotlib for a step line.""" + artist_kws.setdefault("zorder", 2) + kwargs = {"color": color, "alpha": alpha, "linewidth": width, "linestyle": linestyle} + return target.step(x, y, **_filter_kwargs(kwargs, Line2D, artist_kws))[0] + + def text( x, y, diff --git a/src/arviz_plots/backend/none/__init__.py b/src/arviz_plots/backend/none/__init__.py index 9c11fa8b..3679ae3c 100644 --- a/src/arviz_plots/backend/none/__init__.py +++ b/src/arviz_plots/backend/none/__init__.py @@ -281,6 +281,21 @@ def scatter( return artist_element +def step(x, y, target, *, color=unset, alpha=unset, width=unset, linestyle=unset, **artist_kws): + """Interface to a step line.""" + kwargs = {"color": color, "alpha": alpha, "width": width, "linestyle": linestyle} + if not ALLOW_KWARGS and artist_kws: + raise ValueError("artist_kws not empty") + artist_element = { + "function": "line", + "x": np.atleast_1d(x), + "y": np.atleast_1d(y), + **_filter_kwargs(kwargs, artist_kws), + } + target.append(artist_element) + return artist_element + + def text( x, y, diff --git a/src/arviz_plots/backend/plotly/__init__.py b/src/arviz_plots/backend/plotly/__init__.py index 548c0ba1..942a3beb 100644 --- a/src/arviz_plots/backend/plotly/__init__.py +++ b/src/arviz_plots/backend/plotly/__init__.py @@ -397,6 +397,23 @@ def scatter( return scatter_object +def step(x, y, target, *, color=unset, alpha=unset, width=unset, linestyle=unset, **artist_kws): + """Interface to plotly for a step line.""" + artist_kws.setdefault("showlegend", False) + line_kwargs = {"color": color, "width": width, "dash": linestyle} + line_artist_kws = artist_kws.pop("line", {"shape": "hv"}).copy() + kwargs = {"opacity": alpha} + line_object = go.Scatter( + x=np.atleast_1d(x), + y=np.atleast_1d(y), + mode="lines", + line=_filter_kwargs(line_kwargs, line_artist_kws), + **_filter_kwargs(kwargs, artist_kws), + ) + target.add_trace(line_object) + return line_object + + def text( x, y, diff --git a/src/arviz_plots/visuals/__init__.py b/src/arviz_plots/visuals/__init__.py index ab3c4447..26a4a713 100644 --- a/src/arviz_plots/visuals/__init__.py +++ b/src/arviz_plots/visuals/__init__.py @@ -114,9 +114,9 @@ def scatter_xy(da, target, backend, x=None, y=None, **kwargs): def ecdf_line(values, target, backend, **kwargs): - """Plot an ecdf line.""" + """Plot a step line.""" plot_backend = import_module(f"arviz_plots.backend.{backend}") - return plot_backend.line(values.sel(plot_axis="x"), values.sel(plot_axis="y"), target, **kwargs) + return plot_backend.step(values.sel(plot_axis="x"), values.sel(plot_axis="y"), target, **kwargs) def vline(values, target, backend, **kwargs):