Python 2.7 使用NetworkX在PyQt QGraphicscene上定位节点

Python 2.7 使用NetworkX在PyQt QGraphicscene上定位节点,python-2.7,numpy,qt4,pyqt4,networkx,Python 2.7,Numpy,Qt4,Pyqt4,Networkx,您好,我一直在研究图形库,它允许我在PyQt QGraphicscene(有点像facebook/LinkedIn社交图)上创建交互式图形,而我还没有发现很多python库能够很好地与Qt/PyQt(fast,有许多布局算法)配合使用 起初我认为我应该使用Boost图形库(BGL),请参见题为“在Python中使用Boost图形库”的问题 我现在已经用NetworkX做了一些实验,使用NetworkX我可以制作一个具有合适布局的图形(spring_布局是我目前最喜欢的)。请参阅下面的代码 def

您好,我一直在研究图形库,它允许我在PyQt QGraphicscene(有点像facebook/LinkedIn社交图)上创建交互式图形,而我还没有发现很多python库能够很好地与Qt/PyQt(fast,有许多布局算法)配合使用 起初我认为我应该使用Boost图形库(BGL),请参见题为“在Python中使用Boost图形库”的问题 我现在已经用NetworkX做了一些实验,使用NetworkX我可以制作一个具有合适布局的图形(spring_布局是我目前最喜欢的)。请参阅下面的代码

def draw_nx_graph(self):
    graph = [(20, 21),(21, 22),(22, 23), (23, 24),(24, 25), (25, 20),(2, 3),(3, 4),(12, 13)]
    # extract nodes from graph
    nodes = set([n1 for n1, n2 in graph] + [n2 for n1, n2 in graph])

    # create networkx graph
    G=networkx.Graph()#  nx.Graph()

    # add nodes
    for node in nodes:
        G.add_node(node)

    # add edges
    for edge in graph:
        G.add_edge(edge[0], edge[1])

    # draw graph
    #pos = networkx.spectral_layout(G)
    pos = networkx.layout.fruchterman_reingold_layout(G)
    networkx.draw(G, pos)

    for n in G.nodes():
        print type(n)


    # show graph
    plt.show()
现在pos对象提供了一个由节点键入的位置字典,如下图所示 显示每个节点的位置。 我想知道如何最好地将这些位置(Ndarray)转换为QPointF,以便将节点放置在Qgraphicscene上

每个位置如此接近,让我有点担心,如果我只是创建QPointF,其值与pos字典中显示的值完全相同,那么所有节点都将聚集在一起,有没有办法将这些位置映射到QGraphicscene,以便节点按照alogrithm进行布局,并且在QGraphicscene区域内均匀分布


非常感谢

默认情况下,节点间隔在[0,1]×[0,1]内。您可以使用scale关键字参数将此坐标范围更改为fruchterman\u reingold\u layout,也可以简单地将坐标缩放+偏移到图形场景中的给定边界框。

嗨,为了补充答案,下面是我实现的代码

def generate_graph_and_update_scene(self):

    try:
        local_params=locals() #for error log  get local paramters
        this_function_name=sys._getframe().f_code.co_name #for error log  get function name


        self.vertex_dict.clear()
        self.clear() #clear graphicsscene

        self.graph_pos.clear() #clear graph position holder object

        #function that generates the node data
        root_nodes=my_database_query.get_nodes_information()
        for node in root_nodes:
            # add nodes to nx.graph object
            self.nx_graph.add_node(node['column1'])


        # create networkx graph
        self.graph_pos = nx.spring_layout(self.nx_graph, iterations=25,scale=10)

        for node in self.nx_graph.nodes(): # Add nodes to qgraphicsscene

            v=default_nodeobject.my_ellipse(node,self.graph_pos)               
            self.addItem(v) # Add ellipse to qgraphics scene

        for edge in self.nx_graph.edges():
            self.addItem(defaultedgeview.edgeview(edge[0], edge[1],self.graph_pos))#add edges to qgraphicscene

    except:
        #Exception handler
        message=str(sys.exc_info())
        message=message + str(local_params)+" "+ str(this_function_name)
        print message
这个比例确实有帮助,不过我必须承认,当添加大量节点时,1500+nx.spring\u布局(self.nx\u图,迭代次数=25,比例=10) 由于某种原因,我的速度很慢,但总的来说,我最终做的就是这样