- Function Signature: Added labels as an input parameter.
- Label Handling: Modified the loop that relabels leaves to use the provided labels array.
polar dendogram with labels
3 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I am having difficulties putting labels on polar dendogram
using code by sam on below
https://www.mathworks.com/matlabcentral/fileexchange/21983-draw-a-polar-dendrogram
and assistance in stackoverflow
https://stackoverflow.com/questions/14856715/represent-a-radial-dendrogram-in-matlab
X= rand(5,20); Y= pdist(X,'cityblock'); Z= linkage(Y,'average'); clf polardendrogram(Z,labels',{'a', 'b', 'c' , 'd', 'e'},'colorthreshold','default'); zoom(0.8); view(2);
but my graphs labels not coming out nicely
0 commentaires
Réponses (1)
Himanshu
le 23 Oct 2024
Hey Ann,
I went thourgh Sam's code on file exchange and was able to make the labels work. I made only little changes to its code which are as follows:
This is the modified code:
function [h,T,perm] = polardendrogram(Z, labels, varargin)
%POLARDENDROGRAM plots a polar dendrogram plot, taking same options as
%dendrogram and giving same outputs.
% Example:
% X= rand(100,2);
% Y= pdist(X,'cityblock');
% Z= linkage(Y,'average');
% [H,T] = polardendrogram(Z,'colorthreshold','default');
% Plot a normal dendrogram
[h,T,perm] = dendrogram(Z, varargin{:});
% Get x and y ranges
xlim = get(gca,'XLim');
ylim = get(gca,'YLim');
minx = xlim(1);
maxx = xlim(2);
miny = ylim(1);
maxy = ylim(2);
xrange = maxx - minx;
yrange = maxy - miny;
% Reshape into a polar plot
for i = 1:size(h)
xdata = get(h(i),'XData');
ydata = get(h(i),'YData');
% Rescale xdata to go from pi/12 to 2pi - pi/12
xdata = (((xdata - minx) / xrange) * (pi * 11 / 6)) + (pi / 12);
% Rescale ydata to go from 1 to 0, cutting off lines
% which drop below the axis limit
ydata = max(ydata, miny);
ydata = 1 - ((ydata - miny) / yrange);
% To make horizontal lines look more circular,
% insert ten points into the middle of the line before
% polar transform
newxdata = [xdata(1), linspace(xdata(2), xdata(3), 10), xdata(4)];
newydata = [ydata(1), repmat(ydata(2), 1, 10), ydata(4)];
% Transform to polar coordinates
[xdata, ydata] = pol2cart(newxdata, newydata);
% Reset line positions to new polar positions
set(h(i), 'XData', xdata);
set(h(i), 'YData', ydata);
end
% Relabel leaves
for i = 1:length(labels)
[x, y] = pol2cart((((i - minx) / xrange) * (pi * 11 / 6)) + (pi * 1 / 12), 1.1);
text(x, y, labels{i}, 'HorizontalAlignment', 'center');
end
% Add and label gridlines
hold on
lineh(1) = polar([0,0], [0,1], '-');
lineh(2) = polar(linspace(0, 2 * pi, 50), ones(1, 50), ':');
lineh(3) = polar(linspace(0, 2 * pi, 50), ones(1, 50) * 0.75, ':');
lineh(4) = polar(linspace(0, 2 * pi, 50), ones(1, 50) * 0.5, ':');
lineh(5) = polar(linspace(0, 2 * pi, 50), ones(1, 50) * 0.25, ':');
set(lineh, 'Color', [0.5, 0.5, 0.5]);
for i = 1:4
[x, y] = pol2cart(0, i / 4);
str = sprintf('%2.1f', ((maxy - miny) * (4 - i) / 4) + miny);
text(x, y, str, 'VerticalAlignment', 'bottom');
end
% Prettier
set(gca, 'XLim', [-1.5, 1.5], 'YLim', [-1.5, 1.5], 'Visible', 'off');
view(3)
axis fill
daspect([1, 1, 100]);
zoom(2.8);
end
And this is how you may utilize the above fucntion:
X = rand(5, 20);
Y = pdist(X, 'cityblock');
Z = linkage(Y, 'average');
labels = {'a', 'b', 'c', 'd', 'e'}; % Define your labels here
clf;
polardendrogram(Z, labels, 'colorthreshold', 'default');
zoom(0.8);
view(2);
Hope this helps!
0 commentaires
Voir également
Catégories
En savoir plus sur Data Exploration dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!