【发布时间】: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