Dendrogram with custom colouring

조회 수: 31 (최근 30일)
KA
KA 2017년 2월 14일
편집: T0m07 2023년 5월 22일
Hi, I am preparing dendrograms in MATLAB. I can set the colour threshold as follows:
>> figure()
H = dendrogram(tree,0,'ColorThreshold',1);
set(H,'LineWidth',1.5)
this gives the following output:
I have two questions regarding the above:
1) How can I have MATLAB only colour the largest cluster below my threshold (this would be the one in red)
2) How can I specify the colour
Thanks in advance.

채택된 답변

Adam
Adam 2017년 2월 14일
If you use the
hLines = dendrogram(...)
syntax you will get an array of handles as output. These will be handles to the lines created. These can be coloured individually and with any colour you want. I assume the lines are ordered as specified by the leafOrder although I haven't checked.
X = rand(10,3);
tree = linkage(X,'average');
D = pdist(X);
leafOrder = optimalleaforder(tree,D);
figure()
h = dendrogram(tree,'Reorder',leafOrder);
h(1).Color = 'r';
h(8).Color = [0 0.5 0];
  댓글 수: 3
Adam
Adam 2017년 2월 14일
편집: Adam 2017년 2월 14일
Which version of Matlab are you using? If you are pre R2014b you will instead need
set( h(1), 'Color', 'r' )
etc.
Using this syntax you can also set multiple at the same time which you can't with the newer syntax e.g.
set( h( [1 3 7] ), 'Color', 'r' );
KA
KA 2017년 2월 14일
Sorted - thank you.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

micholeodon
micholeodon 2021년 4월 14일
편집: micholeodon 2021년 4월 14일
Here is how you get colors from your dendrogram and link it with the observations.
By changing 'Color' property in lines stored in h variable below you can change colors in your dendrogram.
clear; close all; clc;
%% Generate example data
rng('default') % For reproducibility
N = 10; % number of observations
X = rand(N,3);
%% Get linkage
tree = linkage(X, 'average');
%% Get desired number of clusters
nClusters = 2;
cutoff = median([tree(end-nClusters+1,3) tree(end-nClusters+2, 3)]);
%% plot tree
figure
h = dendrogram(tree, 'ColorThreshold', cutoff); % h contains Line objects
%% get colors
linesColor = cell2mat(get(h,'Color')); % get lines color;
colorList = unique(linesColor, 'rows');
% NOTE that each row is single line corresponding to the same row in tree
% variable. I use that property below.
X_color = zeros(N,3);
X_cluster = zeros(N,1);
for iLeaf = 1:N
[iRow, ~] = find(tree==iLeaf);
color = linesColor(iRow,:); % !
% assign color to each observation
X_color(iLeaf,:) = color;
% assign cluster number to each observation
X_cluster(iLeaf,:) = find(ismember(colorList, color, 'rows'));
end
%% changing lines color
h(5).Color = [0 1 0]
  댓글 수: 2
Niraj Desai
Niraj Desai 2023년 3월 2일
Thank you! I've been going in circles all afternoon trying to figure this out. Much obliged.
T0m07
T0m07 2023년 5월 22일
편집: T0m07 2023년 5월 22일
I don't think this works if you have more than 30 data points, since then you have more data points than leaves, and your code errors during the for loop.
For your code to work, you need to provide N as an additional input to dendrogram() to define the Maximum number of leaf nodes.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Images에 대해 자세히 알아보기

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by