Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 使用鼠标单击、networkX、python 2.7删除节点_Python 2.7_Matplotlib_Networkx_Interactive - Fatal编程技术网

Python 2.7 使用鼠标单击、networkX、python 2.7删除节点

Python 2.7 使用鼠标单击、networkX、python 2.7删除节点,python-2.7,matplotlib,networkx,interactive,Python 2.7,Matplotlib,Networkx,Interactive,我已经用Python2.7和networkX编写了一个程序,它用黑白节点绘制了一棵树。下面是一个简单的例子: import networkx as nx import matplotlib.pyplot as plt import numpy T = nx.Graph() ### Nodes white, black = [1, 4, 5, 6, 7], [2, 3] allNodes = white+black for node in allNodes: T.add_node(

我已经用Python2.7和networkX编写了一个程序,它用黑白节点绘制了一棵树。下面是一个简单的例子:

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

T = nx.Graph()

### Nodes
white, black = [1, 4, 5, 6, 7], [2, 3]
allNodes = white+black

for node in allNodes:      T.add_node(node)

### Edges
T.add_edge(1, 2)
T.add_edge(1, 3)
T.add_edge(2, 4)
T.add_edge(2, 5)
T.add_edge(3, 6)
T.add_edge(3, 7)

### Positions of the nodes
pos={}
pos[1]=numpy.array([ 0,0])
pos[2]=numpy.array([-2,1])
pos[3]=numpy.array([ 2,1])
pos[4]=numpy.array([-3,2])
pos[5]=numpy.array([-1,2])
pos[6]=numpy.array([ 1,2])
pos[7]=numpy.array([ 3,2])

### Draw nodes and edges
nx.draw_networkx_nodes(T, pos, nodelist=black, node_color='k',     node_size=400,     alpha=0.8)
nx.draw_networkx_nodes(T, pos, nodelist=white, node_color='w',     node_size=400,     alpha=0.8)
nx.draw_networkx_edges(T,pos,width=1.0, alpha=0.5)

plt.axis('off')     # Remove the axes
plt.show()          # Show the tree
代码创建了一个窗口,其中有一个包含7个节点和6条边的小树。现在,当我用鼠标单击节点时,我希望节点消失。我该怎么做

后来我的计划是,两个玩家轮流移除叶子或根的颜色(黑色和白色)。即玩家1只能移除黑叶子或黑根,玩家2只能移除白叶子和白根

我发现这些链接可能会有所帮助,但无法使其发挥作用:


有谁知道如何做到这一点或有什么建议吗?

我成功做到了!我不得不从绘图中保存“fig”和“ax”(我认为是fig和axes?)。然后我可以将一个方法/函数(我称之为onClick)连接到对鼠标点击做出反应的图形(“按钮按下事件”)

如何从绘图中获取“fig”和“ax”,并连接函数/方法:

fig, ax = plt.subplots()
fig.canvas.mpl_connect('button_press_event', onClick)
下面是从图形和绘图中删除节点的方法

def onClick(event):
    (x,y)   = (event.xdata, event.ydata)

    for i in allNodes:            
        node = pos[i]
        distance = pow(x-node[0],2)+pow(y-node[1],2)
        if distance < 0.1:
            T.remove_node(i)
            if i in black: black.remove(i)
            if i in white: white.remove(i)
            allNodes.remove(i)
            refreshGraph()    
def onClick(事件):
(x,y)=(event.xdata,event.ydata)
对于所有节点中的i:
节点=位置[i]
距离=功率(x节点[0],2)+功率(y节点[1],2)
如果距离<0.1:
T.移除节点(i)
如果i为黑色:黑色。删除(i)
如果i为白色:白色。删除(i)
所有节点。删除(i)
刷新图()
整个代码:

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

def refreshGraph():
    plt.clf()
    nx.draw_networkx_nodes(T, pos, nodelist=black, node_color='k', node_size=400, alpha=0.8)
    nx.draw_networkx_nodes(T, pos, nodelist=white, node_color='w', node_size=400, alpha=0.8)
    nx.draw_networkx_edges(T,pos,width=1.0, alpha=0.5)
    plt.axis('off')
    plt.axis((-4,4,-1,3))
    fig.patch.set_facecolor('white')
    plt.show()

def onClick(event):
    (x,y)   = (event.xdata, event.ydata)

    for i in allNodes:            
        node = pos[i]
        distance = pow(x-node[0],2)+pow(y-node[1],2)
        if distance < 0.1:
            T.remove_node(i)
            if i in black: black.remove(i)
            if i in white: white.remove(i)
            allNodes.remove(i)
            refreshGraph()

fig, ax = plt.subplots()
fig.canvas.mpl_connect('button_press_event', onClick)

T = nx.Graph()

### Nodes
white, black = [1, 4, 5, 6, 7], [2, 3]
allNodes = white+black

for node in allNodes:      T.add_node(node)

### Edges
T.add_edge(1, 2)
T.add_edge(1, 3)
T.add_edge(2, 4)
T.add_edge(2, 5)
T.add_edge(3, 6)
T.add_edge(3, 7)

### Positions of the nodes
pos={}
pos[1]=numpy.array([ 0,0])
pos[2]=numpy.array([-2,1])
pos[3]=numpy.array([ 2,1])
pos[4]=numpy.array([-3,2])
pos[5]=numpy.array([-1,2])
pos[6]=numpy.array([ 1,2])
pos[7]=numpy.array([ 3,2])

### Draw nodes and edges
refreshGraph()
将networkx导入为nx
将matplotlib.pyplot作为plt导入
进口numpy
将numpy作为np导入
进口派拉布
def refreshGraph():
plt.clf()
nx.draw_networkx_节点(T,pos,nodelist=black,node_color='k',node_size=400,alpha=0.8)
nx.绘制网络x_节点(T,位置,节点列表=白色,节点颜色='w',节点大小=400,alpha=0.8)
nx.绘制网络x_边(T,位置,宽度=1.0,α=0.5)
打印轴(“关闭”)
plt.轴(-4,4,-1,3))
图贴片设置面颜色(“白色”)
plt.show()
def onClick(事件):
(x,y)=(event.xdata,event.ydata)
对于所有节点中的i:
节点=位置[i]
距离=功率(x节点[0],2)+功率(y节点[1],2)
如果距离<0.1:
T.移除节点(i)
如果i为黑色:黑色。删除(i)
如果i为白色:白色。删除(i)
所有节点。删除(i)
刷新图()
图,ax=plt.子批次()
图canvas.mpl\u connect('button\u press\u event',onClick)
T=nx.Graph()
###节点
白色,黑色=[1,4,5,6,7],[2,3]
所有节点=白色+黑色
对于所有节点中的节点:T.add_节点(节点)
###边缘
T.add_边(1,2)
T.add_边(1,3)
T.add_边缘(2,4)
T.add_边缘(2,5)
T.add_边缘(3,6)
T.add_边缘(3,7)
###节点的位置
pos={}
位置[1]=整数数组([0,0])
位置[2]=numpy.数组([-2,1])
位置[3]=整数数组([2,1])
位置[4]=numpy.数组([-3,2])
位置[5]=numpy.数组([-1,2])
位置[6]=整数数组([1,2])
位置[7]=整数数组([3,2])
###绘制节点和边
刷新图()

我一直在寻找如何通过鼠标单击构建networkx图形的示例,并被重定向到这里。因此,我重构了一段代码,使其变得更短、修复了bug并进行了优化。我正在使用Python 3.8和Networkx 2.5

import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
import scipy.spatial

def onClick(event, G):
    if event.inaxes is not None and len(G.nodes()) > 0:
        nodelist, coords = zip(*nx.get_node_attributes(G, 'pos').items())
        kdtree = scipy.spatial.KDTree(coords)
        xy = np.array([event.xdata, event.ydata])
        close_idx = kdtree.query_ball_point(xy, np.sqrt(0.1))
        for i in close_idx:
            G.remove_node(nodelist[i])
        refreshGraph(G)

def refreshGraph(G):
    plt.clf()
    nx.draw_networkx_nodes(G, pos = nx.get_node_attributes(G, 'pos'), node_color='k', node_size=400, alpha=0.8)
    nx.draw_networkx_edges(G, pos = nx.get_node_attributes(G, 'pos'), width=1.0, alpha=0.5)
    plt.axis('off')
    plt.axis((-4, 4, -1, 3))
    fig.patch.set_facecolor('white')
    plt.show()

#Parameters of graph
nodes = np.array(['A','B','C','D','E','F','G'])
edges = np.array([['A', 'B'], ['A', 'C'], ['B', 'D'], ['B', 'E'], ['C', 'F'], ['C', 'G']])
pos = np.array([[ 0,0], [-2,1], [ 2,1], [-3,2], [-1,2], [ 1,2], [ 3,2]])

G = nx.Graph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)
nx.set_node_attributes(G, dict(zip(G.nodes(), pos)), 'pos')

fig, ax = plt.subplots()
fig.canvas.mpl_connect('button_press_event', lambda event, G=G: onClick(event, G))
refreshGraph(G)
以下是此处改进的事项列表:

  • 节点
    位置
    可以使用
    numpy
    数组一次移动设置
  • 不使用任何颜色使其具有MWE
  • 图外无需全局存储节点
    pos
    是图形本身的一个属性
  • graph是
    onClick
    refreshGraph
    的参数,因此无需全局变量即可使这些函数工作
  • 在的帮助下,可以优化接近节点的查找,如果存在大量节点,则不会出现延迟
  • 修复了在图外单击图时计算鼠标位置的错误
  • 支持删除单击半径内的多个节点

恐怕我帮不上什么忙,但要澄清你的问题:你想让它们从情节中消失吗?或者从图表中删除?从绘图中,它们也可能从树上消失。