如何使用MDAnalysis绘制带颜色梯度的Ramachandran概率密度图
如何使用MDAnalysis绘制带颜色梯度的Ramachandran概率密度图
我完全懂你的困扰——满屏同色同大小的点堆在一起,根本没法分辨哪些构象是模拟里更常出现的对吧?别担心,我们可以把原来的散点图改成密度热图,用颜色梯度来表示构象出现的频率,这样就能清晰看到高频区域啦!
第一步:提取Ramachandran数据
你已经用MDAnalysis生成了Ramachandran分析结果R,接下来我们需要把所有帧、所有残基的phi和psi角提取出来,整理成适合绘图的一维数组:
# 提取所有phi角(第一列)和psi角(第二列),展平多维数组 phi = R.results.angles[..., 0].flatten() psi = R.results.angles[..., 1].flatten()
第二步:绘制密度热图(三种方案任选)
下面给你三种常用的密度绘图方式,你可以根据自己的需求选择:
方案1:直方图式密度图(hist2d)
用hist2d统计每个网格内的点数量,颜色深浅代表频率,适合需要精确数值统计的场景:
import matplotlib.pyplot as plt import matplotlib.colors as colors fig, ax = plt.subplots(figsize=plt.figaspect(1)) # 绘制2D直方图,用对数归一化让低频区域也清晰显示 hist = ax.hist2d(phi, psi, bins=100, cmap='viridis', norm=colors.LogNorm()) # 添加颜色条,标注频率 fig.colorbar(hist[3], ax=ax, label='出现频率') # 设置坐标轴标签和范围(符合Ramachandran图标准) ax.set_xlabel('Phi (°)') ax.set_ylabel('Psi (°)') ax.set_title('Ramachandran密度图(直方图式)') ax.set_xlim(-180, 180) ax.set_ylim(-180, 180) plt.show()
方案2:六边形密度图(hexbin)
用六边形网格统计密度,视觉效果更柔和,比hist2d更美观:
import matplotlib.pyplot as plt import matplotlib.colors as colors fig, ax = plt.subplots(figsize=plt.figaspect(1)) # 绘制六边形密度图 hexbin = ax.hexbin(phi, psi, gridsize=100, cmap='viridis', norm=colors.LogNorm()) # 添加颜色条 fig.colorbar(hexbin, ax=ax, label='出现频率') ax.set_xlabel('Phi (°)') ax.set_ylabel('Psi (°)') ax.set_title('Ramachandran密度图(六边形网格)') ax.set_xlim(-180, 180) ax.set_ylim(-180, 180) plt.show()
方案3:核密度估计图(KDE)
用核密度算法平滑密度分布,适合需要展示构象分布趋势的场景,需要先安装seaborn库:
import matplotlib.pyplot as plt import seaborn as sns fig, ax = plt.subplots(figsize=plt.figaspect(1)) # 绘制填充式KDE密度图,levels控制等高线数量 sns.kdeplot(x=phi, y=psi, fill=True, cmap='viridis', ax=ax, levels=10) # 可选:叠加低透明度散点图,保留原始数据痕迹 # sns.scatterplot(x=phi, y=psi, color='white', marker='.', alpha=0.1, ax=ax) ax.set_xlabel('Phi (°)') ax.set_ylabel('Psi (°)') ax.set_title('Ramachandran密度图(KDE平滑)') ax.set_xlim(-180, 180) ax.set_ylim(-180, 180) plt.show()
小提示
- 颜色映射(
cmap)可以换成你喜欢的,比如plasma、inferno、magma都是不错的选择; LogNorm对数归一化能避免高频区域颜色过亮,让低频区域的细节也能展现出来,如果不需要可以去掉;- 调整
bins(hist2d)或gridsize(hexbin)的数值,可以控制密度图的精细程度。
备注:内容来源于stack exchange,提问作者Fernando Oliveir Tytor
相关产品推荐
相关产品推荐

