You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MATLAB Clustergram中自定义列的颜色编码

MATLAB clustergram 自定义列标记颜色实现思路

你不需要依赖ColumnGroupMarker的自动分组规则,完全可以通过操作clustergram的底层图形句柄,自由给任意列(包括同聚类分组内的不同列)指定独立标记颜色,具体实现步骤如下:

  • 获取clustergram关联的图窗句柄
    正常执行clustergram绘图拿到返回的对象后,直接通过句柄属性获取绑定的图窗:
    % cgo是你生成clustergram时返回的对象
    fig = get(cgo, 'Figure');
    
  • 定位列标记对应的坐标轴
    clustergram自动生成的列颜色标记轴有固定的Tag标识,直接通过findobj就能快速定位,不需要逐层遍历子对象:
    colMarkerAx = findobj(fig, 'Tag', 'ColumnMarker');
    
    这个轴位于列聚类树下方、热图主体上方,宽度和热图列范围完全对齐,x轴刻度和热图的列一一对应。
  • 清空原有自动生成的分组色块,按自定义规则绘制颜色块
    先清空轴上内置函数生成的分组色块,再根据你自己预设的列-颜色映射表,逐列绘制填充矩形即可。注意绘制前要先获取clustergram聚类后的列重排顺序,避免颜色和列对应错位:
    % 先拿到聚类重排后的列顺序
    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');
    
    这个步骤完全不受聚类分组规则限制,你可以给任意列设置任意RGB颜色,哪怕是同一聚类分支下的列也可以设置差异化颜色。
  • 扩展多层标记效果
    如果需要实现学术论文里常见的多道行的列注释效果(比如同时标注样本亚型、处理批次、临床特征多个维度),只需要在现有列标记轴的相邻位置,按相同x轴比例新建高度合适的窄坐标轴,重复上述逐列绘制色块的步骤即可,通过调整坐标轴的Position属性控制每层注释条的位置和高度。

注意:不要在clustergram重绘(比如调整聚类方式、更换颜色映射)后再执行自定义绘制,否则自定义色块会被覆盖,建议把自定义绘制的逻辑封装成函数,在每次调整clustergram参数后重新调用即可。

内容的提问来源于stack exchange,提问作者sdoctor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:48:22