Este script utiliza RDKit para generar imágenes de una molécula, resaltando diferentes familias de características químicas. Las imágenes se muestran en una cuadrícula, y cada imagen resalta los átomos correspondientes a una familia específica.
Pasos del script:
Cargar la definición de características químicas.
Crear una molécula a partir de una cadena SMILES.
Obtener las características de la molécula.
Crear imágenes por cada familia de características.
Mostrar las imágenes en una cuadrícula con un subtítulo.
from rdkit import Chemfrom rdkit.Chem import Drawfrom rdkit.Chem import ChemicalFeaturesfrom rdkit import RDConfigimport osimport numpy as npimport matplotlib.pyplot as plt# Cargar la definición de característicasfdefName = os.path.join(RDConfig.RDDataDir, 'BaseFeatures.fdef')factory = ChemicalFeatures.BuildFeatureFactory(fdefName)def plot_features(smile, name): m = Chem.MolFromSmiles(smile) feats = factory.GetFeaturesForMol(m) feature_colors = {} legend = {}for feat in feats: family = feat.GetFamily()if family notin feature_colors: color =tuple(np.random.rand(3,)) feature_colors[family] = color legend[family] = color images = [] titles = []for family, color in feature_colors.items(): atom_colors = {}for feat in feats:if feat.GetFamily() == family: atom_ids = feat.GetAtomIds()for atom_id in atom_ids: atom_colors[atom_id] = color img = Draw.MolToImage(m, size=(600, 600), kekulize=True, highlightAtoms=list(atom_colors.keys()), highlightAtomColors={k: tuple(v) for k, v in atom_colors.items()}) images.append(img) titles.append(family) num_images =len(images) cols =3 rows = (num_images + cols -1) // cols fig, axes = plt.subplots(rows, cols, figsize=(12, 3* rows)) fig.suptitle(name, fontsize=16) axes = axes.flatten()for i, (img, title) inenumerate(zip(images, titles)): axes[i].imshow(img) axes[i].set_title(f'Familia: {title}') axes[i].axis('off')for i inrange(num_images, len(axes)): axes[i].axis('off') plt.tight_layout() plt.show()
/home/justo/.local/lib/python3.10/site-packages/matplotlib/projections/__init__.py:63: UserWarning: Unable to import Axes3D. This may be due to multiple versions of Matplotlib being installed (e.g. as a system package and as a pip package). As a result, the 3D projection is not available.
warnings.warn("Unable to import Axes3D. This may be due to multiple versions of "