在树状图中为标签和线条着色
Coloring labels and lines in a dendrogram plot
我想更改树状图中与其标签对应的线条颜色。但是,我以前从未见过这样的东西。所以我想至少更改文本标签的颜色。
似乎没有简单的解决方案。树状图的标签只是 y-axis 个刻度标签,并且都共享相同的 color
属性。另一方面,线不是按集合构造的,因此连接到相邻节点的所有线都是一个对象。以下示例说明了所有这些:
现在的问题是,您对线条进行着色的具体目的是什么?主要是,你想用垂直线做什么?
给标签上色
这个解决方案的想法是用文本替换所有标签,这样它们就可以涂上鲜艳的颜色:
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)));
为第一层线着色
这里的想法是相似的——在当前行上方放置一条与标签颜色相同的线。稍后会处理节点。
首先,我们要收集图中所有的坐标数据:
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-axis 刻度值(即它们具有整数 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
clr
和 lab_ind
取自上面的代码(用于标签),为了清楚起见,我将线条粗了一点。
结果将是:
我想更改树状图中与其标签对应的线条颜色。但是,我以前从未见过这样的东西。所以我想至少更改文本标签的颜色。
似乎没有简单的解决方案。树状图的标签只是 y-axis 个刻度标签,并且都共享相同的 color
属性。另一方面,线不是按集合构造的,因此连接到相邻节点的所有线都是一个对象。以下示例说明了所有这些:
现在的问题是,您对线条进行着色的具体目的是什么?主要是,你想用垂直线做什么?
给标签上色
这个解决方案的想法是用文本替换所有标签,这样它们就可以涂上鲜艳的颜色:
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)));
为第一层线着色
这里的想法是相似的——在当前行上方放置一条与标签颜色相同的线。稍后会处理节点。
首先,我们要收集图中所有的坐标数据:
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-axis 刻度值(即它们具有整数 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
clr
和 lab_ind
取自上面的代码(用于标签),为了清楚起见,我将线条粗了一点。
结果将是: