从 networkx 绘制以底图位置为中心的图形

Posted

技术标签:

【中文标题】从 networkx 绘制以底图位置为中心的图形【英文标题】:Draw a graph from networkx centered on a basemap position 【发布时间】:2020-03-03 03:47:12 【问题描述】:

我正在搜索在地图上绘制多个子图,每个子图将以一个地理位置(或一个地块的一个坐标)为中心。节点本身没有位置(或者它们都属于一个城市),但每个子图对应一个本地情况。

我尝试为每个子图仅分配一个位置,默认情况下使用“居中”选项绘制剩余的图

我试图从https://***.com/a/29597209/839119 中得到启发,在某个位置上绘制层次图,但没有成功

# -*- coding: utf-8 -*-
import networkx as nx
import pygraphviz
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap as Basemap

G1 = nx.Graph()
G1.add_edge('a', 'b', weight=0.6)
G1.add_edge('a', 'c', weight=0.2)
G1.add_edge('c', 'd', weight=0.1)
G1.add_edge('c', 'e', weight=0.7)
G1.add_edge('c', 'f', weight=0.9)
G1.add_edge('a', 'd', weight=0.3)

G2 = nx.Graph()
G2.add_edge('a', 'b', weight=0.9)
G2.add_edge('a', 'f', weight=0.5)
G2.add_edge('c', 'd', weight=0.1)
G2.add_edge('c', 'e', weight=0.4)
G2.add_edge('c', 'f', weight=0.2)
G2.add_edge('a', 'd', weight=0.1)

edges = G.edges()
weights = [G[u][v]['weight'] for u,v in edges] # liste des poids des edges

fig = plt.figure(figsize=(8, 8))
m = Basemap(projection='npstere',boundinglat=48,lon_0=270,resolution='l')
m.etopo(scale=0.5, alpha=0.5)
mx1,my1=m(-6.266155,53.350140) #would be long, lat coordinates of city 1
mx2,my2=m(-21.827774, 64.128288) #would be long, lat coordinates of city 2

nx.draw_networkx(G1,center=(mx1,my1),pos=nx.spring_layout(G1),node_size=200,node_color='green')
nx.draw_networkx(G2,center=(mx2,my2),pos=nx.spring_layout(G2),node_size=200,node_color='red')
plt.title("North Polar Stereographic Projection")
plt.show()

【问题讨论】:

【参考方案1】:

通过分别计算节点的位置,我可以很好地绘制网络。您可以使用此 sn-p 代码代替您的相关部分再次尝试。

# (other code above this line)
#
import numpy as np
# compute the positions here
# proper scaling (500000) is applied to the original positions ..
# .. obtained from xxx_layout() to get good spreading
pos1 = nx.spring_layout(G1)
for ea in pos1.keys():
    pos1[ea] =  np.array([mx1, my1]) + pos1[ea]*500000

pos2 = nx.circular_layout(G2)
for ea in pos2.keys():
    pos2[ea] =  np.array([mx2, my2]) + pos2[ea]*500000

nx.draw_networkx(G1, pos=pos1, node_size=100, node_color='green')
nx.draw_networkx(G2, pos=pos2, node_size=100, node_color='red')
#
# (more code below this line)

输出图:

编辑

替代版本:

import numpy as np
# compute the positions here
# proper scaling (500000) is applied to the original positions ..
# .. obtained from xxx_layout() to get good spreading

pos1 = nx.spring_layout(G1, scale=500000, center=[mx1, my1])
pos2 = nx.circular_layout(G2, scale=500000, center=[mx2, my2])

nx.draw_networkx(G1, pos=pos1, node_size=100, node_color='green')
nx.draw_networkx(G2, pos=pos2, node_size=100, node_color='red')
#
# (more code below this line)

【讨论】:

不错的建议,我尝试解决。我必须定义最佳矩形的大小以在 2 个位置之间绘制 eahc 子图。谢谢

以上是关于从 networkx 绘制以底图位置为中心的图形的主要内容,如果未能解决你的问题,请参考以下文章

使用 networkX 和 matplotlib 绘制一个巨大的图形

将布局从 networkx 转移到 cytoscape

Plotly Dash:在 Python 中绘制 networkx

Networkx:如何在图形中显示节点和边属性

子图中的 networkx 正在绘制部分在轴框架之外的节点

可以使用 python 3 从 networkx 获取分层图吗?