我有一个使用wxpython的python接口,允许用户填写矩阵(0/1),然后为它们绘制图形。程序创建一个numpy矩阵,然后从该矩阵中生成一个networkx图,然后使用matplotlib.pylab显示该图。
numpy是必须的,因为程序还做其他事情,比如获得传递性,反身性和对称性闭包......至于networkx我可以使用别的东西,如果你推荐其他更好的图表矩阵,以及matplotlib ,我讨厌它,如果您知道任何其他显示图表的方式,请咨询。matplotlib是我的问题的根源,当用户点击图形按钮时,我的程序读取矩阵,制作图形,matplotlib在新窗口中显示(默认情况下)。现在,如果用户返回到原始窗口并在不先关闭matplotlib窗口的情况下绘制不同的矩阵,程序就会崩溃。
在我看来,绘制关系“箭头”的方式也没有吸引力。
我需要一种更好的方式来绘制我的矩阵图形,或者至少作为强制关闭myplotlib窗口的方法,我尝试了plt.close()但是没有用,窗口将保持打开状态,两个窗口都将说(没有回应),我必须结束进程。
这是相关代码的一部分:
import numpy as np
import networkx as nx
import matplotlib.pylab as plt
... ... ...
def graph(values)
plt.close() #with or without this it does not work
matrix = np.matrix(values)
graph = nx.DiGraph(matrix)
nx.draw(graph)
plt.show()
return
答案 0 :(得分:2)
在我看来,你的主要抱怨是wx处理matplotlib窗口的方式。可以在您的wx窗口中嵌入Matplotlib图形。这是一个例子:
http://wiki.scipy.org/Matplotlib_figure_in_a_wx_panel(已更新)
有点复杂。基本上,您应该复制代码并替换“DemoPlotPanel.draw()”方法。您需要修改代码以指定要绘制的轴。它隐藏在networkx文档中:
答案 1 :(得分:0)
我只是使用Networkx文档的示例:
try:
import matplotlib.pyplot as plt
except:
raise
import networkx as nx
G=nx.star_graph(20)
pos=nx.spring_layout(G)
nx.draw(G,pos)
plt.show() # display
所以你的plt.close()语句在开始时没有意义,你应该删除它。你还应该计算你的节点的坐标,句子pos = nx.spring_layout(G)这样做。你调用一个特定的布局算法并提供你的图形G,你得到一个字典,以换取每个节点的x和y坐标。