Hi! I was trying to draw molecules as well in another question. The solution I have found so far is to convert molecules to PNG with RDKit:
import base64
import io
import pandas as pd
import rdkit
import rdkit.Chem
import rdkit.Chem.Draw
import streamlit as st
@st.cache_data
def smi_to_png(smi: str) -> str:
"""Returns molecular image as data URI."""
mol = rdkit.Chem.MolFromSmiles(smi)
pil_image = rdkit.Chem.Draw.MolToImage(mol)
with io.BytesIO() as buffer:
pil_image.save(buffer, "png")
data = base64.encodebytes(buffer.getvalue()).decode("utf-8")
return f"data:image/png;base64,{data}"
df = pd.DataFrame({"smiles": ["CCCNC", "CCC", "CCCCC"]})
df["img"] = df["smiles"].apply(smi_to_png)
st.dataframe(df, column_config={"img": st.column_config.ImageColumn()})
The image produced by column_config is quite small, but there might be some options to adjust it.