PyMOL 是结构生物学与药物设计中最常用的可视化工具。真正的关键不是它能画什么,而是如何画得让人一眼看懂——一张好的结合模式图,应该在三秒内传达出「配体如何与蛋白作用」。
安装与两个版本
# 开源版(免费,功能足够)
conda install -c conda-forge pymol-open-source
# 或 pip(部分平台)
pip install pymol-open-source
# 商业版(Schrödinger 维护)需要许可证
# 多了:更好的光线追踪、部分插件、技术支持
# → 学术用途开源版完全够用
# 命令行运行脚本(批量出图的正确方式)
pymol -cq script.pml # -c 无界面,-q 静默
pymol -cq script.py # 也可以跑 Python 脚本
可复现的结合模式作图脚本
# save as: binding_site.pml
# 运行: pymol -cq binding_site.pml
load complex.pdb, cplx
# ---- 基础设置 ----
bg_color white
set ray_opaque_background, 1
hide everything
set cartoon_transparency, 0.6
set surface_quality, 1
set antialias, 2
# ---- 选择 ----
select lig, cplx and resn LIG
select prot, cplx and polymer
select pocket, byres (prot within 5 of lig)
select waters, cplx and resn HOH within 4 of lig
# ---- 显示 ----
show cartoon, prot
color grey80, prot
show sticks, lig
color yellow, lig and elem C
util.cnc("lig") # 按元素上色(C 保持黄色)
set stick_radius, 0.18, lig
show sticks, pocket and not (name C+N+O) # 只显示侧链
color cyan, pocket and elem C
set stick_radius, 0.12, pocket
show spheres, waters
set sphere_scale, 0.25, waters
color red, waters
# ---- 氢键(关键:只画配体相关的)----
distance hbonds, lig, prot, 3.5, mode=2
color black, hbonds
set dash_width, 2.5
set dash_gap, 0.4
set dash_radius, 0.05
hide labels, hbonds # 标签常常太乱,需要时再开
# ---- 标注关键残基 ----
label pocket and name CA, "%s%s" % (resn, resi)
set label_size, 16
set label_color, black
set label_position, (0, 1.5, 0)
# ---- 视角 ----
orient lig
zoom lig, 4
turn x, -15
# ---- 输出 ----
set ray_trace_mode, 0
png binding_site.png, width=2400, height=1800, dpi=300, ray=1
# 同时保存会话,便于后续调整
save binding_site.pse
让图变清楚的关键技巧
- 做减法而非加法。这是最重要的原则。大多数难看的分子图是因为显示了太多东西。只显示与要传达的信息相关的部分——通常是配体 + 5 Å 内的残基侧链 + 关键氢键;
- 用透明度制造层次:蛋白 cartoon 设 0.5~0.7 透明度做背景,配体不透明作为焦点;
- 配色要有主次:配体用醒目颜色(黄/绿的碳),蛋白用中性色(灰/淡青的碳)。避免用太多颜色;
- 白底 + 黑色虚线:适合放进论文和幻灯片,比黑底更通用;
- 只画有意义的氢键:
mode=2会自动只画极性接触;但仍可能太多,必要时手动指定具体的原子对; - 标签是最容易搞乱的元素:只标关键残基,用
set label_position避免重叠; - 输出分辨率要够:论文用 300 dpi 以上,
ray=1开光线追踪。
几种常用图的做法
# 1) 表面图:展示口袋形状(见 091)
show surface, prot
set transparency, 0.3
set surface_color, grey70, prot
# 只显示口袋附近的表面
set surface_carve_selection, lig
set surface_carve_cutoff, 6
# 2) 静电势着色(见 094)
# 需要先生成 APBS 电位图,或用简化的:
util.color_by_charge("prot")
# 3) 多个配体叠合比较(SAR 分析)
load lig1.sdf, l1
load lig2.sdf, l2
align l1, l2
color yellow, l1 and elem C
color magenta, l2 and elem C
# 4) MD 轨迹动画
load topology.pdb, traj
load_traj trajectory.dcd, traj
intra_fit traj and polymer and name CA
mset 1 -100
mplay
# 5) 突变体比较
load wt.pdb, wt
load mut.pdb, mut
align mut, wt
# 显示差异区域
select diff, mut within 8 of (mut and resi 790)
# 6) 批量出图(一批分子的对接姿势)
python
from pymol import cmd
import glob
cmd.load("receptor.pdb", "rec")
for f in sorted(glob.glob("poses/*.sdf")):
name = f.split("/")[-1][:-4]
cmd.load(f, "lig")
cmd.orient("lig")
cmd.zoom("lig", 4)
cmd.png(f"figs/{name}.png", width=1200, height=900, dpi=150, ray=1)
cmd.delete("lig")
python end
用脚本而非交互操作
| 交互操作 | 脚本 | |
|---|---|---|
| 可复现 | 否 | 是 |
| 批量 | 不可行 | 容易 |
| 版本管理 | 只能存 .pse | 纯文本可 diff |
| 风格一致 | 难保证 | 天然一致 |
| 修改成本 | 要重做 | 改一行重跑 |
建议:把常用的显示设置写成一个 style.pml,每次 @style.pml 载入。这样团队所有的图风格统一,且修改风格时只改一处。
常见问题
- 配体显示不出来:多半是残基名不对。用
print(cmd.get_chains())与iterate cplx, print(resn)检查; - 氢键画得太多太乱:
distance的默认判据宽松,收紧距离阈值或手动指定原子对; - 图片有锯齿:
set antialias, 2且必须ray=1; - ray 很慢:大体系可先关掉 surface,或降低
surface_quality; - 颜色在投影仪上看不清:避免用浅黄、浅灰这类低对比色做主体。
关键要点
- 做减法是画好分子图的第一原则——只显示传达信息所需的部分;
- 用脚本而非交互操作:可复现、可批量、风格统一、可版本管理;
- 用透明度制造层次:蛋白半透明做背景,配体不透明作焦点;
- 输出时
ray=1+ 300 dpi 以上,否则论文中会显得粗糙。
延伸资源
- PLIP 可视化:108《PLIP》;网页端方案:111《NGLView 与 3Dmol.js》;
- 口袋分析:091《蛋白口袋 Protein Pocket》;结构准备:105《PDBFixer》。