如何使用坐标对绘制网络

时间:2019-05-08 00:13:42

标签: python-2.7 networkx

我有一个字符串:

MULTILINESTRING (
    (0 0, 0 20),
    (20 0, 20 20),
    (7.49080237694725 11.97316968394073, 5.67208473076472 5.229834926470677),
    (19.01428612819832 3.12037280884873, 25.96681259449994 4.024633854021577),
    (14.6398788362281 3.119890406724053, 21.51766222234933 1.803845175041164)
)

我想画的意思是我想连接每对线对,比如说将(0 0, 0 20)连接在一起,将(0 0)连接到(0 20),依此类推。

我更喜欢一种for循环,而不是将它们分成不同的行并连接起来。 使用Networkx对我来说也很重要,因为稍后我要查找一些矩阵,例如相邻矩阵。

1 个答案:

答案 0 :(得分:0)

好的,我们有一个字符串:

import networkx as nx
import re

a = """MULTILINESTRING (
    (0 0, 0 20),
    (20 0, 20 20),
    (7.49080237694725 11.97316968394073, 5.67208473076472 5.229834926470677),
    (19.01428612819832 3.12037280884873, 25.96681259449994 4.024633854021577),
    (14.6398788362281 3.119890406724053, 21.51766222234933 1.803845175041164)
)"""

首先,我们构造一个正则表达式以从字符串中提取所有坐标:

REGEX = re.compile(r'\((?P<x1>[\d\.]+) (?P<y1>[\d\.]+), (?P<x2>[\d\.]+) (?P<y2>[\d\.]+)\)')
raw_coords = REGEX.findall(a)

我们提取了字符串而不是浮点数。此外,它们不是与Networkx兼容的格式。因此我们重新格式化它们:

coords = [
    [(float(c[0]), float(c[1])), (float(c[2]), float(c[3]))]
    for c in raw_coords
]

创建图形并用我们的边缘填充它(它将自动创建具有坐标的节点):

G = nx.DiGraph()
G.add_edges_from(coords)

创建排名字典(nx.draw所需):

pos = {n: n for n in G.nodes}

创建标签dict(用于绘制精美图片):

labels = {n: '({:.2f}, {:.2f})'.format(n[0], n[1]) for n in G.nodes}

并绘制最终图形:

nx.draw(
    G,
    pos=pos,
    labels=labels
)

这里是:

enter image description here