如何在MATLAB Clustergram中自定义列的颜色编码
MATLAB clustergram 自定义列标记颜色实现思路
你不需要依赖ColumnGroupMarker的自动分组规则,完全可以通过操作clustergram的底层图形句柄,自由给任意列(包括同聚类分组内的不同列)指定独立标记颜色,具体实现步骤如下:
- 获取clustergram关联的图窗句柄
正常执行clustergram绘图拿到返回的对象后,直接通过句柄属性获取绑定的图窗:% cgo是你生成clustergram时返回的对象 fig = get(cgo, 'Figure'); - 定位列标记对应的坐标轴
clustergram自动生成的列颜色标记轴有固定的Tag标识,直接通过findobj就能快速定位,不需要逐层遍历子对象:
这个轴位于列聚类树下方、热图主体上方,宽度和热图列范围完全对齐,x轴刻度和热图的列一一对应。colMarkerAx = findobj(fig, 'Tag', 'ColumnMarker'); - 清空原有自动生成的分组色块,按自定义规则绘制颜色块
先清空轴上内置函数生成的分组色块,再根据你自己预设的列-颜色映射表,逐列绘制填充矩形即可。注意绘制前要先获取clustergram聚类后的列重排顺序,避免颜色和列对应错位:
这个步骤完全不受聚类分组规则限制,你可以给任意列设置任意RGB颜色,哪怕是同一聚类分支下的列也可以设置差异化颜色。% 先拿到聚类重排后的列顺序 colOrder = cgo.ColumnOrder; % 调整你的颜色矩阵顺序:oriColColor是你原始数据列顺序对应的n*3 RGB颜色矩阵 sortedColColor = oriColColor(colOrder, :); nCol = length(colOrder); % 清空原有标记 cla(colMarkerAx); % 计算每一列对应的x轴区间 xEdges = linspace(colMarkerAx.XLim(1), colMarkerAx.XLim(2), nCol + 1); yMin = colMarkerAx.YLim(1); yMax = colMarkerAx.YLim(2); hold(colMarkerAx, 'on'); for colIdx = 1:nCol fill(colMarkerAx, ... [xEdges(colIdx), xEdges(colIdx+1), xEdges(colIdx+1), xEdges(colIdx)], ... [yMin, yMin, yMax, yMax], ... sortedColColor(colIdx, :), ... 'EdgeColor', 'none'); end hold(colMarkerAx, 'off'); - 扩展多层标记效果
如果需要实现学术论文里常见的多道行的列注释效果(比如同时标注样本亚型、处理批次、临床特征多个维度),只需要在现有列标记轴的相邻位置,按相同x轴比例新建高度合适的窄坐标轴,重复上述逐列绘制色块的步骤即可,通过调整坐标轴的Position属性控制每层注释条的位置和高度。
注意:不要在clustergram重绘(比如调整聚类方式、更换颜色映射)后再执行自定义绘制,否则自定义色块会被覆盖,建议把自定义绘制的逻辑封装成函数,在每次调整clustergram参数后重新调用即可。
内容的提问来源于stack exchange,提问作者sdoctor
相关产品推荐
相关产品推荐

