spinePlot

Show where a partition came from: the measure, and the profile behind it.
Two panels. The left is where multiplicative scale separation is visible, or visibly absent. The right says whether a single stratum means no structure at all, or structure that is not entropic.

Syntax and options

help spinePlot
SPINE Plot Show where a SPINE partition came from: the measure, and the profile. fig = spinePlot(Result) fig = spinePlot(Info) fig = spinePlot(..., 'Width', 178, 'Title', 'my data') Two panels: the measure The sorted measure against rank, strata shaded, each cut marked with its value. This is where multiplicative scale separation is visible, or visibly absent. the profile The incremental nested entropy, candidates marked. When the measure panel shows a single stratum, this one says whether the data had no structure or merely no entropic structure. To see your data itself, coloured by score, use spineDataPlot. It gets a figure of its own so it can be drawn properly. Options 'Width' figure width in millimetres (default 178, manuscript width) 'Height' figure height in millimetres (default 72) 'Title' text placed above the panels 'Scale' "auto" (default), "linear", or "log" for the measure axis Uses base MATLAB only. Author Abd AlRahman AlMomani Assistant Professor of Data Science and Mathematics, ERAU, AZ almomaniar@gmail.com

A partition with clear separation

rng(20260810);
X = [randn(240,8); randn(45,8) + 6; randn(15,8) + 30];
[~, Result] = spine(X, 'robustrownorm', "upper");
spinePlot(Result, 'Title', 'three planted scales');

Reading it

The left panel shades alternate strata and marks each cut with its value. The right panel plots the incremental nested entropy against rank, with candidate boundaries as open circles and retained boundaries filled.

When nothing is found

The profile panel is the one to look at. A profile that simply rises has no transition to cut on, which is a different statement from "the data has no groups".
rng(3);
[~, Flat] = spine(randn(300,4), 'dist2median', "upper");
spinePlot(Flat, 'Title', 'no separation');

It also accepts a bare Info record

Useful when the objects are not rows and there is no data to draw, as with the singular measure.
rng(77);
M = randn(60,25) * diag([40 26 15, 0.6*ones(1,22)]);
[~, Rsv] = spine(M, 'singular', "upper");
spinePlot(Rsv.Info, 'Title', 'singular values, with the cut');

See also

spineDataPlot for the data itself, spineSummary to read the same partition in words.
close all