8

我正在 matplotlib 中尝试 networkx 和可视化,我很困惑,因为我不清楚它们是如何相互作用的?有简单的例子

import matplotlib.pyplot
import networkx as nx
G=nx.path_graph(8)
nx.draw(G)
matplotlib.pyplot.show()

我在哪里告诉 pyplot,我想画图 G?我猜 nx.draw 使用类似 matplotlib.pyplot.{plot, etc ...} 所以,如果我想绘制 2 个图:

import matplotlib.pyplot
import networkx as nx

G=nx.path_graph(8)
E=nx.path_graph(30)
nx.draw(G)

matplotlib.pyplot.figure()
nx.draw(E)
matplotlib.pyplot.show()

然后……小实验

import networkx as nx
G=nx.path_graph(8)
E=nx.path_graph(30)
nx.draw(G)
import matplotlib.pyplot
matplotlib.pyplot.figure()
nx.draw(E)
import matplotlib.pyplot as plt
plt.show()

请不要因为这个愚蠢的代码而杀了我,我只是想了解 - networkx 如何在 matplotlib 中绘制一些东西,而它甚至还没有导入!

PS:对不起我的英语。

4

1 回答 1

16

如果要分别绘制图形或创建单个Axes对象并将其传递给nx.draw. 例如:

G = nx.path_graph(8)
E = nx.path_graph(30)

# one plot, both graphs
fig, ax = subplots()
nx.draw(G, ax=ax)
nx.draw(E, ax=ax)

要得到:

在此处输入图像描述

如果您想要两个不同的图形对象,请分别创建它们,如下所示:

G = nx.path_graph(8)
E = nx.path_graph(30)

# two separate graphs
fig1 = figure()
ax1 = fig1.add_subplot(111)
nx.draw(G, ax=ax1)

fig2 = figure()
ax2 = fig2.add_subplot(111)
nx.draw(G, ax=ax2)

产生:

在此处输入图像描述 在此处输入图像描述

最后,您可以根据需要创建一个子图,如下所示:

G = nx.path_graph(8)
E = nx.path_graph(30)

pos=nx.spring_layout(E,iterations=100)

subplot(121)
nx.draw(E, pos)

subplot(122)
nx.draw(G, pos)

导致:

在此处输入图像描述

对于任何值得的东西,当您想在 之外创建子图时,的 API的ax参数似乎nx.draw是无用的,因为有一些调用使其依赖于接口。没有真正深入研究为什么会这样,只是想我会指出这一点。matplotlibpylabnx.drawgcapylab

的源代码nx.draw相当简单:

try:
    import matplotlib.pylab as pylab
except ImportError:
    raise ImportError("Matplotlib required for draw()")
except RuntimeError:
    print("Matplotlib unable to open display")
    raise

cf=pylab.gcf()
cf.set_facecolor('w')
if ax is None:
    if cf._axstack() is None:
        ax=cf.add_axes((0,0,1,1))
    else:
        ax=cf.gca()

# allow callers to override the hold state by passing hold=True|False

b = pylab.ishold()
h = kwds.pop('hold', None)
if h is not None:
    pylab.hold(h)
try:
    draw_networkx(G,pos=pos,ax=ax,**kwds)
    ax.set_axis_off()
    pylab.draw_if_interactive()
except:
    pylab.hold(b)
    raise
pylab.hold(b)
return
  1. 使用 . 从环境中捕获图形gcf
  2. Axes如果一个对象不存在,则将一个对象添加到图形中,否则使用 . 从环境中获取它gca
  3. 使情节面颜色为白色
  4. 打开hold_
  5. 用内部函数绘制它
  6. 关闭轴
  7. 最后,如果我们处于交互模式,绘制它并重新引发任何捕获的异常
于 2013-09-01T23:38:07.220 回答