gpt4 book ai didi

python - 将 matplotlib 图像插入 Pandas 数据框中

转载 作者:太空狗 更新时间:2023-10-30 02:38:25 28 4
gpt4 key购买 nike

目的:我目前正在使用 rdkit 根据 rdkit.Chem.Draw.SimilarityMaps 为我的分子结构着色。现在,我想使用 matplotlib 图像 SimilarityMaps 函数将它们引入 pandas 数据框中,并以 html 文件的形式导出此表。

代码:我试着用下面的代码做到这一点

import pandas as pd
from rdkit import Chem
from rdkit.Chem import Draw
from rdkit.Chem.Draw import SimilarityMaps
from rdkit.Chem.Draw import IPythonConsole #Needed to show molecules
from rdkit.Chem.Draw.MolDrawing import MolDrawing, DrawingOptions

df = pd.DataFrame({'smiles':['Nc1nc(NC2CC2)c3ncn([C@@H]4C[C@H](CO)C=C4)c3n1','CCCC(=O)Nc1ccc(OCC(O)CNC(C)C)c(c1)C(C)=O','CCN(CC)CCNC(=O)C1=CC=C(C=C1)NC(=O)C','CC(=O)NC1=CC=C(C=C1)O','CC(=O)Nc1sc(nn1)[S](N)(=O)=O']})

def getSim(smi):
mol = Chem.MolFromSmiles(smi)
refmol = Chem.MolFromSmiles('c1ccccc1')
fp = SimilarityMaps.GetMorganFingerprint(mol, fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(refmol, mol, SimilarityMaps.GetMorganFingerprint)
return fig

df['map'] = df['smiles'].map(getSim)
df.to_html('/.../test.html')

当我打开文件 test.html 时, map 列包含信息“Figure (200x200)”。我检查我的数据框映射列是否包含对象:在 python 中可以,但在 html 文件中不行。

问题:我不确定如何获取带有图像的数据框,我希望得到社区的帮助来澄清这个问题。

提前致谢

最佳答案

您看到的是 Figure (200x200)__repr__ matplotlib Figure 类的字符串。它是该 python 对象的文本表示(与执行 print(fig) 时看到的相同)。

你想要的是在表格中有一个实际的图像。一个简单的选择是将 matplotlib 图保存为 png 图像,创建一个 html 标签,<img src="some.png" />并因此显示表格。

import pandas as pd
import numpy as np;np.random.seed(1)
import matplotlib.pyplot as plt
import matplotlib.colors

df = pd.DataFrame({"info" : np.random.randint(0,10,10),
"status" : np.random.randint(0,3,10)})

cmap = matplotlib.colors.ListedColormap(["crimson","orange","limegreen"])

def createFigure(i):
fig, ax = plt.subplots(figsize=(.4,.4))
fig.subplots_adjust(0,0,1,1)
ax.axis("off")
ax.axis([0,1,0,1])
c = plt.Circle((.5,.5), .4, color=cmap(i))
ax.add_patch(c)
ax.text(.5,.5, str(i), ha="center", va="center")
return fig

def mapping(i):
fig = createFigure(i)
fname = "data/map_{}.png".format(i)
fig.savefig(fname)
imgstr = '<img src="{}" /> '.format(fname)
return imgstr


df['image'] = df['status'].map(mapping)
df.to_html('test.html', escape=False)

enter image description here

这样做的缺点是你有很多图像保存在磁盘上的某个地方。如果不需要,您可以将编码为 base64 的图像存储在 html 文件中,<img src="data:image/png;base64,iVBORw0KGgoAAAAN..." /> .

import pandas as pd
import numpy as np;np.random.seed(1)
import matplotlib.pyplot as plt
import matplotlib.colors
from io import BytesIO
import base64

df = pd.DataFrame({"info" : np.random.randint(0,10,10),
"status" : np.random.randint(0,3,10)})

cmap = matplotlib.colors.ListedColormap(["crimson","orange","limegreen"])

def createFigure(i):
fig, ax = plt.subplots(figsize=(.4,.4))
fig.subplots_adjust(0,0,1,1)
ax.axis("off")
ax.axis([0,1,0,1])
c = plt.Circle((.5,.5), .4, color=cmap(i))
ax.add_patch(c)
ax.text(.5,.5, str(i), ha="center", va="center")
return fig

def fig2inlinehtml(fig,i):
figfile = BytesIO()
fig.savefig(figfile, format='png')
figfile.seek(0)
# for python 2.7:
#figdata_png = base64.b64encode(figfile.getvalue())
# for python 3.x:
figdata_png = base64.b64encode(figfile.getvalue()).decode()
imgstr = '<img src="data:image/png;base64,{}" />'.format(figdata_png)
return imgstr

def mapping(i):
fig = createFigure(i)
return fig2inlinehtml(fig,i)


with pd.option_context('display.max_colwidth', -1):
df.to_html('test.html', escape=False, formatters=dict(status=mapping))

输出看起来一样,但没有图像保存到磁盘。

这在 Jupyter Notebook 中也能很好地工作,只需稍作修改,

from IPython.display import HTML
# ...
pd.set_option('display.max_colwidth', -1)
HTML(df.to_html(escape=False, formatters=dict(status=mapping)))

enter image description here

关于python - 将 matplotlib 图像插入 Pandas 数据框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47038538/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com