在python中绘制关系矩阵

时间:2011-03-24 16:01:08

标签: python wxpython numpy matplotlib networkx

我有一个使用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

2 个答案:

答案 0 :(得分:2)

在我看来,你的主要抱怨是wx处理matplotlib窗口的方式。可以在您的wx窗口中嵌入Matplotlib图形。这是一个例子:

http://wiki.scipy.org/Matplotlib_figure_in_a_wx_panel(已更新)

有点复杂。基本上,您应该复制代码并替换“DemoPlotPanel.draw()”方法。您需要修改代码以指定要绘制的轴。它隐藏在networkx文档中:

http://networkx.lanl.gov/reference/drawing.html

答案 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坐标。

仔细查看以下示例:http://networkx.lanl.gov/gallery.html