gpt4 book ai didi

python - 如何通过 networkx 制作可点击的图表?

转载 作者:太空狗 更新时间:2023-10-30 01:23:27 25 4
gpt4 key购买 nike

我正在尝试在 python 中生成可点击的图形图像。我一开始直接调用graphviz,然后发现networkx http://networkx.lanl.gov .

我希望我的程序获取有关在用户单击图形的 (x,y) 坐标处显示哪个节点的信息。我想我可以使用打开并显示图形的 pyplot 窗口,使用鼠标单击时的 (x,y) 坐标,但我需要某种图像映射来知道哪个节点已在该坐标处可视化!

你能告诉我是否/如何完成吗?

最佳答案

感谢 http://groups.google.com/group/networkx-discuss 的好心人,我解决了这个问题( http://groups.google.com/group/networkx-discuss/browse_thread/thread/aac227e1fb2a4719 ):

以下(部分)代码在 Tkinter 中运行,允许创建包含 networkx 图的 matplotlib 窗口(顺便说一句,非阻塞),并在您单击给定节点时执行过程 visitNode()。

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

class AnnoteFinder: # thanks to http://www.scipy.org/Cookbook/Matplotlib/Interactive_Plotting
"""
callback for matplotlib to visit a node (display an annotation) when points are clicked on. The
point which is closest to the click and within xtol and ytol is identified.
"""
def __init__(self, xdata, ydata, annotes, axis=None, xtol=None, ytol=None):
self.data = zip(xdata, ydata, annotes)
if xtol is None: xtol = ((max(xdata) - min(xdata))/float(len(xdata)))/2
if ytol is None: ytol = ((max(ydata) - min(ydata))/float(len(ydata)))/2
self.xtol = xtol
self.ytol = ytol
if axis is None: axis = pylab.gca()
self.axis= axis
self.drawnAnnotations = {}
self.links = []

def __call__(self, event):
if event.inaxes:
clickX = event.xdata
clickY = event.ydata
if self.axis is None or self.axis==event.inaxes:
annotes = []
for x,y,a in self.data:
if clickX-self.xtol < x < clickX+self.xtol and clickY-self.ytol < y < clickY+self.ytol :
dx,dy=x-clickX,y-clickY
annotes.append((dx*dx+dy*dy,x,y, a) )
if annotes:
annotes.sort() # to select the nearest node
distance, x, y, annote = annotes[0]
self.visitNode(annote)

def visitNode(self, annote): # Visit the selected node
# do something with the annote value
print "visitNode", annote

fig = plt.figure() ax = fig.add_subplot(111) ax.set_title('select nodes to navigate there')

G=nx.MultiDiGraph() # directed graph G = nx.wheel_graph(5)

pos=nx.spring_layout(G) # the layout gives us the nodes position x,y,annotes=[],[],[] for key in pos:
d=pos[key]
annotes.append(key)
x.append(d[0])
y.append(d[1]) nx.draw(G,pos,font_size=8)

af = AnnoteFinder(x,y, annotes) fig.canvas.mpl_connect('button_press_event', af)

plt.show()

关于python - 如何通过 networkx 制作可点击的图表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12894985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com