1

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

2 回答 2

2

It seems to me like your main complaint is in the way that wx handles the matplotlib windows. It is possible to embed the Matplotlib figure in your wx window. Here's an example:

http://wiki.scipy.org/Matplotlib_figure_in_a_wx_panel (updated)

It gets a bit complicated. Basically, you should copy the code and replace the "DemoPlotPanel.draw()" method. You'll need to modify your code to specify the axis to draw on. It's buried in the networkx documentation here:

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

于 2011-04-17T01:18:51.703 回答
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

于 2011-04-15T17:08:34.773 回答