### 如何使用 Python 的 NetworkX 库绘制图形
以下是通过 `NetworkX` 和 `Matplotlib` 绘制简单无向图的一个完整示例:
```python
import networkx as nx
import matplotlib.pyplot as plt
# 创建一个空的无向图
G = nx.Graph()
# 添加节点
G.add_node("Node A")
G.add_node("Node B")
G.add_node("Node C")
# 添加边
G.add_edge("Node A", "Node B")
G.add_edge("Node B", "Node C")
G.add_edge("Node A", "Node C")
# 设置布局方式(这里采用 spring 布局)
pos = nx.spring_layout(G)
# 使用 Matplotlib 进行绘图
nx.draw(
G,
pos,
with_labels=True, # 是否显示节点标签
node_color="lightblue", # 节点颜色
node_size=1500, # 节点大小
font_size=10, # 字体大小
font_weight="bold", # 字体粗细
linewidths=0 # 边框宽度
)
plt.title("Simple Graph Visualization using NetworkX and Matplotlib") # 图形标题
plt.show()
```
此代码展示了如何创建一个简单的无向图并对其进行可视化。它利用了 `spring_layout()` 方法作为默认布局算法[^1]。
对于更复杂的场景,比如带有权重的图或者不同的布局样式,可以参考以下扩展方法:
#### 带有权重的图绘制
当需要表示加权图时,可以在添加边的同时指定权重,并调整边的宽度以反映这些权重[^4]。
```python
import networkx as nx
import matplotlib.pyplot as plt
# 创建一个新的图对象
G = nx.Graph()
# 添加带权重的边
G.add_edge("A", "B", weight=2.0)
G.add_edge("B", "C", weight=3.0)
G.add_edge("A", "C", weight=1.0)
# 获取边的权重列表用于后续设置线条宽度
weights = [d["weight"] * 5 for (_, _, d) in G.edges(data=True)]
# 定义布局
pos = nx.spring_layout(G)
# 绘制节点和边
nx.draw_networkx_nodes(G, pos, node_size=1500, node_color="orange")
nx.draw_networkx_edges(G, pos, width=weights)
nx.draw_networkx_labels(G, pos, font_size=10, font_family="sans-serif")
# 显示权重标签
edge_labels = nx.get_edge_attributes(G, "weight")
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
plt.axis("off") # 关闭坐标轴
plt.show()
```
以上代码片段实现了对加权图的可视化处理,其中每条边的宽度与其对应的权重成正比[^4]。
---
#### 不同类型的布局支持
除了弹簧布局 (`spring_layout`) 外,还可以尝试其他多种布局风格,例如圆形布局 (`circular_layout`) 或谱系布局 (`spectral_layout`) 等[^2]。
```python
import networkx as nx
import matplotlib.pyplot as plt
G = nx.complete_graph(7) # 构建完全图 K_7
# 圆形布局
pos_circular = nx.circular_layout(G)
nx.draw(G, pos=pos_circular, with_labels=True, title="Circular Layout", node_color="skyblue")
plt.show()
# 谱系布局
pos_spectral = nx.spectral_layout(G)
nx.draw(G, pos=pos_spectral, with_labels=True, title="Spectral Layout", node_color="pink")
plt.show()
```
这段脚本分别采用了两种不同的布局策略来呈现同一张完整的七阶图。
---