NetworkX,Matplotlib图形用户界面应用程序

cuxqih21  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(142)

尝试编写一个应用程序,根据用户通过简单的GUI输入的参数重复创建不同的图形。所有图形以及一些描述它们的文本需要显示在一个单一的、同一个Jupiter单元格/窗口/图表中,每个新的用户输入都会重新绘制。
下面的代码是一个简单的Jupiter示例,说明了要执行的操作:

import random
import networkx as nx
import matplotlib.pyplot as plt

while input():
    i = random.randint(5, 10)
    G = nx.complete_graph(i)
    nx.draw_networkx(G, with_labels=True)
    plt.show()
    print("Nodes data: ", G.nodes.data())
    print("Connected: ",list(nx.connected_components(G)))

在Jupiter中,运行此循环会在输出中产生一系列文本和图形图像:

Nodes data:  [(0, {}), (1, {}), (2, {}), (3, {}), (4, {}), (5, {}), (6, {}), (7, {}), (8, {}), (9, {})]
Connected:  [{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}]

Nodes data:  [(0, {}), (1, {}), (2, {}), (3, {}), (4, {})]
Connected:  [{0, 1, 2, 3, 4}]

等等......
是否可以在单个Jupiter单元格或其他Python GUI框架的窗口中重绘NetworkX + Matplotlib图形和附带的文本?
Jupiter对我来说不是绝对的要求,任何其他Python GUI也可以。
谢谢!

lsmd5eda

lsmd5eda1#

这绝对是可能的(假设我正确理解了您想要做什么)。我建议使用ipywidgets来处理GUI部分。
参见以下示例:

import networkx as nx
import matplotlib.pyplot as plt
import ipywidgets as widgets

N_nodes_widget=widgets.IntSlider(min=1,max=100,value=5,step=1,continuous_update=False) #simple integer slider

def graph_generation(N_nodes):
  G = nx.complete_graph(N_nodes)
  nx.draw_networkx(G, with_labels=True)
  print("Nodes data: ", G.nodes.data())
  print("Connected: ",list(nx.connected_components(G)))
  plt.show()
    
widgets.interact(graph_generation,N_nodes=N_nodes_widget); #interact function links slider to the graph generation function

编辑:

如果您希望保留图形的先前迭代,您可以将图形存储在列表中,并在每次用户与小工具交互时创建一个大小为(1,N_graphs)的新图形。有关图形的信息可以显示在子图的标题中。请参见以下示例:

import networkx as nx
import matplotlib.pyplot as plt
import ipywidgets as widgets

N_nodes_widget=widgets.IntSlider(min=1,max=30,value=5,step=1,continuous_update=False)
list_plots=[] #create empty list of graphs

def graph_generation(N_nodes):
  G = nx.complete_graph(N_nodes)
  list_plots.append(G)
  fig,axs=plt.subplots(nrows=1,ncols=len(list_plots)) #create figure with N_graphs subplots
  for i, ax in enumerate(fig.axes):
    nx.draw_networkx(G, with_labels=True,ax=ax)
    ax.set_title("Nodes data:\n "+str(G.nodes.data()) + "\nConnected:"+str(list(nx.connected_components(G))),fontsize=6) #use title to print graph info
  plt.tight_layout()
  plt.show()
    
widgets.interact(graph_generation,N_nodes=N_nodes_widget);

相关问题