如何调整热图绘图方向、反转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
相关产品推荐
相关产品推荐

