【问题标题】:Network graph is not visually optimized in NetworkX网络图在 NetworkX 中未进行视觉优化
【发布时间】:2017-02-26 18:59:57
【问题描述】:

我刚开始使用NetworkX,所以我可能做错了什么。我正在尝试使用从wikipedia.org 抓取的数据创建简单的图表。下面是我使用 spring_layout 选项构建的简单图形的示例。这是预期的输出吗?我在想它会重新排列点以尽量避免交叉线,这样看起来就更简单了。它似乎根本没有试图避免过境。

另外,我想要更多从左到右的流程图,如this(每个点都有一个年份值)(或垂直),但这个doesn't seem to be possible in NetworkX。谁能证实这一点?在我看来,线性流程图似乎是一种常见的需求。

本例中的数据:

selected_nodes = [96, 64, 163, 132, 166, 138, 108, 141, 238, 50, 58, 60, 61, 223]

selected_edges = [
    (50, 58),
    (61, 64),
    (60, 64),
    (58, 96),
    (108, 132),
    (96, 141),
    (138, 163),
    (141, 163),
    (64, 166),
    (163, 223),
    (132, 238),
    (96, 238),
    (166, 238),
    (223, 238)
]

text_labels = {
    50: u'ALGOL 58 (IAL)',
    58: u'ALGOL 60',
    60: u'COMIT (implementation)',
    61: u'FORTRAN IV',
    64: u'SNOBOL',
    96: u'ALGOL 68 (UNESCO/IFIP standard)',
    108: u'SETL',
    132: u'ABC',
    138: u'Modula',
    141: u'Mesa',
    163: u'Modula-2',
    166: u'Icon (implementation)',
    223: u'Modula-3',
    238: u'Python'
}

脚本代码

# This visualisation creates a network graph 
# with the spring layout

import networkx as nx
import matplotlib.pyplot as plt  

G = nx.DiGraph() # Create an empty Graph

G.add_nodes_from(selected_nodes)
G.add_edges_from(selected_edges)

plt.figure(1,figsize=(15,15))
#nx.draw(G, node_color='c', edge_color='k', with_labels=True)

pos = nx.spring_layout(G)

plt.figure(1,figsize=(15,15))

nx.draw_networkx_nodes(G, pos, labels=True)
nx.draw_networkx_edges(G, pos, arrows=True)
#nx.draw_networkx_labels(G, pos, labels)

for p, values in pos.iteritems():
    x, y = values
    plt.text(x+0.04, y+0.02, s=text_labels[p], horizontalalignment='center')

plt.savefig('lang_predecessors.pdf')
plt.show()

【问题讨论】:

  • 您可以尝试使用 spring_layout 以外的布局,并查看有关 networkx 布局的问题以获取更复杂的选项。
  • 谢谢。我确实尝试了其他布局('circular_layout'、'random_layout'、'shell_layout'、'spring_layout'、'spectral_layout'、'fruchterman_reingold_layout'),但找不到一个很好的简单线性或分层布局。老实说,我缺乏对布局选项的简单解释。或者一些例子。文档似乎不多。
  • graphviz_layout by graphviz 可能就是我要找的东西。

标签: python graph visualization networkx


【解决方案1】:
The graphviz dot layout has a hierarchical layout.  If you install pygraphviz you can use it like this

import networkx as nx
import matplotlib.pyplot as plt
from networkx.drawing.nx_agraph import to_agraph

selected_nodes = [96, 64, 163, 132, 166, 138, 108, 141, 238, 50, 58, 60, 61, 223]

selected_edges = [
    (50, 58),
    (61, 64),
    (60, 64),
    (58, 96),
    (108, 132),
    (96, 141),
    (138, 163),
    (141, 163),
    (64, 166),
    (163, 223),
    (132, 238),
    (96, 238),
    (166, 238),
    (223, 238)
]

text_labels = {
    50: u'ALGOL 58 (IAL)',
    58: u'ALGOL 60',
    60: u'COMIT (implementation)',
    61: u'FORTRAN IV',
    64: u'SNOBOL',
    96: u'ALGOL 68 (UNESCO/IFIP standard)',
    108: u'SETL',
    132: u'ABC',
    138: u'Modula',
    141: u'Mesa',
    163: u'Modula-2',
    166: u'Icon (implementation)',
    223: u'Modula-3',
    238: u'Python'
}
G = nx.DiGraph() # Create an empty Graph

for k,v in text_labels.items():
    G.add_node(k,label=v)
G.add_edges_from(selected_edges)

A = to_agraph(G)

A.draw('lang_predecessors.png', prog='dot')

【讨论】:

    猜你喜欢
    • 2016-07-11
    • 2022-06-11
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    相关资源
    最近更新 更多