matplotlib画像をパンダのデータフレームに挿入します

B.ジーズ

目的:私は現在、rdkitを使用して、分子の構造をに応じて色付けしていrdkit.Chem.Draw.SimilarityMapsます。ここで、matplotlib imagesSimilarityMaps関数を使用して、それらを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と、マップ列に「図(200x200)」という情報が含まれています。データフレームマップ列にオブジェクトが含まれているかどうかを確認します。Pythonでは問題ありませんが、HTMLファイルでは問題ありません。

質問:画像付きのデータフレームを取得する方法がわかりません。コミュニティの助けを借りて、この主題を明確にしたいと思います。

前もって感謝します

ImportanceOfBeingErnest

表示されるのFigure (200x200)__repr__、matplotlibFigureクラスの文字列です。これは、その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)

ここに画像の説明を入力してください

これの欠点は、ディスクのどこかにたくさんの画像が保存されていることです。これが望ましくない場合は、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)))

ここに画像の説明を入力してください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

パンダ-MongoDBにデータフレームを挿入します

分類Dev

行の値に基づいてパンダのデータフレームに行を挿入しますか?

分類Dev

パンダ:インデックスを保持せずにデータフレームを他のデータフレームに挿入します

分類Dev

パンダはデータフレームに行の小計を挿入します

分類Dev

パンダのデータフレームにデータフレームを挿入する方法

分類Dev

sqlalchemyを使用してパンダデータフレームをmysqlに挿入します

分類Dev

日付列に基づいてパンダデータフレームに行を挿入します

分類Dev

文字列をコンマで分割し、パンダのデータフレームに挿入する方法

分類Dev

データフレームの列にランダムに1を挿入します

分類Dev

NAの値をパンダデータフレームにランダムに挿入する

分類Dev

パンダデータフレームに値を挿入

分類Dev

ランダムなデータ文字列を新しいデータフレーム列に挿入します

分類Dev

別のデータフレームの条件を使用して、パンダのデータフレームにデータを入力して生成します

分類Dev

不足している日付をパンダデータフレームのフラットファイルに挿入します

分類Dev

パンダのデータフレームセルにリストを挿入

分類Dev

パンダのデータフレームの別の列に基づく値でいくつかの新しい列を挿入します

分類Dev

空白行のパンダデータフレームを挿入する

分類Dev

Pythonのリストに変更せずに、パンダのデータフレームに行を挿入します

分類Dev

パンダ-手動でデータフレームを作成し、値を挿入します

分類Dev

パンダのデータフレームから5行を読み取り、別のパンダのデータフレームの1行に1つのセルに挿入します。

分類Dev

NAをデータフレームに比例してランダムに挿入します

分類Dev

Pythonパンダ:欠落している日付、時系列の行をgroupbyデータフレームに挿入します

分類Dev

予約フォームのヒント:カレンダー(データピッカー)を挿入し、タイムピッカー(?)を挿入します

分類Dev

空のパンダデータフレームにタプルを挿入する

分類Dev

1つ以上の列に基づいてパンダデータフレームに値を追加/挿入する

分類Dev

パンダのデータフレームに小計を挿入できません

分類Dev

MySQLの結果を既存のパンダデータフレームに挿入する

分類Dev

ソートされていないインデックスを持つ複数のパンダデータフレームから別のデータフレームの既存の列に値を挿入します

分類Dev

パンダ-「for」ループのデータフレームにrange(x)を入力します

Related 関連記事

  1. 1

    パンダ-MongoDBにデータフレームを挿入します

  2. 2

    行の値に基づいてパンダのデータフレームに行を挿入しますか?

  3. 3

    パンダ:インデックスを保持せずにデータフレームを他のデータフレームに挿入します

  4. 4

    パンダはデータフレームに行の小計を挿入します

  5. 5

    パンダのデータフレームにデータフレームを挿入する方法

  6. 6

    sqlalchemyを使用してパンダデータフレームをmysqlに挿入します

  7. 7

    日付列に基づいてパンダデータフレームに行を挿入します

  8. 8

    文字列をコンマで分割し、パンダのデータフレームに挿入する方法

  9. 9

    データフレームの列にランダムに1を挿入します

  10. 10

    NAの値をパンダデータフレームにランダムに挿入する

  11. 11

    パンダデータフレームに値を挿入

  12. 12

    ランダムなデータ文字列を新しいデータフレーム列に挿入します

  13. 13

    別のデータフレームの条件を使用して、パンダのデータフレームにデータを入力して生成します

  14. 14

    不足している日付をパンダデータフレームのフラットファイルに挿入します

  15. 15

    パンダのデータフレームセルにリストを挿入

  16. 16

    パンダのデータフレームの別の列に基づく値でいくつかの新しい列を挿入します

  17. 17

    空白行のパンダデータフレームを挿入する

  18. 18

    Pythonのリストに変更せずに、パンダのデータフレームに行を挿入します

  19. 19

    パンダ-手動でデータフレームを作成し、値を挿入します

  20. 20

    パンダのデータフレームから5行を読み取り、別のパンダのデータフレームの1行に1つのセルに挿入します。

  21. 21

    NAをデータフレームに比例してランダムに挿入します

  22. 22

    Pythonパンダ:欠落している日付、時系列の行をgroupbyデータフレームに挿入します

  23. 23

    予約フォームのヒント:カレンダー(データピッカー)を挿入し、タイムピッカー(?)を挿入します

  24. 24

    空のパンダデータフレームにタプルを挿入する

  25. 25

    1つ以上の列に基づいてパンダデータフレームに値を追加/挿入する

  26. 26

    パンダのデータフレームに小計を挿入できません

  27. 27

    MySQLの結果を既存のパンダデータフレームに挿入する

  28. 28

    ソートされていないインデックスを持つ複数のパンダデータフレームから別のデータフレームの既存の列に値を挿入します

  29. 29

    パンダ-「for」ループのデータフレームにrange(x)を入力します

ホットタグ

アーカイブ