110

PyMOL 可视化:药物设计图怎么画得清楚

PyMOL 是药物设计可视化的事实标准。这篇给出可复现的作图脚本与让图变清楚的实用技巧。

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 以上,否则论文中会显得粗糙。

延伸资源