From a9db017d292f4d6d67e4527bc618b12bfb13e5cc Mon Sep 17 00:00:00 2001 From: const-ae Date: Sun, 7 Jun 2026 22:22:12 +0100 Subject: [PATCH] Implement geom_beeswarm using the quasirandom approach from ggbeeswarm The method uses the van der Corput algorithm to produce a low discrepancy sequence between 0 and 1. --- plotnine/__init__.py | 4 + plotnine/geoms/__init__.py | 2 + plotnine/geoms/geom_beeswarm.py | 30 ++ plotnine/stats/__init__.py | 2 + plotnine/stats/stat_beeswarm.py | 286 ++++++++++++++++++ .../test_geom_beeswarm/method_counts.png | Bin 0 -> 25943 bytes .../scale_area+coord_flip.png | Bin 0 -> 27665 bytes .../test_geom_beeswarm/scale_area.png | Bin 0 -> 26705 bytes .../test_geom_beeswarm/scale_count.png | Bin 0 -> 23376 bytes .../test_geom_beeswarm/style.png | Bin 0 -> 19255 bytes tests/test_geom_beeswarm.py | 127 ++++++++ 11 files changed, 451 insertions(+) create mode 100644 plotnine/geoms/geom_beeswarm.py create mode 100644 plotnine/stats/stat_beeswarm.py create mode 100644 tests/baseline_images/test_geom_beeswarm/method_counts.png create mode 100644 tests/baseline_images/test_geom_beeswarm/scale_area+coord_flip.png create mode 100644 tests/baseline_images/test_geom_beeswarm/scale_area.png create mode 100644 tests/baseline_images/test_geom_beeswarm/scale_count.png create mode 100644 tests/baseline_images/test_geom_beeswarm/style.png create mode 100644 tests/test_geom_beeswarm.py diff --git a/plotnine/__init__.py b/plotnine/__init__.py index 69526927bd..fd881a20a8 100644 --- a/plotnine/__init__.py +++ b/plotnine/__init__.py @@ -40,6 +40,7 @@ geom_abline, geom_area, geom_bar, + geom_beeswarm, geom_bin2d, geom_bin_2d, geom_blank, @@ -221,6 +222,7 @@ ylim, ) from .stats import ( + stat_beeswarm, stat_bin, stat_bin2d, stat_bin_2d, @@ -301,6 +303,7 @@ "geom_abline", "geom_area", "geom_bar", + "geom_beeswarm", "geom_bin2d", "geom_bin_2d", "geom_blank", @@ -462,6 +465,7 @@ "scale_y_symlog", "scale_y_timedelta", "stage", + "stat_beeswarm", "stat_bin", "stat_bin2d", "stat_bin_2d", diff --git a/plotnine/geoms/__init__.py b/plotnine/geoms/__init__.py index d691629780..6ff6d8d444 100644 --- a/plotnine/geoms/__init__.py +++ b/plotnine/geoms/__init__.py @@ -8,6 +8,7 @@ from .geom_abline import geom_abline from .geom_area import geom_area from .geom_bar import geom_bar +from .geom_beeswarm import geom_beeswarm from .geom_bin_2d import geom_bin2d, geom_bin_2d from .geom_blank import geom_blank from .geom_boxplot import geom_boxplot @@ -56,6 +57,7 @@ "geom_abline", "geom_area", "geom_bar", + "geom_beeswarm", "geom_bin_2d", "geom_bin2d", "geom_blank", diff --git a/plotnine/geoms/geom_beeswarm.py b/plotnine/geoms/geom_beeswarm.py new file mode 100644 index 0000000000..8a948240fa --- /dev/null +++ b/plotnine/geoms/geom_beeswarm.py @@ -0,0 +1,30 @@ +from ..doctools import document +from .geom_point import geom_point + + +@document +class geom_beeswarm(geom_point): + """ + Draw a beeswarm plot + + {usage} + + A beeswarm plot is a data visualization chart suitable for plotting + any single variable in a multiclass dataset. It is an enhanced + jitter strip chart, where the width of the jitter is controlled + by the density distribution of the data within each class. + + Parameters + ---------- + {common_parameters} + + See Also + -------- + plotnine.stat_beeswarm : The default `stat` for this `geom`. + + References + ---------- + + """ + + DEFAULT_PARAMS = {"stat": "beeswarm", "position": "dodge"} diff --git a/plotnine/stats/__init__.py b/plotnine/stats/__init__.py index bd724fc5b2..068c9a8726 100644 --- a/plotnine/stats/__init__.py +++ b/plotnine/stats/__init__.py @@ -2,6 +2,7 @@ Statistics """ +from .stat_beeswarm import stat_beeswarm from .stat_bin import stat_bin from .stat_bin_2d import stat_bin2d, stat_bin_2d from .stat_bindot import stat_bindot @@ -27,6 +28,7 @@ from .stat_ydensity import stat_ydensity __all__ = ( + "stat_beeswarm", "stat_count", "stat_bin", "stat_bin_2d", diff --git a/plotnine/stats/stat_beeswarm.py b/plotnine/stats/stat_beeswarm.py new file mode 100644 index 0000000000..ea14ccd99f --- /dev/null +++ b/plotnine/stats/stat_beeswarm.py @@ -0,0 +1,286 @@ +from typing import TYPE_CHECKING, cast + +import numpy as np +import pandas as pd + +from .._utils import array_kind, jitter, nextafter_range, resolution +from ..doctools import document +from ..exceptions import PlotnineError +from ..mapping.aes import has_groups +from .binning import breaks_from_bins, breaks_from_binwidth +from .stat import stat +from .stat_density import compute_density + +if TYPE_CHECKING: + from plotnine.typing import FloatArray, IntArray + + +def van_der_corput(n: int) -> np.ndarray: + """Van der Corput low-discrepancy sequence of length n. + + Rotated so the value closest to 0.5 comes first, placing the + minimum-y point at the swarm centre. + """ + if n <= 0: + return np.array([]) + indices = np.arange(n, dtype=np.uint32) + bytes_ = indices.astype(">u4").view(np.uint8).reshape(n, 4) + vdc = np.unpackbits(bytes_, axis=1) @ np.exp2(-np.arange(32, 0, -1)) + start = int(np.argmin(np.abs(vdc - 0.5))) + return np.roll(vdc, -start) + + +@document +class stat_beeswarm(stat): + """ + Compute beeswarm plot values + + {usage} + + Parameters + ---------- + {common_parameters} + binwidth : float, default=None + The width of the bins. The default is to use bins that + cover the range of the data. You should always override this + value, exploring multiple widths to find the best to + illustrate the stories in your data. + bins : int, default=50 + Number of bins. Overridden by binwidth. + method : Literal["density", "counts"], default="density" + Choose the method to spread the samples within the same bin + along the x-axis. Available methods: "density", "counts" + (can be abbreviated, e.g. "d"). See Details. + maxwidth : float, default=None + Control the maximum width the points can spread into. + Values should be in the range (0, 1). + adjust : float, default=1 + Adjusts the bandwidth of the density kernel when + `method="density"`. see [](`~plotnine.stats.stat_density`). + bw : str | float, default="nrd0" + The bandwidth to use, If a float is given, it is the bandwidth. + The `str`{.py} choices are: + `"nrd0", "normal_reference", "scott", "silverman"`{.py} + + `nrd0` is a port of `stats::bw.nrd0` in R; it is eqiuvalent + to `silverman` when there is more than 1 value in a group. + bin_limit : int, default=1 + If the samples within the same y-axis bin are more + than `bin_limit`, the samples's X coordinates will be adjusted. + This parameter is effective only when `method="counts"`{.py} + scale : Literal["area", "count", "width"], default="area" + How to scale the beeswarm groups. + + - `area` - Scale by the largest density/bin among the + different beeswarms. + - `count` - areas are scaled proportionally to the number of points + - `width` - Only scale according to the maxwidth parameter. + style : + Type of beeswarm plot to draw. The options are + ```python + 'full' # Regular (2 sided) + 'left' # Left-sided half + 'right' # Right-sided half + 'left-right' # Alternate (left first) half by the group + 'right-left' # Alternate (right first) half by the group + ``` + + See Also + -------- + plotnine.geom_beeswarm : The default `geom` for this `stat`. + """ + + _aesthetics_doc = """ + {aesthetics_table} + + **Options for computed aesthetics** + + ```python + "quantile" # quantile + "group" # group identifier + ``` + + Calculated aesthetics are accessed using the `after_stat` function. + e.g. `after_stat('quantile')`{.py}. + """ + + REQUIRED_AES = {"x", "y"} + DEFAULT_PARAMS = { + "geom": "beeswarm", + "position": "dodge", + "binwidth": None, + "bins": None, + "method": "density", + "bw": "nrd0", + "maxwidth": None, + "adjust": 1, + "bin_limit": 1, + "scale": "area", + "style": "full", + } + CREATES = {"scaled"} + + def setup_data(self, data): + if ( + array_kind.continuous(data["x"]) + and not has_groups(data) + and (data["x"] != data["x"].iloc[0]).any() + ): + raise TypeError( + "Continuous x aesthetic -- did you forget aes(group=...)?" + ) + return data + + def setup_params(self, data): + params = self.params + + if params["maxwidth"] is None: + params["maxwidth"] = resolution(data["x"], False) * 0.9 + + if params["binwidth"] is None and self.params["bins"] is None: + params["bins"] = 50 + + # Required by compute_density + params["kernel"] = "gau" # It has to be a gaussian kernel + params["cut"] = 0 + params["gridsize"] = None + params["clip"] = (-np.inf, np.inf) + params["bounds"] = (-np.inf, np.inf) + params["n"] = 512 + + def compute_panel(self, data, scales): + params = self.params + maxwidth = params["maxwidth"] + data = super().compute_panel(data, scales) + + if not len(data): + return data + + if params["scale"] == "area": + data["swarmwidth"] = data["density"] / data["density"].max() + elif params["scale"] == "count": + data["swarmwidth"] = ( + data["density"] + / data["density"].max() + * data["n"] + / data["n"].max() + ) + elif params["scale"] == "width": + data["swarmwidth"] = data["scaled"] + else: + msg = "Unknown scale value '{}'" + raise PlotnineError(msg.format(params["scale"])) + + is_infinite = ~np.isfinite(data["swarmwidth"]) + if is_infinite.any(): + data.loc[is_infinite, "swarmwidth"] = 0 + + data["xmin"] = data["x"] - maxwidth / 2 + data["xmax"] = data["x"] + maxwidth / 2 + data["x_diff"] = 0.0 + data["width"] = maxwidth + + for _, grp in data.groupby("group", sort=False): + idx = grp.index + n = len(grp) + y_rank = np.argsort(np.argsort(grp["y"].to_numpy())) + seq = van_der_corput(n) + data.loc[idx, "x_diff"] = ( + (seq[y_rank] - 0.5) * maxwidth * grp["swarmwidth"].to_numpy() + ) + + # jitter y values if the input is integer, + # but not if it is the same value + y = data["y"].to_numpy() + all_integers = (y == np.floor(y)).all() + some_are_unique = len(np.unique(y)) > 1 + if all_integers and some_are_unique: + # TODO: expose random_state as a stat parameter for reproducibility + data["y"] = jitter(y, random_state=42) + + return data + + def compute_group(self, data, scales): + binwidth = self.params["binwidth"] + maxwidth = self.params["maxwidth"] + bin_limit = self.params["bin_limit"] + weight = None + y = data["y"] + + if len(data) == 0: + return pd.DataFrame() + + elif len(data) < 3 or len(np.unique(y)) < 2: + data["density"] = 1 + data["scaled"] = 1 + elif self.params["method"] == "density": + from scipy.interpolate import interp1d + + # density kernel estimation + range_y = y.min(), y.max() + dens = compute_density(y, weight, range_y, self.params) + densf = interp1d( + dens["x"], + dens["density"], + bounds_error=False, + fill_value="extrapolate", # pyright: ignore + ) + data["density"] = densf(y) + data["scaled"] = data["density"] / dens["density"].max() + else: + expanded_y_range = nextafter_range(scales.y.dimension()) + if binwidth is not None: + bins = breaks_from_binwidth(expanded_y_range, binwidth) + else: + bins = breaks_from_bins(expanded_y_range, self.params["bins"]) + + # bin based estimation + bin_index = pd.cut(y, bins, include_lowest=True, labels=False) # pyright: ignore[reportCallIssue,reportArgumentType] + data["density"] = ( + pd.Series(bin_index) + .groupby(bin_index) + .apply(len)[bin_index] + .to_numpy() + ) + data.loc[data["density"] <= bin_limit, "density"] = 0 + data["scaled"] = data["density"] / data["density"].max() + + # Compute width if x has multiple values + if len(data["x"].unique()) > 1: + width = np.ptp(data["x"]) * maxwidth + else: + width = maxwidth + + data["width"] = width + data["n"] = len(data) + data["x"] = np.mean([data["x"].max(), data["x"].min()]) + + return data + + def finish_layer(self, data): + # Rescale x in case positions have been adjusted + style = self.params["style"] + x_mean = cast("FloatArray", data["x"].to_numpy()) + x_mod = (data["xmax"] - data["xmin"]) / data["width"] + data["x"] = data["x"] + data["x_diff"] * x_mod + group = cast("IntArray", data["group"].to_numpy()) + x = cast("FloatArray", data["x"].to_numpy()) + even = group % 2 == 0 + + def mirror_x(bool_idx): + """ + Mirror x locations along the mean value + """ + data.loc[bool_idx, "x"] = 2 * x_mean[bool_idx] - x[bool_idx] + + match style: + case "left": + mirror_x(x_mean < x) + case "right": + mirror_x(x < x_mean) + case "left-right": + mirror_x(even & (x < x_mean) | ~even & (x_mean < x)) + case "right-left": + mirror_x(even & (x_mean < x) | ~even & (x < x_mean)) + + return data diff --git a/tests/baseline_images/test_geom_beeswarm/method_counts.png b/tests/baseline_images/test_geom_beeswarm/method_counts.png new file mode 100644 index 0000000000000000000000000000000000000000..8952c0dc8a6ca49b5cc2f6b6a7313fa69703bce6 GIT binary patch literal 25943 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 literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_geom_beeswarm/scale_area.png b/tests/baseline_images/test_geom_beeswarm/scale_area.png new file mode 100644 index 0000000000000000000000000000000000000000..88d2b81bd0e4b1ec1b58025f1f520a397a40ef2d GIT binary patch literal 26705 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 wVbgIRb$3cdHZpN2(^?Xitv>wdo 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 literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_geom_beeswarm/scale_count.png b/tests/baseline_images/test_geom_beeswarm/scale_count.png new file mode 100644 index 0000000000000000000000000000000000000000..12e85aa0874cae469527b473bb40684e8ab67f79 GIT binary patch literal 23376 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≈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 literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_geom_beeswarm/style.png b/tests/baseline_images/test_geom_beeswarm/style.png new file mode 100644 index 0000000000000000000000000000000000000000..7cabd866b92f89d19c3c7687e8fdd2c366f256b4 GIT binary patch literal 19255 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 Rv6Ao+QIJuR&XO|r`#)s5oBRL( literal 0 HcmV?d00001 diff --git a/tests/test_geom_beeswarm.py b/tests/test_geom_beeswarm.py new file mode 100644 index 0000000000..f165e38384 --- /dev/null +++ b/tests/test_geom_beeswarm.py @@ -0,0 +1,127 @@ +import numpy as np +import numpy.testing as npt +import pandas as pd + +from plotnine import aes, coord_flip, geom_beeswarm, geom_violin, ggplot +from plotnine.stats.stat_beeswarm import van_der_corput + +n = 50 +random_state = np.random.RandomState(123) +uni = random_state.chisquare(17, n) +bi = np.hstack( + [random_state.normal(4, 0.25, n), random_state.normal(6, 0.25, n)] +) +tri = np.hstack( + [ + random_state.normal(4, 0.125, n), + random_state.normal(5, 0.125, n), + random_state.normal(6, 0.125, n), + ] +) + +cats = ["uni", "bi", "tri"] + +data = pd.DataFrame( + { + "dist": pd.Categorical( + np.repeat(cats, [len(uni), len(bi), len(tri)]), categories=cats + ), + "value": np.hstack([uni, bi, tri]), + } +) + + +def test_scale_area(): + p = ( + ggplot(data, aes("dist", "value")) + + geom_violin(scale="area") + + geom_beeswarm(scale="area") + ) + + assert p == "scale_area" + + +def test_scale_count(): + p = ( + ggplot(data, aes("dist", "value")) + + geom_violin(scale="count") + + geom_beeswarm(scale="count") + ) + + assert p == "scale_count" + + +def test_coord_flip(): + p = ( + ggplot(data, aes("dist", "value")) + + geom_violin(scale="area") + + geom_beeswarm(scale="area") + + coord_flip() + ) + + assert p == "scale_area+coord_flip" + + +def test_method_counts(): + p = ( + ggplot(data, aes("dist", "value")) + + geom_violin() + + geom_beeswarm(method="counts") + ) + + assert p == "method_counts" + + +def test_style(): + p = ( + ggplot(data, aes("dist", "value")) + + geom_violin(style="left-right") + + geom_beeswarm(style="left-right") + ) + + assert p == "style" + + +def test_equal_points_not_collapsed(): + # Two identical y-values must not collapse to the same x position. + df = pd.DataFrame({"x": [1, 1]}) + p = ggplot(df, aes(y="x", x=1)) + geom_beeswarm() + p.draw_test() + + +# --- van_der_corput --- + + +def test_van_der_corput_n0(): + assert len(van_der_corput(0)) == 0 + + +def test_van_der_corput_n1(): + npt.assert_array_equal(van_der_corput(1), [0.0]) + + +def test_van_der_corput_n7(): + npt.assert_array_almost_equal( + van_der_corput(7), [0.5, 0.25, 0.75, 0.125, 0.625, 0.375, 0.0] + ) + + +def test_van_der_corput_first_element_closest_to_half(): + # The rotation guarantees seq[0] is the value in the raw sequence + # closest to 0.5, placing the minimum-y point at the swarm centre. + for n in [2, 3, 8, 50]: + seq = van_der_corput(n) + assert seq[0] == seq[np.argmin(np.abs(seq - 0.5))] + + +def test_van_der_corput_space_filling(): + # After k points the maximum gap between consecutive sorted values + # should shrink as k grows. + result = van_der_corput(32) + prev_max_gap = np.inf + for k in [2, 4, 8, 16, 32]: + sorted_pts = np.sort(result[:k]) + gaps = np.diff(np.concatenate([[0], sorted_pts, [1]])) + max_gap = gaps.max() + assert max_gap < prev_max_gap + prev_max_gap = max_gap