提交 14c19d68 编写于 作者: W wizardforcel

2.2

上级 786795e0
......@@ -30,3 +30,132 @@
下面的无向图展示了美国东北部的四个城市;边上的标签表示驾驶时间,以小时为单位。在这个例子中,节点的位置大致对应于城市的地理位置,但是通常图的布局是任意的。
## 2.2 NetworkX
![](img/2-2.png)
> 图 2.2:表示城市和高速公路的无向图
为了表示图,我们将使用一个名为 NetworkX 的包,它是 Python 中最常用的网络库。您可以在 <https://networkx.github.io/> 上阅读更多信息,但是我们之后会解释。
我们可以通过导入 NetworkX 和实例化`nx.DiGraph`来创建有向图:
```py
import networkx as nx
G = nx.DiGraph()
```
通常将 NetworkX 导入为`nx`。此时,`G`是一个`DiGraph`对象,不包含节点和边缘。我们可以使用`add_node`方法添加节点:
```py
G.add_node('Alice')
G.add_node('Bob')
G.add_node('Chuck')
```
现在我们可以使用`nodes`方法获取节点列表:
```py
>>> G.nodes()
['Alice', 'Bob', 'Chuck']
```
添加边的方式几乎相同:
```py
G.add_edge('Alice', 'Bob')
G.add_edge('Alice', 'Chuck')
G.add_edge('Bob', 'Alice')
G.add_edge('Bob', 'Chuck')
```
我们可以使用`edges`来获取边的列表:
```py
>>> G.edges()
[('Alice', 'Bob'), ('Alice', 'Chuck'),
('Bob', 'Alice'), ('Bob', 'Chuck')]
```
NetworkX 提供了几个绘图的功能;`draw_circular`将节点排列成一个圆,并使用边将它们连接:
```py
nx.draw_circular(G,
node_color=COLORS[0],
node_size=2000,
with_labels=True)
```
这就是我用来生成图(?)的代码。`with_labels`选项标注了节点;在下一个例子中,我们将看到如何标注边。
为了产生图(?),我们以一个字典开始,它将每个城市的名称,映射为对应的经纬度:
```py
pos = dict(Albany=(-74, 43),
Boston=(-71, 42),
NYC=(-74, 41),
Philly=(-75, 40))
```
因为这是个无向图,我实例化了`nx.Graph`
```py
G = nx.Graph()
```
之后我可以使用`add_nodes_from`来迭代`pos`的键,并将它们添加为节点。
```py
G.add_nodes_from(pos)
```
下面我会创建一个字典,将每条边映射为对应的驾驶时间。
```py
drive_times = {('Albany', 'Boston'): 3,
('Albany', 'NYC'): 4,
('Boston', 'NYC'): 4,
('NYC', 'Philly'): 2}
```
现在我可以使用`add_edges_from`,它迭代了`drive_times`的键,并将它们添加为边:
```py
G.add_edges_from(drive_times)
```
现在我不使用`draw_circular`,它将节点排列成一个圆圈,而是使用`draw`,它接受`pos`作为第二个参数:
```py
nx.draw(G, pos,
node_color=COLORS[1],
node_shape='s',
node_size=2500,
with_labels=True)
```
`pos`是一个字典,将每个城市映射为其坐标;`draw`使用它来确定节点的位置。
要添加边的标签,我们使用`draw_networkx_edge_labels`
```py
nx.draw_networkx_edge_labels(G, pos,
edge_labels=drive_times)
```
`drive_times`是一个字典,将每条边映射为它们之间的驾驶距离,每条边表示为城市名称的偶对。这就是我生成图(?)的方式。
在这两个例子中,这些节点是字符串,但是通常它们可以是任何可哈希的类型。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册