0

使用 RDKit 绘制结构时,原子标签字体大小和环大小没有很好的比例。标签太小或太大或未对齐。

不幸的是,有关这方面的文档很少。我发现了这个: https ://rdkit.org/docs/source/rdkit.Chem.Draw.MolDrawing.html 但我不知道这是否相关以及我将如何将它们放在一起。我缺少简单实用的代码示例。

我也尝试过Draw.MolToQPixmap,但是我经历了原子标签未对齐的情况,到目前为止,我了解到原因是难以使这个跨平台保持一致并且Draw.MolToPixmap使用旧的绘图代码。我应该使用 egDraw.MolToImage代替。但是有类似Draw.MolToFile的字体大小简直太小了。我不确定这是否也是一个跨平台问题(我在 Win10 上)。因此,解决方案是简单地设置字体大小,但是如何设置呢?

我知道有一个 RDKit 邮件列表,到目前为止我已经问过这个问题而没有答案。在 SO 上,可能有更广泛的受众,我可以附上图片进行说明。

代码:

from rdkit import Chem
from rdkit.Chem import Draw

smiles = ' FC1OC2N3C4[Si]5=C6B7C(C=CC6=CC4=CC2=CC1)C=CC=C7C=C5C=C3'
mol = Chem.MolFromSmiles(smiles)
img = Draw.MolToFile(mol,"Test.png",size=(300,150))

结果:(使用Draw.MolToFile,对齐没问题,但原子标签太小)

在此处输入图像描述

结果:(对于小图片,使用Draw.MolToQPixmap、未对齐和/或字体太大)

在此处输入图像描述

在此处输入图像描述

编辑:(在@Oliver Scott 的建议下)

我用相同的字体大小得到了 3 倍的相同输出。我一定是某个地方的愚蠢错误或误解。

代码:

from rdkit.Chem.Draw import rdMolDraw2D
from rdkit import Chem

smiles = 'FC1OC2N3C4[Si]5=C6B7C(C=CC6=CC4=CC2=CC1)C=CC=C7C=C5C=C3'
mol = Chem.MolFromSmiles(smiles)
    
def drawMyMol(fname, myFontSize):
    d = rdMolDraw2D.MolDraw2DCairo(350, 300)
    d.SetFontSize(myFontSize)
    print(d.FontSize())
    d.DrawMolecule(mol)
    d.FinishDrawing()
    d.WriteDrawingText(fname)
    
drawMyMol("Test1.png", 6)
drawMyMol("Test2.png", 12)
drawMyMol("Test3.png", 24)

结果:

6.0
12.0
24.0

在此处输入图像描述

4

3 回答 3

2

较新的 RDKit 绘图代码比这些旧函数更灵活。尝试使用rdMolDraw2D绘图代码。您可以如下设置绘图选项。该文档有一个可用选项的列表:

from rdkit.Chem.Draw import rdMolDraw2D
from rdkit import Chem

smiles = 'FC1OC2N3C4[Si]5=C6B7C(C=CC6=CC4=CC2=CC1)C=CC=C7C=C5C=C3'
mol = Chem.MolFromSmiles(smiles)

# Do the drawing.
d = rdMolDraw2D.MolDraw2DCairo(350, 300)
d.drawOptions().minFontSize = 22
d.DrawMolecule(mol)
d.FinishDrawing()
d.WriteDrawingText('test.png') 

默认最小字体大小为 12,最大为 40。

结果:

RDKit分子PNG

要进入 PIL 图像,您可以这样做:

from PIL import Image
import io

# Change the last line of the above to get a byte string.
png = d.GetDrawingText() 

# Now read into PIL.
img = Image.open(io.BytesIO(png))

# Now you can do whatever you need to do with the PIL image.
于 2020-11-13T10:34:19.543 回答
1

您可以使用SetPreferCoordGenCompute2DCoords

from rdkit import Chem
from rdkit.Chem import Draw
from rdkit.Chem import rdDepictor
rdDepictor.SetPreferCoordGen(True)

smiles = 'FC1OC2N3C4[Si]5=C6B7C(C=CC6=CC4=CC2=CC1)C=CC=C7C=C5C=C3'
mol = Chem.MolFromSmiles(smiles)
rdDepictor.Compute2DCoords(mol)
PILmol = Draw.MolToImage(mol, size=(300,150))

你得到这个 PIL 图像

图像

在 2020.09 工作,但我没有在 2020.03 测试它。

于 2020-11-13T16:54:54.160 回答
0

感谢@Oliver Scott 的帮助,我终于得到了我想要的东西:显然,字体大小是相对的(默认为 0.5),而不是绝对的点数,至少在我正在使用的 RDKit 2020.03 中是这样。也许这在 RDKit 2020.09 中发生了变化?

代码:(获取PNG文件)

from rdkit.Chem.Draw import rdMolDraw2D
from rdkit import Chem

smiles = 'FC1OC2N3C4[Si]5=C6B7C(C=CC6=CC4=CC2=CC1)C=CC=C7C=C5C=C3'
mol = Chem.MolFromSmiles(smiles)

def myMolToPNG(fname, myFontSize):
    d = rdMolDraw2D.MolDraw2DCairo(350, 300)
    d.SetFontSize(myFontSize)
    d.DrawMolecule(mol)
    d.FinishDrawing()
    d.WriteDrawingText(fname)

myMolToPNG("Test1.png", 0.5)
myMolToPNG("Test2.png", 1.0)
myMolToPNG("Test3.png", 1.5)

结果:

在此处输入图像描述

代码:(获取 QPixmap,例如 PyQt QTableWidget)

from rdkit.Chem.Draw import rdMolDraw2D
from rdkit import Chem
from PyQt5.QtGui import QPixmap

smiles = 'FC1OC2N3C4[Si]5=C6B7C(C=CC6=CC4=CC2=CC1)C=CC=C7C=C5C=C3'
mol = Chem.MolFromSmiles(smiles)

def myMolToQPixmap(myFontSize):
    d = rdMolDraw2D.MolDraw2DCairo(350, 300)
    d.SetFontSize(myFontSize)
    d.DrawMolecule(mol)
    d.FinishDrawing()
    png = d.GetDrawingText()
    pixmap = QPixmap()
    pixmap.loadFromData(png)
    return pixmap
于 2020-11-13T14:47:25.743 回答