相关疑难解决方法(0)

有没有办法保证NetworkX的分层输出?

我正在尝试生成树结构的流程图.我已经能够使用networkx创建代表图,但我需要一种方法来在输出图时显示结构.我正在使用matplotlib.pylab来绘制图形.

我需要在类似于此处所示的结构中显示数据.虽然我没有子图.

我怎样才能保证这样的结构呢?

非信徒的例子:

各种NetworkX布局

我已经能够用pylab和graphviz显示图形,但都没有提供我正在寻找的树形结构.我已经尝试过网络必须提供的每个布局,但它们都没有显示层次结构.我只是不确定提供它的选项/模式或者如果我需要使用权重.任何建议都会有所帮助.

@jterrace:

这是我用来制作上图的粗略轮廓.我添加了一些标签,但除此之外它是相同的.

import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()

G.add_node("ROOT")

for i in xrange(5):
    G.add_node("Child_%i" % i)
    G.add_node("Grandchild_%i" % i)
    G.add_node("Greatgrandchild_%i" % i)

    G.add_edge("ROOT", "Child_%i" % i)
    G.add_edge("Child_%i" % i, "Grandchild_%i" % i)
    G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i)

plt.title("draw_networkx")
nx.draw_networkx(G)

plt.show()
Run Code Online (Sandbox Code Playgroud)

python networkx

71
推荐指数
2
解决办法
3万
查看次数

Networkx:如何为一次绘制多棵树指定多个根?

在 networkx 中有一个函数可以使用径向布局(graphviz 的“twopi”)绘制树:

import pydot
from networkx.drawing.nx_pydot import graphviz_layout

pos = graphviz_layout(G, prog='twopi', root=root, args='')
Run Code Online (Sandbox Code Playgroud)

可以使用参数指定根节点root(它被添加到引擎盖下的 args 中args += f" -Groot={root}")。

但是,当图形由多个断开连接的组件组成时,如何指定多个根?即一片树林。

我在不提供根参数的情况下得到以下图:

在此处输入图片说明

正如你在视觉上看到的,虽然它正确地为 10 棵树选择了真正的根节点,但它为 12 选择了真正根节点的一个孩子作为中心(因此一些分支看起来比实际更浅,相对于其他分支)。

如何手动指定多棵树的根?

python graphviz networkx

6
推荐指数
1
解决办法
600
查看次数

从以底图位置为中心的 networkx 绘制图形

我正在寻找在地图上绘制多个子图,每个子图都以一个地理位置(或绘图的一个坐标)为中心。节点本身没有位置(或者它们都属于一个城市),但每个子图对应一个本地情况。

  • 我试图为每个子图只为一个节点分配一个位置,使用“居中”选项默认绘制其余的图
  • 我试图从/sf/answers/2071804661/ 中得到启发,在一个位置上绘制一个分层图,但没有成功

    # -*- coding: utf-8 -*-
    import networkx as nx
    import pygraphviz
    import matplotlib.pyplot as plt
    from mpl_toolkits.basemap import Basemap as Basemap
    
    G1 = nx.Graph()
    G1.add_edge('a', 'b', weight=0.6)
    G1.add_edge('a', 'c', weight=0.2)
    G1.add_edge('c', 'd', weight=0.1)
    G1.add_edge('c', 'e', weight=0.7)
    G1.add_edge('c', 'f', weight=0.9)
    G1.add_edge('a', 'd', weight=0.3)
    
    G2 = nx.Graph()
    G2.add_edge('a', 'b', weight=0.9)
    G2.add_edge('a', 'f', weight=0.5)
    G2.add_edge('c', 'd', weight=0.1)
    G2.add_edge('c', 'e', weight=0.4)
    G2.add_edge('c', 'f', weight=0.2)
    G2.add_edge('a', 'd', weight=0.1)
    
    edges = G.edges()
    weights = [G[u][v]['weight'] for u,v in edges] # …
    Run Code Online (Sandbox Code Playgroud)

python networkx pygraphviz matplotlib-basemap

5
推荐指数
1
解决办法
729
查看次数

绘制由 NetworkX Girvan-Newman 算法找到的社区的树状图

用于网络社区检测的 Girvan-Newman 算法:

通过逐步从原始图中移除边来检测社区。该算法会在每一步删除“最有价值”的边缘,传统上是具有最高中介中心性的边缘。当图表分解成碎片时,紧密结合的社区结构暴露出来,结果可以用树状图来描述。

在 NetworkX 中,实现返回集合元组上的迭代器。第一个元组是由 2 个社区组成的第一个切割,第二个元组是由 3 个社区组成的第二个切割,依此类推,直到最后一个元组具有 n 个单独节点(树状图的叶子)的 n 个集合。

import networkx as nx

G = nx.path_graph(10)
comp = nx.community.girvan_newman(G)
list(comp)
Run Code Online (Sandbox Code Playgroud)

[({0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}), ({0, 1}, {2, 3, 4}, {5, 6, 7, 8 , 9}), ({0, 1}, {2, 3, 4}, {5, 6}, {8, 9, 7}), ({0, 1}, {2}, {3, 4 }, {5, 6}, {8, 9, 7}), ({0, 1}, {2}, {3, 4}, {5, 6}, {7}, {8, 9}) , ({0}, …

python matplotlib dendrogram scipy networkx

5
推荐指数
1
解决办法
2281
查看次数

使用networkx打印python图表时保留左右孩子

我正在尝试使用 python 中的networkx 库打印二叉树。

\n\n

可是,我却无法保住左右两个孩子。有没有办法告诉图表先打印左孩子,然后打印右孩子?

\n\n
import networkx as nx\nG = nx.Graph()\nG.add_edges_from([(10,20), (11,20)])\nnx.draw_networkx(G)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此输入图像描述\n\xef\xbf\xbc

\n\n

编辑1:使用 pygraphwiz 时,它至少会产生一个有向图。所以,我对根节点有了更好的了解。

\n\n

下面是我正在使用的代码:

\n\n
import pygraphviz as pgv\nG = pgv.AGraph()\nG.add_node(\'20\')\nG.add_node(\'10\')\nG.add_node(\'11\')\nG.add_edge(\'20\',\'10\')\nG.add_edge(\'20\',\'11\')\nG.add_edge(\'10\',\'7\')\nG.add_edge(\'10\',\'12\')\n\nG.layout()\nG.draw(\'file1.png\')\nfrom IPython.display import Image\nImage(\'file1.png\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,这距离结构化格式还很远。接下来我将发布我发现的内容。新图如下所示(至少我们知道根):

\n\n

根到叶二叉树

\n\n

编辑2:对于那些遇到安装问题的人,请参阅这篇文章。 答案是——如果你想在 Windows 64 位上安装 pygraphviz,它非常有帮助。

\n

python tree graph networkx pygraphviz

2
推荐指数
1
解决办法
3013
查看次数

如何在Networkx中更精美地绘制树

如果我使用networkx制作一棵树并将其绘制,则节点重叠。有没有办法画出来所以没有重叠?

import matplotlib.pyplot as plt
import networkx as nx
T = nx.generators.balanced_tree(2, 5)
nx.draw(T)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

python matplotlib networkx

2
推荐指数
2
解决办法
143
查看次数