はじめに
最近、RDKitを使用し始めました。
その中でDraw.MolsToGridImage
で作成したイメージの保存したいと思うことがありました。
イメージの保存は以下のようにできるとありました。
img.save('sample.svg')
しかし、私の場合は以下のようなエラーが出てうまく保存できませんでした。
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-35-a3256ff69e93> in <module>
----> 1 img.save('sample.svg')
AttributeError: 'SVG' object has no attribute 'save'
イメージの保存の仕方がわかったので共有します。
本文
環境
Dockerで作成したJupyterLab上で実行しています。
- macOS Monterey 12.2.1
- Docker version 20.10.12
- Python 3.9.5
- rdkit-pypi 2021.9.4
RDKitのimport
from rdkit import Chem
from rdkit.Chem import Draw
サンプルデータの作成
smiles_dict = {
'benezene': 'c1ccccc1',
'pentacene': 'c1ccc2cc3cc4cc5ccccc5cc4cc3cc2c1',
'BTBT': 'S1c2ccccc2C2=C1c1ccccc1S2',
'TMTES-pentacene': 'CC[Si](CC)(CC)C#Cc1c2cc3c(C)ccc(C)c3cc2c(C#C[Si](CC)(CC)CC)c2cc3c(C)ccc(C)c3cc12',
}
smilesをrdkit.Chem.rdchem.Molオブジェクトに変換
moles_dict = {}
for name, smiles in smiles_dict.items():
moles_dict[name] = Chem.MolFromSmiles(smiles)
Imageの保存
今回の問題の解決方法はwith open()
を使うということです。
SVGとして保存する場合は、データはstr
である必要があります。
また、PNGとして保存する場合は、bytes
である必要があるようです。
どちらの場合もimg.data
でその形式のデータを取得できます。
type(img.data)
# SVGの場合の出力
str
# PNGの場合の出力
bytes
SVGとして保存
SVGとして保存する場合はDraw.MolsToGridImage()
の引数にuseSVG=True
を指定してください。
img = Draw.MolsToGridImage(moles_dict.values(), molsPerRow=2, subImgSize=(400, 400), legends=moles_dict.keys(), useSVG=True)
with open('sample.svg', mode='w') as f:
f.write(img.data)
PNGとして保存
img = Draw.MolsToGridImage(moles_dict.values(), molsPerRow=2, subImgSize=(400, 400), legends=moles_dict.keys())
with open('sample.png', mode='wb') as f:
f.write(img.data)
実行結果(sample.png)
おわりに
今回はDraw.MolsToGridImage()
で作成したイメージを保存する方法を紹介しました。
間違い等がありましたら、ご連絡いただけますと幸いです。
参考
RDKit
RDKit日本語ドキュメント
"How to save "IPython.core.display.SVG" as PNG file?" -- Stack Overflow