sp.parcats() is the categorical counterpart to parallel(): instead of numeric axes with one polyline per row, each axis holds a set of discrete category values, and ribbons flow between adjacent axes with width proportional to how many rows share that pair of categories — the standard chart for tracing how categorical attributes co-occur across a dataset (e.g. gender → survival → class). Internally it builds a node for every distinct (axis, category) pair and an edge for every consecutive-axis transition, then reuses the exact same layered layout engine and bezier ribbon renderer as sankey() (sankey::common::compute_layout / sankey_link_path) — the two charts share their positioning math, not just their visual family.
Data shape — category_series is a list of rows, each row a list of category values with one entry per axis (category_series[row][axis]), mirroring exactly the row-major shape already used by parallel(series=...).
Dims every ribbon except each node's single heaviest outgoing flow, which is boosted to full opacity with a thin white outline — traces the dominant path through the categories.
sp.parcats() est l'équivalent catégoriel de parallel() : au lieu d'axes numériques avec une polyligne par ligne, chaque axe contient un ensemble de valeurs catégorielles discrètes, et des rubans relient les axes adjacents avec une largeur proportionnelle au nombre de lignes partageant cette paire de catégories — le graphique de référence pour tracer comment des attributs catégoriels co-occurrent dans un jeu de données (ex : genre → survie → classe). En interne, un nœud est créé pour chaque paire distincte (axe, catégorie) et une arête pour chaque transition entre axes consécutifs, puis le moteur de layout en couches et le rendu de rubans en bézier de sankey() sont réutilisés tels quels (sankey::common::compute_layout / sankey_link_path) — les deux graphiques partagent leurs mathématiques de positionnement, pas seulement leur famille visuelle.
Forme des données — category_series est une liste de lignes, chaque ligne une liste de valeurs catégorielles avec une entrée par axe (category_series[ligne][axe]), reprenant exactement la forme ligne-par-ligne déjà utilisée par parallel(series=...).
Estompe tous les rubans sauf le flux sortant le plus lourd de chaque nœud, poussé à pleine opacité avec un fin contour blanc — trace le chemin dominant à travers les catégories.