如何在Python中使用RDKit的MolsToGridImage修改高亮颜色?
RDKit修改MCS分子差异高亮颜色问题
cheminformatics工具RDKit的Cookbook中有通过fMCS映射分子相似性、标记非共享残基以高亮两个分子差异的示例。我需要修改高亮颜色,但尝试多种方法均未成功:
无效方法1:修改IPythonConsole.drawOptions
执行以下代码后,图片仍使用默认高亮颜色,无任何效果:
from rdkit import Chem from rdkit.Chem import Draw from rdkit.Chem.Draw import rdMolDraw2D from rdkit.Chem.Draw import IPythonConsole from rdkit.Chem import rdFMCS from rdkit.Chem.Draw import rdDepictor rdDepictor.SetPreferCoordGen(True) IPythonConsole.drawOptions.minFontSize=20 IPythonConsole.drawOptions.setHighlightColour=(0,1,0) from collections import defaultdict
无效方法2:尝试修改MolsToGridImage的drawOptions
以下代码抛出AttributeError错误:
d2g = Draw.MolsToGridImage([mol1, mol2]) opts = d2g.drawOptions() opts.setHighlightColour = (0,1,0) d2g([mol1, mol2],highlightAtomLists=[target_atm1, target_atm2])
错误信息:
AttributeError: 'Image' object has no attribute 'drawOptions'
当前可行但存在缺陷的方案
我找到一个能修改高亮颜色的方案,但有两个明显问题:1. 无法输出SVG格式;2. 分子大小不同或SMILES配置变化时,分子排列不如MolsToGridImage规整,无法生成符合科学出版级别的图片。代码如下:
from rdkit import Chem from rdkit.Chem import Draw from rdkit.Chem.Draw import rdMolDraw2D from rdkit.Chem.Draw import IPythonConsole from rdkit.Chem import rdFMCS from rdkit.Chem.Draw import rdDepictor rdDepictor.SetPreferCoordGen(True) IPythonConsole.drawOptions.minFontSize=20 from collections import defaultdict mol1 = Chem.MolFromSmiles('FC1=CC=C2C(=C1)C=NN2') mol2 = Chem.MolFromSmiles('CCC1=C2NN=CC2=CC(Cl)=C1') from PIL import Image from io import BytesIO def show_mol(d2d,mol,legend='',highlightAtoms=[]): d2d.DrawMolecule(mol,legend=legend, highlightAtoms=highlightAtoms) d2d.FinishDrawing() bio = BytesIO(d2d.GetDrawingText()) return Image.open(bio) def show_images(imgs,buffer=5): height = 0 width = 0 for img in imgs: height = max(height,img.height) width += img.width width += buffer*(len(imgs)-1) res = Image.new("RGBA",(width,height)) x = 0 for img in imgs: res.paste(img,(x,0)) x += img.width + buffer return res mcs = rdFMCS.FindMCS([mol1,mol2]) mcs_mol = Chem.MolFromSmarts(mcs.smartsString) match1 = mol1.GetSubstructMatch(mcs_mol) target_atm1 = [] for atom in mol1.GetAtoms(): if atom.GetIdx() not in match1: target_atm1.append(atom.GetIdx()) match2 = mol2.GetSubstructMatch(mcs_mol) target_atm2 = [] for atom in mol2.GetAtoms(): if atom.GetIdx() not in match2: target_atm2.append(atom.GetIdx()) img1 = [] d2dx = Draw.MolDraw2DCairo(350,300) doptsx = d2dx.drawOptions() doptsx.setHighlightColour((1,0.84,0,.5)) img1.append(show_mol(d2dx,mol1,highlightAtoms=target_atm1)) d2dx = Draw.MolDraw2DCairo(350,300) doptsx = d2dx.drawOptions() doptsx.setHighlightColour((1,0.84,0,.5)) img1.append(show_mol(d2dx,mol2, highlightAtoms=target_atm2)) pic = show_images(img1) pic.save('hallo.png') pic
环境信息
Python 3.8.18 (default, Sep 11 2023, 13:39:12) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
内容的提问来源于stack exchange,提问作者fuchsdeluxe
相关产品推荐
相关产品推荐

