Source code for glyphx.swarm_plot
import numpy as np
from collections import defaultdict
[docs]
class SwarmPlotSeries:
def __init__(self, data, categories=None, color="#1f77b4", size=4, jitter=6):
self.data = data # List of lists: one per category
self.categories = categories or list(range(len(data)))
self.color = color
self.size = size
self.jitter = jitter
[docs]
def to_svg(self, ax, use_y2=False):
scale_y = ax.scale_y2 if use_y2 else ax.scale_y
scale_x = ax.scale_x
elements = []
for i, values in enumerate(self.data):
y_buckets = defaultdict(list)
for v in values:
y = scale_y(v)
y_buckets[y].append(v)
for y_scaled, vlist in y_buckets.items():
count = len(vlist)
for j, v in enumerate(vlist):
offset = (j - count // 2) * self.jitter
cx = scale_x(i) + offset
cy = scale_y(v)
elements.append(f'<circle cx="{cx}" cy="{cy}" r="{self.size}" fill="{self.color}"/>')
return "\n".join(elements)