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

Posted

技术标签:

【中文标题】从单个 jupyter/ipython 单元格绘制多个 python-igraph 图【英文标题】:Draw multiple python-igraph graphs from single jupyter/ipython cell 【发布时间】:2017-12-14 09:45:12 【问题描述】:

Similarly to this question,我想使用以下代码从单个 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 图 AFAICS。有什么方法可以将igraph.drawing.Plot 转换为更熟悉的matplotlib 对象吗?

【问题讨论】:

【参考方案1】:

我最终得到了这样的解决方案:

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 的限制。

【讨论】:

【参考方案2】:

我正在使用 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')

【讨论】:

【参考方案3】:

如果你在较新的 Python 上使用第一个答案,你会得到:

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

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

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

【讨论】:

以上是关于从单个 jupyter/ipython 单元格绘制多个 python-igraph 图的主要内容,如果未能解决你的问题,请参考以下文章

在笔记本中组合jupyter / ipython内核

在 jupyter/iPython notebook 脚本和类方法之间同步代码

如何重置Jupyter / IPython输入提示编号?

从一个单元格边缘到另一个单元格边缘绘制箭头

C# ListView 详细信息,突出显示单个单元格

如何从过滤列中复制单个单元格