分子动力学数据可视化:氨基酸相互作用热图的高效绘制!

学术   2024-09-13 07:44   日本  
引言

大家好,今天我们来聊聊如何用Python绘制热图,以直观展示分子动力学模拟中氨基酸在不同时间点的相互作用!这对于我们分析分子结构、动态变化,以及氨基酸之间的接触频率特别有帮助。

以Desmond分子动力学模拟产生的数据为例,我们将通过读取Excel文件的数据,展示每个氨基酸在不同时间点的出现次数。绘制的热图也仿照Desmond报告的热图样式。

为了处理方便,我们首先需要将分子动力学产生的数据文件进行整理,将相互作用方式整理至Excel文件中,这个步骤比较简单,这里就不详细介绍了。本例中整理的结果如下:

一共分为三列,第一列Frame为时间帧,第二列Amino_Acid为氨基酸名称和编号,第三列Interaction为相互作用类型。当然如果是绘制总的相互作用热图,我们直接统计氨基酸出现的频次即可,不需要第三列的相互作用类型。

本例中整理的相互作用数据有4600多个,手动处理是比较繁琐的。

核心步骤

  1. 读取分子动力学数据:首先,我们使用pandas库读取包含分子动力学数据的Excel文件。这个Excel文件中包含了分子动力学模拟中不同时间帧的氨基酸接触信息。

file_path = 'Contacts.xlsx'  # 文件路径
sheet_name = 'Summary' # 工作表名称
df = pd.read_excel(file_path, sheet_name=sheet_name)
  1. 数据处理:将时间帧(Frame) 转换为时间片段,并计算每个氨基酸在不同时间点的接触次数。展示相互作用时,直接使用时间帧可能会导致数据过于密集,不便于观察和分析。因此,我们通过将时间帧按一定比例(比如0.2)转换为时间片段,让每个片段表示一个具体的时间点。这里的比例需要大家根据分子动力学时设置的步长去进行调整。例如,在这段代码中,时间片段的单位是纳秒(ns)。

df['Frame'] = (df['Frame'] * 0.2).astype(int)
  1. 数据透视表创建:我们根据时间片段和氨基酸名称,生成一个数据透视表,记录每个氨基酸在不同时间点接触的频次。透视表的行是氨基酸名称,列是时间片段,单元格中的值是氨基酸在该时间片段内的接触次数。

pivot_table = df.pivot_table(index='Amino_Acid', columns='Frame', aggfunc='size', fill_value=0)
  1. 自定义热图颜色:为了更好地显示接触次数的差异,我们自定义了一个颜色映射,颜色从白色深紫色渐变,越深的颜色表示氨基酸接触频次越高。

colors = ['white', '#000080']
cmap = LinearSegmentedColormap.from_list('custom_cmap', colors, N=256)
  1. 绘制热图:使用seaborn生成热图,X轴代表时间,颜色越深表示接触次数越多,并设置热图的详细参数以使得热图更加美观。

plt.figure(figsize=(10, 8))  # 设置图片大小
heatmap = sns.heatmap(pivot_table, cmap=cmap, annot=False, fmt='d')

# 设置X轴标签并调整字体
plt.xlabel('Time (ns)', fontsize=14, labelpad=5, fontweight='bold')

# 隐藏Y轴标签
plt.ylabel('')

# 自定义X轴刻度,并显示为整数时间片段
ax = plt.gca()
ax.set_xticks([0, 25, 50, 75, 100, 125, 150, 175, 200])
ax.set_xticklabels([0, 25, 50, 75, 100, 125, 150, 175, 200])
plt.xticks(rotation=0)

# 显示坐标轴的四个边框,增强图像边界的可见性
for spine in ax.spines.values():
spine.set_visible(True)

# 调整颜色条的宽度,并加上标签
cbar = heatmap.collections[0].colorbar
cbar.ax.tick_params(labelsize=10, width=1)
cbar.outline.set_linewidth(1)
cbar.set_label('# of contacts', fontsize=12, fontweight='bold')

# 调整布局,使图像不重叠
plt.tight_layout()

# 保存并展示热图
plt.savefig('Contacts_heatmap.png')
plt.show()

完整代码

import pandas as pd  
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

# 设置全局字体为Arial
mpl.rcParams['font.family'] = 'Arial'
mpl.rcParams['font.weight'] = 'bold'

# 读取Excel文件
file_path = 'Contacts.xlsx' # 替换为你的文件路径
sheet_name = 'Summary' # 请替换为你的工作表名称
df = pd.read_excel(file_path, sheet_name=sheet_name)

# 将"Time"列的数据乘以0.2并转换为整数
df['Frame'] = (df['Frame'] * 0.2).astype(int)

# 创建一个数据透视表,计算每个氨基酸在不同时间点出现的次数
pivot_table = df.pivot_table(index='Amino_Acid', columns='Frame', aggfunc='size', fill_value=0)

# 创建自定义的颜色映射
colors = ['white', '#000080']
cmap = LinearSegmentedColormap.from_list('custom_cmap', colors, N=256)

# 绘制热图
plt.figure(figsize=(10, 8))
heatmap = sns.heatmap(pivot_table, cmap=cmap, annot=False, fmt='d')

# 设置热图坐标轴标签
plt.xlabel('Time (ns)', fontsize=14, labelpad=5, fontweight='bold')
# 去掉Y轴标签
plt.ylabel('')

# 设置横坐标刻度为整数,并设置特定的刻度标签
ax = plt.gca()
ax.set_xticks([0, 25, 50, 75, 100, 125, 150, 175, 200])
ax.set_xticklabels([0, 25, 50, 75, 100, 125, 150, 175, 200])
plt.xticks(rotation=0)

# 显示坐标轴四边的边框
for spine in ax.spines.values():
spine.set_visible(True)

# 调整颜色条的宽度并添加边框
cbar = heatmap.collections[0].colorbar
cbar.ax.tick_params(labelsize=10, width=1)
cbar.outline.set_linewidth(1)
cbar.set_label('# of contacts', fontsize=12, fontweight='bold')

# 调整布局,使图像不重叠
plt.tight_layout()

# 保存热图
plt.savefig('Contacts_heatmap.png')

# 显示热图
plt.show()

下面看一下绘制热图的效果:

应用场景

这种热图可以帮助我们分析分子动力学模拟中氨基酸接触频率的变化。具体来说,在研究蛋白质折叠药物与靶点结合大分子相互作用时,这类图表非常有用。对于科研人员来说,尤其是在处理大量分子动力学数据时,这种可视化方式可以大大提高数据分析的效率。

结语

希望这篇文章能帮助大家了解如何用Python和Desmond分子动力学数据生成氨基酸接触热图。如果你有相关的研究需求,不妨试试这个方法!

如果觉得内容有用,记得分享给有需要的小伙伴哦!😊

如果您喜欢我们的文章,欢迎关注



叮当学术
📚零零碎碎的科研学习记录~🔬科研本沉闷,但跑起来有风。
 最新文章