目标: 我希望能够将 Lewis/Kekulé 结构的许多 SVG 图像组织成一个连贯的反应列表,显示在一些常见的查看文件中,如 PDF 或 PNG;也就是说,每个反应可能占一行,反应物和产物由箭头或其他分隔符分隔,并且在给定数据库中显示每个反应所需的 PDF 页面上将存在尽可能多的行。
上下文: 我正在使用 pybel.readstring() 从本地机器读取分子的规范 SMILES 表示,使用 molSVG = mol._repr_svg_() 将该字符串转换为 SVG 字符串,然后使用 display(SVG( molSVG)),同时还将 SVG 字符串保存到列表和 .svg 文件中。例如:
import pybel as pb
from IPython.display import display, SVG
molecules = []
# Read in canonical SMILES to some tractable object.
mol = pb.readstring('smi', '[O-][C]([C]1[CH][CH][CH][O]1)[O]')
# Convert it to an SVG string
molSVG = mol._repr_svg_()
# Display the SVG.
display(SVG(molSVG))
# Save the SVG to an .svg file and a list
with open('out.svg', 'w+') as result:
result.write(molSVG)
molecules.append(result)
我想做的而不是显示这些是将它们保存到一些单一的图像文件中。
尝试过的解决方案: 在过去的六七周里我经历了很多,所以我忘记了一些,但我尝试了 pybel 的 Outfile 类,但我认为它不会产生任何图像,因为它可能是为了仅存储 OBAtom 和 OBMol 类对象。来自 matplotlib.backends.backend_pdf 的 Matplotlib 的 PdfPages 似乎只是将多个 SVG 放入单个文件的第一步,但我认为这失败了,因为它需要绘图作为输入,而不是 SVG 文件。我也见过像 svgwrite 之类的模块,但无法让它们工作。
例如,成品的页面可能具有与此类似的结构, 尽管没有像中间的线条和箭头上的标签这样的花哨。
另外,请注意:我对所有形式的编码都非常缺乏经验,尤其是 Python,所以请让我尽可能简单。任何建议都非常感谢!