在Python中绘制关系矩阵
我有一个用Python和wxpython做的界面,用户可以在里面填一个矩阵(0和1),然后程序会帮他们画出这个矩阵的图。程序会先创建一个numpy矩阵,然后用这个矩阵生成一个networkx图,最后用matplotlib.pylab来显示这个图。
numpy是必须的,因为程序还会做其他一些事情,比如获取传递闭包、反身闭包和对称闭包……至于networkx,如果你有更好的推荐来画矩阵的工具,我可以考虑换掉它。至于matplotlib,我不喜欢它,如果你知道其他显示图的方法,请告诉我。
matplotlib是我遇到问题的地方。当用户点击画图按钮时,程序会读取矩阵,生成图,然后matplotlib会在一个新窗口中显示这个图(默认情况下)。如果用户回到原来的窗口,想要画一个不同的矩阵,但没有先关闭matplotlib窗口,程序就会崩溃。
而且我觉得“箭头”表示关系的方式看起来不太好看。
我需要一个更好的方法来画我的矩阵,或者至少有个办法强制关闭matplotlib窗口。我试过用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
2 个回答
我这里用的是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坐标。
可以仔细看看这里的例子:http://networkx.lanl.gov/gallery.html
看起来你主要的问题是 wx 处理 matplotlib 窗口的方式。其实可以把 Matplotlib 图嵌入到你的 wx 窗口里。这里有个例子:
http://wiki.scipy.org/Matplotlib_figure_in_a_wx_panel (已更新)
这有点复杂。基本上,你需要复制代码,然后替换掉 "DemoPlotPanel.draw()" 这个方法。你还需要修改你的代码,指定要绘制的坐标轴。具体的内容可以在 networkx 的文档里找到: