修复clustergram列标签未对齐

时间:2018-01-18 07:29:00

标签: matlab alignment customization matlab-figure heatmap

在下面的代码中,我尝试用红色突出显示特定列。但是,生成的标签颜色条未与标签对齐,如图所示。我怎么能纠正这个?

datdat = randn(5,10);
regregnames = {'A', 'B', 'C', 'D', 'E'};
colors = cell(1,size(datdat,2));
for i=1:size(datdat,2)
    colors{i} = [1,1,1];
end
colors{3} = [1,0,0];
s.Labels = arrayfun(@num2str, 1:size(datdat,2), 'UniformOutput', false);
s.Colors = colors;
clscls = clustergram(datdat, 'RowLabels', regregnames, 'ColumnLabels', s.Labels, 'ColumnLabelsColor', s, 'LabelsWithMarkers', true);

Image with misalignment

1 个答案:

答案 0 :(得分:1)

这绝对是MATLAB中的一个错误。我怎么知道?通过检查clustergram.plot函数。

如果我们在第142行设置断点positionAxes(obj, imAxes),并运行您的代码直到那一点,我们得到下图:

Intermediate plot with correct positioning of the bottom bar

其中对齐方式正确,但树形图不可见。然后,代码继续重新定位轴(主要是使它们更小),而不幸的是忽略了带有红色标签的底部。

要了解如何解决这个问题,我们应该稍微回过头来,HeatMap.plot > initHMAxes创建这个底栏并查找其句柄的存储位置。然后,我们需要做的就是根据positionclustergram)的其余部分调整此元素的HeatMap

我将继续挖掘句柄/ appdata“作为读者的练习”,但长话短说,只需将其添加到代码的末尾:

hAx = struct(clscls).HMAxesHandle;
data = getappdata(hAx, 'HeatMapAxesData');
data.XMarkerAxes.Position = data.XMarkerAxes.Position.*[0 1 0 1] + hAx.Position.*[1 0 1 0];

结果:

The desired result

顺便说一句,在R2017b上,我收到以下警告:

Warning: COLUMNLABELSCOLOR is not supported and will be removed in a future release.
Use LabelsWithMarkers for similar functionality.

从技术上讲,这不是一个错误,而是一个不受支持的功能。