树形图中的着色标签和线

时间:2017-02-15 19:29:48

标签: matlab plot matlab-figure dendrogram

我想更改与其标签对应的树形图中的线条颜色。但是,我以前从未见过这样的事情。所以我想至少改变文本标签的颜色。

1 个答案:

答案 0 :(得分:1)

似乎没有简单的解决方案。树形图的标签只是y轴刻度标签,并且都共享相同的color属性。另一方面,线不是成组构造的,因此连接到相邻节点的所有线都是一个对象。以下示例说明了所有内容:

color dend

现在问题是你对颜色线的具体目的是什么?主要是,你想用垂直线做什么?

着色标签

这个世界的想法是用文字替换所有的标签,所以它们可以被涂上色彩的光泽:

ax = gca; % get the axes handle
lab = ax.YAxis.TickLabels; % get all the labels
loc = ax.YAxis.TickValues; % get all labels location
[ulab,~,lab_ind] = unique(lab); % find all unique labels
clr = lines(numel(ulab)); % make a color map
for k = 1:numel(ulab) % for every type of lable
    ind = strcmp(ulab{k},lab); % find all instances in lab
    x = repelem(ax.XAxis.Limits(1)-0.01,sum(ind)); % make an x position vector
     % place this lable at the same locations with a distinct color:
    text(x,loc(ind),lab(ind),'Color',clr(k,:));
end
ax.YAxis.TickLabels = []; % remove the original labels
% replace the original labels with white space, to keep the axes position:
ax.YAxis.TickLabels = repelem('  ',max(cellfun(@numel,lab)));

color dend lables

着色第一级线

这里的想法类似 - 在当前行上方放置一条与标签颜色相同的行。节点将在稍后处理。

首先,我们必须从图中收集所有坐标数据:

ax = gca; % get the axes handle
X = get(ax.Children,'XData'); % Get x values of all lines
Y = get(ax.Children,'YData'); % Get y values of all lines

这必须在添加彩色标签之前完成(如果您也选择这样做),这样您就不会收到错误。

然后,如果它们被放置在y轴刻度值(即它们具有整数y数据),我们可以遍历线并对它们着色。回想一下(并查看picture above提醒)每个line对象基本上是3条连线,所以我们只想查看第一行和最后一行:

for k = 1:numel(Y)
    if Y{k}(1)==fix(Y{k}(1))
        line(ax,X{k}(1:2),Y{k}(1:2),'Color',clr(lab_ind(Y{k}(1)),:),...
            'LineWidth',2);
    end
    if Y{k}(3)==fix(Y{k}(3))
        line(ax,X{k}(3:4),Y{k}(3:4),'Color',clr(lab_ind(Y{k}(3)),:),...
            'LineWidth',2);
    end
end

clrlab_ind取自上面的代码(对于标签),为了清晰起见,我将线条稍微粗了一点。

结果将是:

color dend 2