必须指向二维图(x,y)坐标networkx python

时间:2012-05-27 20:26:00

标签: python matplotlib networkx

我从空间数据库获取信息,其值类似于线串(空间)格式,我需要将此信息添加到networkx图,稍后需要在matplot lib中绘制图形 我写了这段代码

cursor.execute("SELECT AsText(roadstring) FROM road1")
for row in cursor.fetchall():
    a=row[0][12:-2]
    a=str(a)
    a=a.split(",")
    for i in a:
        i=i.split(" ")
        i[0]=float(i[0])
        i[1]=float(i[1])
        weig=abs(i[0]-i[1])
        G.add_node((i[0],i[1]))

我无法获得如何为道路(x1,y1)添加二维边缘到(x2,y2),即使我需要为这些边缘之间的距离增加重量 有什么建议??

每条道路的线条都像643715.202,2499149.0506 643752.61523545,2499089.86084203 643773.6038,2499056.6558 643773.73878609,2499056.44011079 643793.20162482,2499025.34111554 643813.55943268,2498992.81212045 643826.6563,2498971.8852

我收到此错误我安装了matplotlib我试过复制你的代码

  

Traceback(最近一次调用最后一次):文件“D:\ python \ gis \ new.py”,行   2,在       从matplotlib导入pyplot作为plt文件“C:\ Python27 \ lib \ site-packages \ matplotlib__init __。py”,第133行,在          来自matplotlib.rcsetup import(defaultParams,File“C:\ Python27 \ lib \ site-packages \ matplotlib \ rcsetup.py”,第19行,in          来自matplotlib.colors import is_color_like文件“C:\ Python27 \ lib \ site-packages \ matplotlib \ colors.py”,第54行,in          将matplotlib.cbook导入为cbook文件“C:\ Python27 \ lib \ site-packages \ matplotlib \ cbook.py”,第15行,in          导入新文件“D:\ python \ gis \ new.py”,第2行,in       从matplotlib导入pyplot作为plt文件“C:\ Python27 \ lib \ site-packages \ matplotlib \ pyplot.py”,第20行,in          来自matplotlib import _pylab_helpers,交互式ImportError:无法导入名称交互式

1 个答案:

答案 0 :(得分:4)

我不完全确定你想要完成什么,但这就是我的解释方式 它

您将道路定义为道路沿线的坐标,并且您想绘制这些道路 坐标为节点,它们之间的道路为边。你也想要优势 权重是两个节点之间的距离。

通过保存前一个节点并使用毕达哥拉斯定理来计算距离,可以很容易地实现这一点。这是 我是怎么做到的:

import networkx as nx
from matplotlib import pyplot as plt
import math

G = nx.Graph()

row = '643715.202,2499149.0506 643752.61523545,2499089.86084203 ' +\
    '643773.6038,2499056.6558 643773.73878609,2499056.44011079 ' +\
    '643793.20162482,2499025.34111554 643813.55943268,2498992.81212045 ' +\
    '643826.6563,2498971.8852'

a=row.split(" ")
# Saving the previous node to be able to calculate the distance
prev_point = None
# Save the positions in a dictionary to be able to draw 
# the nodes at the correct positions
pos = {}
for i in a:
    cur_point = tuple([float(x) for x in i.split(',')])
    assert len(cur_point) == 2
    if prev_point is not None:
        # Calculate the distance between the nodes with the Pythagorean
        # theorem
        b = cur_point[1] - prev_point[1]
        c = cur_point[0] - prev_point[0]
        a = math.sqrt(b ** 2 + c ** 2)
        G.add_edge(cur_point, prev_point, weight=a)
    G.add_node(cur_point)
    pos[cur_point] = cur_point
    prev_point = cur_point
nx.draw(G, pos=pos)
plt.savefig('roads.png')

在这个例子中,我假设一个空格将节点位置和每个节点分开 position的x和y坐标以逗号分隔,但可以轻松更改。上面的代码将输出如下内容:

这会将节点置于“正确”位置,但如果道路长度存在很大差异,可能会导致一些问题。在上面的示例中,您可以看到两个节点或多或少彼此重叠。但这是一个不同的问题。