我正在尝试生成树结构的流程图.我已经能够使用networkx创建代表图,但我需要一种方法来在输出图时显示树结构.我正在使用matplotlib.pylab来绘制图形.
我需要在类似于此处所示的结构中显示数据.虽然我没有子图.
我怎样才能保证这样的结构呢?
非信徒的例子:

我已经能够用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) 在 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 选择了真正根节点的一个孩子作为中心(因此一些分支看起来比实际更浅,相对于其他分支)。
如何手动指定多棵树的根?
我正在寻找在地图上绘制多个子图,每个子图都以一个地理位置(或绘图的一个坐标)为中心。节点本身没有位置(或者它们都属于一个城市),但每个子图对应一个本地情况。
我试图从/sf/answers/2071804661/ 中得到启发,在一个位置上绘制一个分层图,但没有成功
Run Code Online (Sandbox Code Playgroud)# -*- 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] # …
用于网络社区检测的 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 中的networkx 库打印二叉树。
\n\n可是,我却无法保住左右两个孩子。有没有办法告诉图表先打印左孩子,然后打印右孩子?
\n\nimport networkx as nx\nG = nx.Graph()\nG.add_edges_from([(10,20), (11,20)])\nnx.draw_networkx(G)\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n编辑1:使用 pygraphwiz 时,它至少会产生一个有向图。所以,我对根节点有了更好的了解。
\n\n下面是我正在使用的代码:
\n\nimport 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\')\nRun Code Online (Sandbox Code Playgroud)\n\n但是,这距离结构化格式还很远。接下来我将发布我发现的内容。新图如下所示(至少我们知道根):
\n\n\n\n编辑2:对于那些遇到安装问题的人,请参阅这篇文章。 答案是——如果你想在 Windows 64 位上安装 pygraphviz,它非常有帮助。
\n如果我使用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)
networkx ×6
python ×6
matplotlib ×2
pygraphviz ×2
dendrogram ×1
graph ×1
graphviz ×1
scipy ×1
tree ×1