python networkx如何画图

python networkx如何画图

使用Python的NetworkX库绘制图的核心步骤是:导入库、创建图对象、添加节点和边、使用Matplotlib显示图像。 下面将详细描述这些步骤,并提供一些实际操作的例子和技巧。


一、导入必要的库

首先,导入NetworkX和Matplotlib库。NetworkX用于创建和操作图,Matplotlib用于绘图和显示图像。

import networkx as nx

import matplotlib.pyplot as plt

二、创建图对象

NetworkX提供了不同类型的图对象,如无向图、有向图、加权图等。可以根据需要选择合适的图对象。

# 创建无向图

G = nx.Graph()

创建有向图

DG = nx.DiGraph()

创建加权图

WG = nx.Graph()

三、添加节点和边

节点可以是任何可哈希对象,如整数、字符串、元组等。边可以通过连接两个节点来创建,并且可以附加权重等属性。

1、添加节点

# 添加单个节点

G.add_node(1)

添加多个节点

G.add_nodes_from([2, 3, 4])

2、添加边

# 添加单条边

G.add_edge(1, 2)

添加多条边

G.add_edges_from([(2, 3), (3, 4), (4, 1)])

3、添加带权重的边

# 添加带权重的边

WG.add_edge(1, 2, weight=4.2)

WG.add_edge(2, 3, weight=3.6)

四、绘制图

NetworkX与Matplotlib的结合使得绘图非常简单和灵活。

1、基本绘图

# 绘制无向图

nx.draw(G, with_labels=True)

plt.show()

2、绘制有向图

# 绘制有向图

nx.draw(DG, with_labels=True, node_color='skyblue', font_weight='bold')

plt.show()

3、绘制带权重的图

# 绘制带权重的图

pos = nx.spring_layout(WG) # 用于选择图的布局

nx.draw(WG, pos, with_labels=True)

labels = nx.get_edge_attributes(WG, 'weight')

nx.draw_networkx_edge_labels(WG, pos, edge_labels=labels)

plt.show()

五、图的布局

NetworkX提供了多种布局算法,如圆形布局、随机布局、壳布局等,可以根据需要选择合适的布局。

1、圆形布局

pos = nx.circular_layout(G)

nx.draw(G, pos, with_labels=True)

plt.show()

2、随机布局

pos = nx.random_layout(G)

nx.draw(G, pos, with_labels=True)

plt.show()

3、壳布局

pos = nx.shell_layout(G)

nx.draw(G, pos, with_labels=True)

plt.show()

六、定制图的外观

可以通过改变节点和边的颜色、形状、大小等来定制图的外观。

1、改变节点颜色和大小

nx.draw(G, with_labels=True, node_color='lightblue', node_size=700)

plt.show()

2、改变边的颜色和宽度

nx.draw(G, with_labels=True, edge_color='gray', width=2)

plt.show()

七、复杂图的绘制

对于大型或复杂的图,可以使用子图、层次布局等来提高可读性。

1、绘制子图

fig, ax = plt.subplots(1, 2, figsize=(12, 6))

绘制第一个子图

nx.draw(G, with_labels=True, ax=ax[0])

ax[0].set_title('Graph 1')

绘制第二个子图

nx.draw(DG, with_labels=True, node_color='skyblue', ax=ax[1])

ax[1].set_title('Graph 2')

plt.show()

2、层次布局

层次布局通常用于有向无环图(DAG),可以使用NetworkX的hierarchy_pos函数实现。

def hierarchy_pos(G, root=None, width=1., vert_gap=0.2, vert_loc=0, xcenter=0.5):

'''

If the graph is a tree this will return the positions to plot this in a

hierarchical layout.

'''

pos = _hierarchy_pos(G, root, width, vert_gap, vert_loc, xcenter)

return pos

def _hierarchy_pos(G, root, width=1., vert_gap=0.2, vert_loc=0, xcenter=0.5, pos=None, parent=None, parsed=[]):

if pos is None:

pos = {root: (xcenter, vert_loc)}

else:

pos[root] = (xcenter, vert_loc)

children = list(G.neighbors(root))

if not isinstance(G, nx.DiGraph) and parent is not None:

children.remove(parent)

if len(children) != 0:

dx = width / len(children)

nextx = xcenter - width/2 - dx/2

for child in children:

nextx += dx

pos = _hierarchy_pos(G, child, width=dx, vert_gap=vert_gap, vert_loc=vert_loc-vert_gap, xcenter=nextx, pos=pos, parent=root, parsed=parsed)

return pos

创建DAG

DAG = nx.DiGraph()

DAG.add_edges_from([(1, 2), (1, 3), (2, 4), (2, 5), (3, 6), (3, 7)])

pos = hierarchy_pos(DAG, 1)

nx.draw(DAG, pos=pos, with_labels=True, node_size=5000, node_color='lightgreen')

plt.show()

八、总结

通过上述步骤,可以使用Python的NetworkX库轻松创建和绘制各种类型的图。无论是简单的无向图、有向图,还是复杂的带权重的图,NetworkX和Matplotlib都提供了强大的功能和灵活的选项来满足不同的需求。

项目管理中,图形化的表示方式可以帮助团队更直观地理解项目的结构和进展。例如,研发项目管理系统PingCode通用项目管理软件Worktile都可以集成这些图形化的表示方式,以提高团队的协作效率和项目的可视化管理。

希望这篇文章能帮助你更好地理解和使用NetworkX库来绘制图。如果有任何问题或需要进一步的帮助,请随时联系。

相关问答FAQs:

1. 如何在Python中使用networkx库画图?
使用networkx库可以方便地在Python中画图。首先,需要安装networkx库。然后,可以使用networkx的图对象来创建和操作图。通过调用图对象的add_node()和add_edge()方法,可以添加节点和边。最后,使用networkx的绘图函数(如draw()或draw_networkx())将图形绘制出来。

2. 如何给网络图的节点和边添加标签?
如果想给网络图的节点和边添加标签,可以通过设置节点和边的属性来实现。首先,使用add_node()和add_edge()方法添加节点和边。然后,可以使用set_node_attributes()和set_edge_attributes()函数为节点和边添加属性。在绘制图形时,可以使用labels参数来显示节点和边的标签。

3. 如何在网络图中设置节点的颜色和大小?
如果想在网络图中设置节点的颜色和大小,可以使用networkx的绘图函数的node_color和node_size参数。node_color参数可以接受一个颜色列表,用于指定每个节点的颜色。node_size参数可以接受一个大小列表,用于指定每个节点的大小。通过设置这些参数,可以根据节点的属性来自定义节点的颜色和大小。

文章包含AI辅助创作,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/861865

(0)
Edit1Edit1
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部