【问题标题】:Coloring labels and lines in a dendrogram plot [duplicate]在树状图中着色标签和线条[重复]
【发布时间】:2017-02-15 19:29:48
【问题描述】:

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

【问题讨论】:

  • 请根据您的确切需求阐明您的问题,最好附上所需输出的说明。

标签: matlab plot matlab-figure dendrogram


【解决方案1】:

似乎没有简单的解决方案。树状图的标签只是 y 轴刻度标签,并且都共享相同的 color 属性。另一方面,线不是在集合中构造的,因此连接到相邻节点之间的所有线都是一个对象。下面的例子说明了这一切:

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


为标签着色

这个 woraround 的想法是用文本替换所有标签,这样它们就可以被着色:

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 轴刻度值处(即它们具有整数 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 取自上面的代码(用于标签),为了清楚起见,我把线加粗了一点。

结果将是:

【讨论】:

  • 嗨。非常感谢,我正在寻找着色标签。我想知道是否可以让线条与其标签的颜色相同?
  • @Excalibur 正如我在上面所写的,您必须更严格地定义通过着色线条是什么意思,最好提供一些示例(手动绘制)来说明您的想法。无论如何,它会比给标签上色更复杂。
  • 例如,如果在第二个图中,前三行将是橙色;第四行蓝色;第五黄;第六紫等。如果两条具有相同颜色的线合并在一起,则合并后的线保持该颜色。如果两条线有不同的颜色,则合并后的线将是黑色的。再次感谢!
  • @Excalibur,正在努力。您能否在您的问题中添加详细说明,以便不阅读此处的 cmets 可以理解?
  • @Excalibur 查看我对“低”级别行的编辑,我将添加其余部分,但前提是您将问题编辑为清晰详细。
猜你喜欢
  • 2013-09-19
  • 2018-03-21
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
相关资源
最近更新 更多