首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >networkx盯着用matplotib呈现在错误位置的节点。

networkx盯着用matplotib呈现在错误位置的节点。
EN

Stack Overflow用户
提问于 2019-11-05 15:07:20
回答 1查看 89关注 0票数 0

我用networkx监视节点位置,但是matplotlib将其呈现在错误的位置。非常重要的是,每次启动脚本时都要得到相同的图片:因此,节点坐标尊重是根本。

此外,视图太紧凑,迫使我手动放大,并出现在figure2代替figure1。最后,matplotlib工作在小浮动比例尺-1,其中我喜欢屏幕维度x,1280和y 0,704。

我尝试过许多源代码,但它仍然不能正常工作。

代码语言:javascript
复制
import matplotlib.pyplot as plt
import networkx as nx

zero_zero = 'zero_zero'
zero_one = 'zero_one'
one_zero = 'one_zero'
one_one = 'one_one'

foo_1 = 'foo_1'
foo_2 = 'foo_2'
foo_3 = 'foo_3'
bar_1 = 'bar_1'
bar_2 = 'bar_2'
bar_3 = 'bar_3'

stuff_1 = 'stuff_1'
stuff_2 = 'stuff_2'
stuff_3 = 'stuff_3'
waow = 'waow'


fig = plt.figure(figsize=(100,100))

fig, ax = plt.subplots()
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.5 , 1.5)
G = nx.Graph()

starpos={zero_zero:(0,0), zero_one:(0,1), one_zero:(1,0), one_one:(1,1), foo_1:(1,0),foo_2:(0.1,0.1),foo_3:(0.2,0.3),bar_1:(0.3,0.2),bar_2:(0.76,.80),bar_3:(0,0.2),stuff_1:(0.8,0.6),stuff_2:(0.3,0.9),stuff_3:(0.7,0.7),waow:(0.4,0.6)}    

for k,v in starpos.items():
    G.add_node(k,pos=v)


G.nodes(data=True)


G.add_edge(foo_1, foo_2)

G.add_edge(foo_3, bar_3)
G.add_edge(bar_1, foo_3)
G.add_edge(bar_1, bar_2)
G.add_edge(bar_3, bar_2)


G.add_edge(stuff_1, stuff_3)
G.add_edge(waow, bar_3)
G.add_edge(bar_2, stuff_3)


G.add_edge(zero_zero, zero_one)
G.add_edge(zero_one, one_zero)
G.add_edge(one_zero, one_one)
G.add_edge(one_one, zero_zero)

pos = nx.spring_layout(G)


nx.draw(G, pos, font_size=16, with_labels=False)
for p in pos:  # raise text positions
    pos[p][1] += 0.07
nx.draw_networkx_labels(G, pos)

plt.show()

networkx matplotlib图片

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-05 22:19:08

让我们首先处理一个误解:尽管您已经为图中的每个节点分配了一个属性'pos',但是绘图命令根本不使用这个属性。

当你这样做时:

代码语言:javascript
复制
nx.draw(G, pos)

参数pos是一个字典,其键是G的节点,其值是您希望它们位于的位置。在您的例子中,您已经使用pos定义了pos=nx.spring_layout(G)。在这个命令中,首先给每个节点一个随机位置,然后它将节点视为由弹簧连接的块,并试图找到节点将移动到的位置。因此,每次它都会找到不同的安排,而且--这很重要--它根本不关心您定义的节点属性。

在您的例子中,您已经定义了字典starpos,我认为它具有每个节点所需的位置。因此,在创建节点时不需要分配属性,因为networkx不使用属性来分配位置。然后,在绘制它时,使用您已经创建的字典,而不是使用spring_layout创建一个新的字典。试一试

代码语言:javascript
复制
nx.draw(G, starpos, font_size=16, with_labels=False)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58714179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档