いろいろ倉庫

KNIME、EXCEL、R、Pythonなどの備忘録

【Python】化合物情報をプロットして、カーソルを乗せると構造がホバーするようにしたい

・お題:化合物のいろいろな特徴をプロットしたグラフを作成したが、構造が見づらいので、マウスオンで構造がホバーするようにしたい。

 

・とりあえず、データセットを落とす。今回は、ChEMBLからデータセットを拝借した。

www.ebi.ac.uk

・Assayから適当な実験を選び、データをcsvでダウンロードした。

・次に、データを読み込んだ。構造情報はSMILESで入っているらしい。MWとAlogPなども入っている。活性情報はStandard Valueに入っているらしい(単位や等号はいったん置いておく)。

import pandas as pd
df = pd.read_csv("20221115.csv",sep=";")

df

・次に、Smilesを構造情報として読み込み、molsに格納。

from rdkit import Chem
mols = [Chem.MolFromSmiles(Smile) for Smile in df["Smiles"]]

・次に、構造情報を画像にしてリスト化。

from rdkit.Chem import Draw
ims=[Draw.MolToImage(mol) for mol in mols]
・あとは以前の記事と同様に、図示する。

import matplotlib.pyplot as plt
%matplotlib widget
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
fig, ax = plt.subplots()
imagebox = OffsetImage(ims[0], zoom=0.3)
imagebox.image.axes = ax

annot = AnnotationBbox(imagebox,
                       xy=(0,0),
                       xybox=(60,-60),
                       xycoords="data",
                       boxcoords="offset points",
                       pad=0.5,
                       arrowprops=dict( arrowstyle="->"))
annot.set_visible(False)
ax.add_artist(annot)
    
x = df["Molecular Weight"]#x軸は分子量。
y = df["Standard Value"]#y軸は活性値。
colors=df["AlogP"]#色はAlogP。
sc = plt.scatter(x, y,c=colors,alpha=0.5)

def update_annot(ind):
    i = ind["ind"][0]
    pos = sc.get_offsets()[i]
    annot.xy = (pos[0], pos[1])
    imagebox.set_data(ims[i])

def hover(event):
    vis = annot.get_visible()
    if event.inaxes == ax:
        cont, ind = sc.contains(event)
        if cont:
            update_annot(ind)
            annot.set_visible(True)
            fig.canvas.draw_idle()
        else:
            if vis:
                annot.set_visible(False)
                fig.canvas.draw_idle()

fig.canvas.mpl_connect("motion_notify_event", hover)

ax.set_xlabel("Mw")
ax.set_ylabel("Activity")
plt.yscale('log')#y軸は対数軸にした。

fig.colorbar(sc, ax=ax)#カラーバーを付けた。

plt.show()

・カーソルをプロットに乗せると、構造が出てくる。

 

おわり。