基因表达热图美化工具
用于基因表达热图的专业美化工具,自动添加聚类树状图、颜色注释条带,并智能优化标签布局。
输入校验
本技能接受:包含基因表达矩阵的 CSV 文件(基因为行、样本为列),用于生成和美化热图。
如果用户的请求不涉及热图生成或基因表达可视化——例如要求进行差异表达分析、统计检验,或生成其他类型的图表——不要继续执行。请回复:
"heatmap-beautifier 专注于从表达矩阵数据生成并美化基因表达热图。您的请求似乎超出了本技能的范围。请提供 CSV 格式的表达矩阵文件,或使用更合适的工具来完成您的任务。"
当请求超出范围、缺少必需的 CSV 输入,或需要引入未经确认的假设时,不要继续执行工作流。对于缺失的输入,请明确说明具体缺少哪些字段。
快速检查
python -m py_compile scripts/main.py
python scripts/main.py --help
# 最小可运行示例(需准备一个小型 CSV 表达矩阵):
python scripts/main.py -i expression_matrix.csv -o test_heatmap.pdf
脚本本身没有内置演示/
--demo模式,运行前需要提供真实的 CSV 表达矩阵文件(见下方"输入数据格式")。
适用场景
- 为基因表达热图添加聚类树状图和注释条带并进行美化
- 生成发表级热图输出(PDF、PNG、SVG 等),并优化标签布局
- 为表达矩阵添加行/列注释色带
- 统一稿件图表的热图风格
工作流程
- 校验输入 —— 在开始处理前先确认请求是否在范围内。
- 确认用户目标、必需输入以及不可协商的约束条件。
- 使用打包脚本路径,或在仅有实际可用输入的情况下走文档化的推理路径。
- 返回结构化结果,清晰区分假设、交付物、风险与未解决事项。
- 如果执行失败或输入不完整,切换到回退路径,并明确说明具体是什么阻碍了完整交付。
功能特性
- 自动聚类:基于层次聚类自动添加行/列聚类树状图
- 注释条带:支持多个颜色注释条带(样本分组、基因分类等)
- 智能标签:自动计算最优字号,避免行/列标签重叠
- 灵活配色:内置多种专业科研配色方案
- 导出选项:支持 PDF、PNG、SVG、EPS、TIFF 格式(根据输出文件的扩展名自动判断,遇到不支持的扩展名会回退为 PDF)
依赖项
pip install seaborn matplotlib scipy pandas numpy
用法
基础用法(Python API)
import sys
sys.path.insert(0, "scripts")
from main import HeatmapBeautifier
hb = HeatmapBeautifier()
hb.create_heatmap(
data_path="expression_matrix.csv",
output_path="output/heatmap.pdf"
)
命令行用法
python scripts/main.py \
-i expression_matrix.csv \
-o heatmap.pdf
python scripts/main.py \
-i expression_matrix.csv \
-o heatmap.pdf \
--row-cluster \
--col-cluster \
--row-annot row_annot.json \
--col-annot col_annot.json \
--title "基因表达情况"
文档修正说明:源版本 SKILL.md 记录了脚本中实际不存在的选项,包括
--demo、--output-json、--format、--data-path/-d,以及参数名--row-annotations/--col-annotations(实际参数名为--row-annot/--col-annot)。本文档已按scripts/main.py中argparse的真实定义重新核对并修正上述示例和参数表。
参数
| 参数 | 类型 | 默认值 | 是否必需 | 说明 |
|-----------|------|---------|----------|-------------|
| -i, --input | string | - | 是 | 输入表达矩阵文件路径(CSV) |
| -o, --output | string | - | 是 | 输出图像路径,扩展名决定导出格式 |
| -t, --title | string | 基因表达热图 | 否 | 图表标题 |
| --cmap | string | RdBu_r | 否 | 配色方案 |
| --center | float | 0 | 否 | 颜色映射中心值 |
| --vmin | float | 无(按数据自动确定) | 否 | 颜色刻度最小值 |
| --vmax | float | 无(按数据自动确定) | 否 | 颜色刻度最大值 |
| --row-cluster | flag | 关闭 | 否 | 启用行聚类 |
| --col-cluster | flag | 关闭 | 否 | 启用列聚类 |
| --row-annot | string | - | 否 | 行注释 JSON 文件路径 |
| --col-annot | string | - | 否 | 列注释 JSON 文件路径 |
| --standard-scale | string | 无 | 否 | 标准化方式:row、col |
| --z-score | int | 无 | 否 | Z-score 标准化:0(按行)、1(按列) |
| --figsize | 两个浮点数 | 无(按数据量自动计算) | 否 | 图像尺寸(宽 高,单位英寸) |
| --dpi | int | 300 | 否 | 输出分辨率(每英寸点数) |
| --hide-row-labels | flag | 关闭 | 否 | 隐藏行标签 |
| --hide-col-labels | flag | 关闭 | 否 | 隐藏列标签 |
| --rotate-col | float | 45 | 否 | 列标签旋转角度 |
| -v, --verbose | flag | 关闭 | 否 | 保留参数,当前版本对输出无实际影响 |
--input 和 --output 均为必需参数。
重要提示(行为差异):
--row-cluster/--col-cluster在命令行中是store_true开关,如果不显式传入,命令行调用默认不启用聚类(不会绘制树状图)。这与HeatmapBeautifier.create_heatmap()方法本身的默认值不同——直接通过 Python API 调用该方法且不传参时,row_cluster/col_cluster默认为True(开启聚类)。请根据实际调用方式(命令行 vs. Python API)确认聚类是否会生效。
输入数据格式
表达矩阵(CSV)
,sample1,sample2,sample3,sample4
Gene_A,2.5,-1.2,0.8,-0.5
Gene_B,-0.8,1.5,-2.1,0.3
Gene_C,1.2,0.5,-0.7,1.8
- 第一列:基因名称(行索引)
- 第一行:样本名称(列名)
- 数据内容:表达值(例如 log2 fold change、TPM、FPKM)
配色方案
脚本内置以下命名配色方案(cmap 参数可直接使用任意有效的 matplotlib/seaborn 配色名,此处仅列出内置说明中收录的选项):
"RdBu_r"—— 红蓝配色(经典差异表达配色)"viridis"—— 黄紫配色(适合连续型数据)"RdYlBu_r"—— 红黄蓝配色"coolwarm"—— 冷暖配色"seismic"—— 地震图配色"bwr"—— 蓝白红配色"Spectral_r"—— 光谱配色"BrBG_r"—— 棕绿配色
后两项(
Spectral_r、BrBG_r)在源文档中未列出,但实际存在于脚本COLOR_PALETTES字典中,已补充到此列表。
错误处理
- 如果必需输入缺失,明确说明具体缺少哪些字段,只索取最少的补充信息。
- 如果任务超出文档化的范围,应停止执行,而不是猜测或擅自扩大任务范围。
- 如果
scripts/main.py执行失败,报告失败发生的具体位置,总结哪些部分仍可安全完成,并提供人工回退方案。 - 不得编造文件、引用、数据、检索结果或执行结果。
- 异常处理:
load_data()中的 CSV 解析使用except (pd.errors.ParserError, UnicodeDecodeError, ValueError)而非裸露的except:,避免误吞其他异常。 - 错误传播:
FileNotFoundError和ValueError在main()中通过try/except (FileNotFoundError, ValueError) as e: print(f'错误:{e}', file=sys.stderr); sys.exit(1)捕获,并以退出码 1 输出到标准错误流。
文档修正说明:源版本 SKILL.md 声称上述异常处理与错误传播已经实现,但对照实际脚本发现
load_data()中用的是裸露的except:,且main()中完全没有try/except包裹、也没有import sys,任何FileNotFoundError都会直接抛出未处理的原始 traceback。本次本地化已在打包脚本中修复了这两处真实缺陷(补充精确的异常类型、补充import sys与main()中的try/except),使脚本行为与本文档描述一致。
回退方案
如果 scripts/main.py 执行失败或所需输入不完整:
- 报告确切的失败位置和错误信息。
- 说明哪些工作仍可完成(例如,仅做数据校验而不渲染图像)。
- 人工回退:确认 CSV 格式是基因为行、样本为列,然后使用最简选项重新运行:
python scripts/main.py -i data.csv -o out.png。 - 若怀疑聚类未生效,检查是否遗漏了
--row-cluster/--col-cluster开关(见上方"重要提示")。 - 不得编造执行结果或文件内容。
输出要求
每次最终回复在相关情况下都应明确包含以下内容:
- 目标或所需交付物
- 使用的输入及引入的假设
- 工作流程或决策路径
- 核心结果、建议或交付物
- 约束、风险、注意事项或验证需求
- 未解决事项及下一步检查
回复模板
对于非简单请求,使用以下固定结构:
- 目标
- 收到的输入
- 假设
- 工作流程
- 交付物
- 风险与限制
- 下一步检查
对于压力测试/多约束请求,还应包含:
- 约束清单(合规性、性能、错误路径)
- 未解决事项及明确的阻塞原因
如果请求较为简单,可以精简结构,但仍需在影响正确性时明确说明假设和限制。
说明
- 建议先对数据进行 log2 转换或标准化处理
- 大型数据集(超过 5000 行)处理时间可能较长
- 当行/列数量过多时,部分标签会被自动隐藏
- 脚本调用
sns.clustermap()时未显式传入method参数,实际默认聚类方式是欧氏距离(Euclidean distance)+ 平均距离法(average linkage),并非源文档中所述的 Ward 法,此处已修正
Scan to join WeChat group