我想用IPython笔记本电脑来交互式分析我用Biopython的基因组图模块制作的一些基因组图。虽然有大量关于如何使用matplotlib在IPython笔记本中获得内联图形的文档,但GenomeDiagram使用ReportLab工具包,我认为IPython不支持该工具包。

然而,我在想,一种解决这个问题的方法是将绘图/基因组图写入一个文件,然后内联打开图像,结果会是这样的:

gd_diagram.write("test.png", "PNG")
display(file="test.png")

然而,我不知道如何做到这一点,也不知道这是否可行。那么有人知道IPython中是否可以打开/显示图像吗?


当前回答

当与Jupyter (iPython)一起使用GenomeDiagram时,显示图像的最简单方法是将GenomeDiagram转换为PNG图像。可以使用IPython.display.Image对象来包装它,使其显示在笔记本中。

from Bio.Graphics import GenomeDiagram
from Bio.SeqFeature import SeqFeature, FeatureLocation
from IPython.display import display, Image
gd_diagram = GenomeDiagram.Diagram("Test diagram")
gd_track_for_features = gd_diagram.new_track(1, name="Annotated Features")
gd_feature_set = gd_track_for_features.new_set()
gd_feature_set.add_feature(SeqFeature(FeatureLocation(25, 75), strand=+1))
gd_diagram.draw(format="linear", orientation="landscape", pagesize='A4',
                fragments=1, start=0, end=100)
Image(gd_diagram.write_to_string("PNG"))

(见笔记本)

其他回答

你可以直接使用这个,不用进口PIL

from IPython.display import Image, display
    
    display(Image(base_image_path))
    

当与Jupyter (iPython)一起使用GenomeDiagram时,显示图像的最简单方法是将GenomeDiagram转换为PNG图像。可以使用IPython.display.Image对象来包装它,使其显示在笔记本中。

from Bio.Graphics import GenomeDiagram
from Bio.SeqFeature import SeqFeature, FeatureLocation
from IPython.display import display, Image
gd_diagram = GenomeDiagram.Diagram("Test diagram")
gd_track_for_features = gd_diagram.new_track(1, name="Annotated Features")
gd_feature_set = gd_track_for_features.new_set()
gd_feature_set.add_feature(SeqFeature(FeatureLocation(25, 75), strand=+1))
gd_diagram.draw(format="linear", orientation="landscape", pagesize='A4',
                fragments=1, start=0, end=100)
Image(gd_diagram.write_to_string("PNG"))

(见笔记本)

如果试图在循环中以这种方式显示Image,则需要将Image构造函数包装在显示方法中。

from IPython.display import Image, display

listOfImageNames = ['/path/to/images/1.png',
                    '/path/to/images/2.png']

for imageName in listOfImageNames:
    display(Image(filename=imageName))

多亏了这个页面,我发现当上面的建议不起作用时,这个方法是有效的:

import PIL.Image
from cStringIO import StringIO
import IPython.display
import numpy as np
def showarray(a, fmt='png'):
    a = np.uint8(a)
    f = StringIO()
    PIL.Image.fromarray(a).save(f, fmt)
    IPython.display.display(IPython.display.Image(data=f.getvalue()))
from IPython.display import Image

Image(filename =r'C:\user\path')

我见过一些解决方案,有些不会工作,因为原始目录,当添加像上面这样的代码时,只记得在目录前添加'r'。这应该可以避免这种错误:(unicode error)'unicodeescape'编解码器无法解码位置2-3中的字节:截断的\UXXXXXXXX转义