从单个jupyter/ipython单元格中绘制多个python-igraph图形

4

类似于这个问题, 我想用以下代码从单个ipython-notebook单元格中绘制多个图形:

[1]:
%matplotlib inline
import igraph # it is `pip install python-igraph` on py2
import matplotlib.pyplot as plt
import numpy as np

[2]:
# draws a graph successfully
igraph.plot(igraph.Graph.Erdos_Renyi(10, .5))

[3]:
for p in np.arange(.3, .8, .1):
    g = igraph.Graph.Erdos_Renyi(10, p)
    igraph.plot(g)

如何在笔记本上显示来自[3]单元格的多个图形?

如果我想绘制一些matplotlib图表,似乎可以使用这个解决方案:

[4]:
for p in np.arange(.3, .8, .1):
    g = igraph.Graph.Erdos_Renyi(10, p)
    plt.loglog(sorted(g.degree(), reverse=True), marker='o')
    plt.show()

但是我认为这不适用于igraph图形。是否有一种将igraph.drawing.Plot转换为更熟悉的matplotlib对象的方法?
3个回答

7
我最终得出的解决方案如下:

我最终得出的解决方案如下:

from IPython.core.display import display, SVG

for p in np.arange(.3, .8, .1):
    g = igraph.Graph.Erdos_Renyi(10, p)
    print(p)
    display(SVG(igraph.plot(g)._repr_svg_()))

同样的方法也可以应用于任何支持_repr_svg_()_repr_png_()的对象,所以目前这不仅限于python-igraph。


4

我正在使用 igraph 0.8.2 和 Python 3.7。以上回答对我无效:

TypeError: a bytes-like object is required, not 'tuple'

我找到了另一种方法来实现它,使用临时文件并从中读取图像:

import os
from IPython.display import display, Image

for p in np.arange(.3, .8, .1):
    g = ig.Graph.Erdos_Renyi(10, p)
    ig.plot(g).save('temporary.png') 
    display(Image(filename='temporary.png'))
    os.remove('temporary.png')

1
如果您在较新版本的Python上使用第一个答案,您将得到:
TypeError: a bytes-like object is required, not 'tuple'

但你只需要修改最后一行为:

Display(SVG(igraph.plot(g)._repr_svg_()[0]))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接