Quick Start#

Basic usage#

from densitree import SPADE

# X is any (n_cells, n_features) array
spade = SPADE(n_clusters=30, downsample_target=0.1, random_state=42)
labels = spade.fit_predict(X)

With a pandas DataFrame#

Column names are automatically preserved in the result:

import pandas as pd
from densitree import SPADE

df = pd.read_csv("cytometry_data.csv")
markers = ["CD3", "CD4", "CD8", "CD19", "CD56"]

spade = SPADE(n_clusters=30, downsample_target=0.1, random_state=42)
spade.fit(df[markers])

# Cluster stats include median_CD3, median_CD4, etc.
print(spade.result_.cluster_stats_)

Visualization#

# Static matplotlib plot
fig = spade.result_.plot_tree(color_by="CD3", backend="matplotlib")
fig.savefig("tree.png", dpi=150)

# Interactive plotly plot
fig = spade.result_.plot_tree(color_by="CD3", backend="plotly")
fig.show()
Example SPADE tree

Choosing parameters#

Parameter

Default

Guidance

n_clusters

50

20–100 depending on expected complexity. More clusters = finer resolution but noisier tree.

downsample_target

0.05

Fraction of cells retained. Lower = faster but may lose structure. 0.05–0.2 typical.

knn

5

Neighborhood size for density estimation. 5–10 for most datasets.

transform

"arcsinh"

Use "arcsinh" for cytometry (cofactor=5 for CyTOF, 150 for flow), "log" for counts, None if pre-transformed.

cofactor

150.0

Arcsinh denominator. 5.0 for CyTOF, 150.0 for fluorescence.