【问题标题】:networkx stared nodes rendered at wrong place with matplotibnetworkx 使用 matplotlib 在错误的位置开始渲染节点
【发布时间】:2019-11-05 15:07:20
【问题描述】:

我已经用 networkx 盯着节点位置,但 matplotlib 将它呈现在错误的位置。 非常重要的是每次启动脚本时都获得相同的图片:因此,节点坐标尊重是基本的。

另外,视图太紧凑,迫使我手动放大内部,并出现在图 2 中,而不是图 1。 最后,matplotlib 在小浮点数 [-1,1] 上工作,我更喜欢屏幕尺寸 x [0,1280] 和 y [0,704]。

我尝试了很多源代码,但仍然无法正常工作

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 picture

【问题讨论】:

    标签: python-3.x matplotlib graph networkx


    【解决方案1】:

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

    当你这样做时:

    nx.draw(G, pos)
    

    参数pos 是一个字典,其键是G 的节点,其值是您希望它们所在的位置。在您的情况下,您已经使用pos=nx.spring_layout(G) 定义了pos。在这个命令中,每个节点最初被赋予一个随机位置,然后它将节点视为由弹簧连接的质量,并试图找到节点将移动到的位置。所以每次它都会找到不同的排列方式,而且——这很重要——它根本不关心你定义的节点属性。

    在您的情况下,您已经定义了字典starpos,我相信它具有每个节点的所需位置。因此,在创建节点时无需分配属性[因为 networkx 不使用属性来分配位置]。然后当你绘制它时,使用你已经创建的字典而不是使用spring_layout 来创建一个新的。试试

    nx.draw(G, starpos, font_size=16, with_labels=False)
    

    【讨论】:

    • 是的乔尔!如何将它放在图一(我有一个额外的无用空白图)上,每个节点上都有图例?我得到这个回溯:starpos[p][1] += 0.07 TypeError: 'tuple' object does not support item assignment
    • 所以这个错误是因为如果你有一个元组,比如(1,2),它就是immutable - Python 不允许你改变一个元组。一种选择是为标签创建一个新的字典labelposlabelpos = {p, (x,y+0.07) for p, (x,y) in starpos.items()}。另一种选择是使用列表而不是元组作为位置,所以使用[1,2],这将允许您执行您使用的步骤。
    • 额外的数字:看看你定义fig的两个地方。想想你希望第一个fig 发生什么,然后检查你的代码是否告诉它这样做。正在发生的事情是,您的第一个 fig 正在成为您多余的空地。
    猜你喜欢
    • 2012-12-03
    • 2015-12-05
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多