・お題:化合物のいろいろな特徴をプロットしたグラフを作成したが、構造が見づらいので、マウスオンで構造がホバーするようにしたい。
・とりあえず、データセットを落とす。今回は、ChEMBLからデータセットを拝借した。
・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()
・カーソルをプロットに乗せると、構造が出てくる。
おわり。