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

如何调整热图绘图方向、反转Y轴并优化刻度显示?

解决方案

针对你的三个需求,以下是修改后的代码及对应说明:

修改点说明

1. 反转Y轴(0在底部、176000在顶部)

通过设置imshow的origin='lower'参数,让Y轴起始值(对应序列位置0)位于图表底部,最大值位于顶部;也可使用plt.gca().invert_yaxis()实现相同效果,二选一即可。

2. 按SSR分组填充列(先填第一列再填下一列)

原代码中heatmap_data维度为(SSR数量, 分箱数量),每一行对应一个SSR的所有分箱数据。将其转置为(分箱数量, SSR数量)后,每一列对应一个SSR,绘图时会从下到上填充每一列数据。

3. 刻度标记居中

  • X轴(SSR标签):将刻度位置设为np.arange(len(ssr_labels)) + 0.5,让每个标签对应列的中间位置;
  • Y轴(序列位置):将刻度位置设为ytick_positions + 0.5,让每个刻度对应分箱的中间位置。

修改后的完整代码

import numpy as np
import matplotlib.pyplot as plt

bin_size = 11000
# 假设seq_length和ssr2_locations为已定义变量
# seq_length = 176000
# ssr2_locations = {"SSR1": [xxx], "SSR2": [xxx], ...}

heatmap_data = np.zeros((len(ssr2_locations), seq_length // bin_size))
ssr_labels = list(ssr2_locations.keys())
for i, ssr in enumerate(ssr2_locations):
    ssr_locations = np.array(ssr2_locations[ssr]) # 转为NumPy数组
    for j in range(seq_length // bin_size):
        heatmap_data[i, j] = np.sum((ssr_locations >= j*bin_size) & (ssr_locations < (j+1)*bin_size))

# 转置数据,实现按SSR列分组填充
heatmap_data = heatmap_data.T

plt.figure(figsize=(20, 10))
# 设置origin='lower'让Y轴0在底部
plt.imshow(heatmap_data, cmap='Blues', origin='lower')
plt.colorbar()

# X轴刻度居中,添加rotation避免标签重叠
plt.xticks(np.arange(len(ssr_labels)) + 0.5, ssr_labels, rotation=45)

# Y轴刻度居中,包含176000刻度
ytick_labels = np.arange(0, seq_length + bin_size, bin_size)
ytick_positions = ytick_labels // bin_size
plt.yticks(ytick_positions + 0.5, ytick_labels)

plt.title("SSR Density Heatmap")
plt.xlabel("SSR")
plt.ylabel("Nucleotide Sequence Position")
plt.tight_layout() # 自动调整布局防止标签截断
plt.show()

额外提示

  • 若转置后颜色映射不符合预期,可添加vmin/vmax参数调整,或使用反转色阶(如cmap='Blues_r');
  • plt.tight_layout()可自动优化图表元素位置,避免坐标轴标签、标题被截断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:17:47