如何用Python可视化社交网络
我需要定义一个社交网络,然后分析它并把它画出来。我可以手动画图和计算各种指标,但我不想重复造轮子。
我试过使用matplotlib这个工具,但我希望能更方便地使用它,只需要几行代码就能告诉它怎么加载数据,然后调用一个函数,把图形渲染成SVG格式。
我该如何以这种方式可视化社交网络呢?
4 个回答
这里有三个回答提到了Networkx和Gephi,但没有人提到graph-tool。它们的主要区别在于,graph-tool的算法是用C++实现的,这使得它的性能更强,比起Networkx等工具要快一些。
此外,它还支持可视化。从网站上可以看到:
你可以方便地绘制图形,使用多种算法和输出格式(包括在屏幕上显示)。Graph-tool有自己的一套布局算法和灵活的交互式绘图功能,基于cairo和GTK+,同时它也可以作为一个非常友好的接口,连接到优秀的graphviz工具。
这里有一个很酷的例子,来自文档(还有很多很多其他例子):
(政治博客网络的块划分)。
这个图的代码是:
>>> g = gt.collection.data["polblogs"]
>>> g = gt.GraphView(g, vfilt=gt.label_largest_component(gt.GraphView(g, directed=False)))
>>> state = gt.BlockState(g, B=g.num_vertices(), deg_corr=True)
>>> state = gt.multilevel_minimize(state, B=2)
>>> gt.graph_draw(g, pos=g.vp["pos"], vertex_fill_color=state.get_blocks(), output="polblogs_agg.pdf")
<...>
(注意:在这个例子中,每个节点的位置是预先设定好的,所以不需要运行布局算法)
这里还有另一个使用相同数据的例子(结果非常惊人):http://ryancompton.net/2014/10/05/graph-tools-visualization-is-pretty-good/
networkx 是一个非常强大且灵活的 Python 库,用于处理网络图。你可以用有向和无向的连接来连接节点。构建网络的方法有两种:一种是先添加节点,再添加连接这些节点的边;另一种是直接列出边的对(未定义的节点会自动创建)。一旦创建了节点(和边),你还可以给它们加上任意的标签。
虽然 networkx 可以用来可视化网络(具体可以查看文档),但你可能更喜欢使用像 Gephi 这样的网络可视化应用程序(可以在 gephi.org 找到)。networkx 支持多种导入和导出格式。如果你使用像 GraphML 这样的格式导出网络,导出的文件可以很方便地加载到 Gephi 中进行可视化。
import networkx as nx
G=nx.Graph()
G.add_edges_from([(1,2),(1,3),(1,4),(3,4)])
G
>>> <networkx.classes.graph.Graph object at 0x128a930>
G.nodes(data=True)
>>> [(1, {}), (2, {}), (3, {}), (4, {})]
G.node[1]['attribute']='value'
G.nodes(data=True)
>>> [(1, {'attribute': 'value'}), (2, {}), (3, {}), (4, {})]
nx.write_graphml(G,'so.graphml')