分子可视化¶
from rdkit import Chem
from rdkit.Chem import Draw
绘制单个分子¶
Draw.MolToImage(mol, parameters)
用于绘制分子的图片,可选参数包括:
kekulize=True
:是否以凯库勒式表示芳香体系size=(300, 300)
:用像素表示的图片大小wedgeBonds=True
:是否用楔形键表示分子highlightAtoms=[]
:需要高亮表示的原子highlightBonds=[]
:需要高亮表示的化学键highlightColor=[1, 0, 0]
:用 RGB 设定高亮颜色
mols = Chem.SDMolSupplier("./mols.sdf")
Draw.MolToImage(mols[0], size=(450, 150))
Draw.MolToImage(mols[0], kekulize=False, size=(450, 150),
highlightAtoms=[2], highlightBonds=[0])
Draw.MolToFile(mol, filename, parameters)
具有与之相似的参数,不过 Draw.MolToFile()
用于将分子导出为图片文件。
绘制多个分子¶
Draw.MolsToGridImage(mols, parameters)
用于同时展示多个分子,其参数如下:
molsPerRow=3
:每行分子数目subImgSize=(200, 200)
:每个子图的大小legends=None
:分子的标签,应为列表highlightAtomLists=None
:高亮的原子highlightBondLists=None
:高亮的化学键useSVG=False
:是否转化为 svg 矢量图returnPNG=False
:是否返回 png 图片
Draw.MolsToGridImage(mols, molsPerRow=3, returnPNG=True,
legends=[mol.GetProp("_Name") for mol in mols])
所有图片都可以通过 img.save(filename)
的方式来保存。
img = Draw.MolToImage(mols[0], size=(200, 200))
img.save("./save_demo.png")
rdMolDraw2D 模块¶
Draw.rdMolDraw2D
模块提供了更加复杂但功能也更加强大的分子绘制方式。使用Draw.rdMolDraw2D
模块绘制分子的步骤可以分为四步,首先需要创建画布,MolDraw2DSVG()
用于创建 svg 图片,MolDraw2DCairo()
用于创建 png 图片,然后使用 PrepareAndDrawMolecule()
在画布上绘图,接着使用 FinishDrawing()
结束绘图,最后输出结果。
- 创建画布:
MolDraw2DSVG()
/MolDraw2DCairo()
- 绘制分子:
PrepareAndDrawMolecule()
- 结束绘制:
FinishDrawing()
- 输出图片:
WriteDrawingText()
绘制单个分子¶
from rdkit.Chem.Draw import rdMolDraw2D
from IPython.display import Image
d = rdMolDraw2D.MolDraw2DCairo(450, 150)
rdMolDraw2D.PrepareAndDrawMolecule(d, mols[2])
d.FinishDrawing()
d.WriteDrawingText("./rdMolDraw2D_output_1.png")
Image(filename = "./rdMolDraw2D_output_1.png")
MolDraw2DSVG(width, height)
/ MolDraw2DCairo(width, height)
接受的参数决定了图片的大小。
在分子上添加标记¶
PrepareAndDrawMolecule(drawer, mol, parameters)
也可以接受与 MolToImage()
类似的参数:
legend=''
:分子的标签highlightAtoms
:略highlightBonds
:略highlightAtomColors
:略highlightBondColors
:略highlightAtomRadii
:指定原子高亮的半径confId = -1
:存储分子构象的 Conformer() 类 idkekulize=True
:略
d = rdMolDraw2D.MolDraw2DCairo(450, 150)
rdMolDraw2D.PrepareAndDrawMolecule(d, mols[2], legend='Furan', highlightAtoms=[0, 4],
highlightBonds=[3], highlightAtomRadii={0:0.15, 4:0.35})
d.FinishDrawing()
d.WriteDrawingText("./rdMolDraw2D_output_2.png")
Image(filename = "./rdMolDraw2D_output_2.png")
绘制多个分子¶
为了避免生成太多的图片文件,这里先额外介绍一下在 Jupyter Notebook 中使用 svg 绘制分子而不导出图片文件的方法。绘制分子步骤没有差异,但是在最后一步中不使用 WriteDrawingText()
导出文件,而使用 svg 画布特有的 GetDrawingText()
。GetDrawingText()
直接返回 svg 图片的二进制字符串,使用 IPython.display
中的 SVG
就能让图片直接显示在输出区了。
from IPython.display import SVG
mol = Chem.MolFromSmiles('[F][C@@H](Cl)NC/C=C/C')
d = rdMolDraw2D.MolDraw2DSVG(450, 150)
rdMolDraw2D.PrepareAndDrawMolecule(d, mol)
d.FinishDrawing()
SVG(d.GetDrawingText())
除使用 PrepareAndDrawMolecule()
绘制分子外,还可以使用 DrawMolecule(mol)
/ DrawMolecules(mol)
完成同样的功能,DrawMolecule()
用于绘制单个分子,DrawMolecules()
用于绘制多个分子。DrawMolecule(mol)
/ DrawMolecules(mol)
不需要传入画布参数,因为它们是画布的方法,它们具有与 PrepareAndDrawMolecule()
相同的其他参数。
从函数名称还可以看出,PrepareAndDrawMolecule()
合并了 Prepare 与 Draw 两个步骤,因此在使用 DrawMolecule()
/ DrawMolecules()
绘制分子前,还需要手动完成额外的 Prepare 步骤。
Prepare 步骤是将对分子的预设,例如是否为凯库勒式、是否显示楔形键,应用到分子上,如果没有相应的预设,自然也可以省略 Prepare 步骤。
d = rdMolDraw2D.MolDraw2DSVG(450, 150)
mol_prepare = rdMolDraw2D.PrepareMolForDrawing(mol)
d.DrawMolecule(mol_prepare)
d.FinishDrawing()
SVG(d.GetDrawingText())
MolDraw2DSVG()
/ MolDraw2DCairo()
除了接受 width
与 height
参数以外,还接受 panelWidth
与 panelHeigh
两个参数,这两个参数决定了子图的大小,若子图的尽寸过大,在画布中无法放置下多个分子,分子就会重叠在一起。
PrepareAndDrawMolecule()
d = rdMolDraw2D.MolDraw2DSVG(600, 150, 300, 150)
d.DrawMolecules([mol, mols[0]], legends=["a", "b"])
d.FinishDrawing()
SVG(d.GetDrawingText())
在分子上添加标记的进阶¶
原子的 atomLabel
特征决定了相应原子的符号,_displayLabel
特征决定了原子符号的显示样式,atomNote
特征用于在原子上添加字符标记,bondNote
用于在化学键上添加标记。
这些特征都支持输入并显示 html 标签 <sub>
与 <sup>
,也是通过这种方法来显示上下标。_displayLabelW
用于指定文字自右向左排列,主要用于例如 HOOC-Ar 的情况。atomLabel
与 _displayLabel
虽然具有相同的效果,但 atomLabel
本质上是指定了原子的标签,一般用于指定语义,而不是显示样式。
mol.GetAtomWithIdx(0).SetProp("_displayLabel","R<sub>1</sub>")
mol.GetAtomWithIdx(3).SetProp("atomLabel", "R<sub>2</sub>")
mol.GetAtomWithIdx(0).SetProp("atomNote", "F was replaced by R<sub>1</sub>")
mol.GetBondWithIdx(1).SetProp("bondNote", "C-Cl")
d = rdMolDraw2D.MolDraw2DSVG(450, 150)
d.DrawMolecule(mol)
d.FinishDrawing()
SVG(d.GetDrawingText())
对于分子样式的更多样式设置一般通过设置参数器 drawOptions()
实现,drawOptions()
具有非常多绘图选项,仅列出几个比较常用的选项:
addAtomIndices=False
:为原子添加索引标签addBondIndices=False
:为化学键添加索引标签addStereoAnnotation=False
:添加立体构型标签annotationFontScale=0.75
:原子和化学键标记相对于原子符号的大小atomLabelDeuteriumTritium
:将氘和氚分别用 D 和 T 表示baseFontSize=0.6
:字体的相对大小bondLineWidth=-1
:化学键粗细drawMolsSameScale=True
:是否使绘制的多个分子大小相同explicitMethyl=False
:是否显示末端甲基fixedBondLength=-1
:固定键长fixedFontSize=-1
固定字体大小:fixedScale=-1
:固定绘图窗口大小fontFile
:字体文件
mol = Chem.MolFromSmiles('[F][C@@H](Cl)NC/C=C/C')
d = rdMolDraw2D.MolDraw2DSVG(450, 150)
do = d.drawOptions()
do.addAtomIndices = True
do.addStereoAnnotation = True
do.explicitMethyl = True
do.annotationFontScale = 0.8
do.bondLineWidth = 3
d.DrawMolecule(mol)
d.FinishDrawing()
SVG(d.GetDrawingText())