Python NetworkX MatplotLib有向图查找路径大于2的所有树

Python NetworkX MatplotLib有向图查找路径大于2的所有树,python,tree,matplotlib,networkx,Python,Tree,Matplotlib,Networkx,我在csv文件中有类似于以下内容的数据: a,b,50 b,c,60 b,e,25 e,f,20 z,n,10 x,m,25 v,p,15 我试图使用NetworkX和Matplotlib来绘制数据,但是我的csv有很多行/节点,无法从图中看出任何意义 下面是我用来绘制的代码的重要部分: import networkx as nx import matplotlib.pyplot as plt G = nx.DiGraph() f = open("test_data.csv", "r")

我在csv文件中有类似于以下内容的数据:

a,b,50
b,c,60
b,e,25
e,f,20
z,n,10
x,m,25
v,p,15
我试图使用NetworkX和Matplotlib来绘制数据,但是我的csv有很多行/节点,无法从图中看出任何意义

下面是我用来绘制的代码的重要部分:

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()

f = open("test_data.csv", "r")

for line in f:
    node1, node2, weight1 = line.split(",")
    G.add_edge(node1, node2)

nx.draw(G)
plt.show()
对于此示例数据,我以下图结束:


从这个小样本很容易看出,一些节点([z,n],[x,m][v,p])是只有两个节点的树。我想检测并消除这些,因为我只关心大于两个节点的树。我相信有很多方法可以做到,有人能提出建议或给出一个例子吗?

对于您的具体情况,尝试迭代边缘列表,并查询图形目标节点本身是否有邻居(例如,目标是另一个边缘中的源)。如果目标不包含其他邻居,则满足您的条件

代码:

G应该只包含边(a,b),(b,e):(参见下面的ipython输出)


祝你好运

我不知道nxapi,所以我不会使用G有向图对象来解决这个问题,而只使用dict

将networkx导入为nx
将matplotlib.pyplot作为plt导入
G=nx.DiGraph()
f=打开(“test_data.csv”、“r”)
按节点分组={}
对于f中的行:
节点1、节点2、权重1=行分割(“,”)
如果节点1不在按节点分组的分组中,节点2不在按节点分组的分组中:
bloc=[node1,node2]
按节点[node1]分组=分组
blocs\u by\u节点[node2]=bloc
elif node1不在按节点分组的分组中,node2在按节点分组的分组中:
bloc=按节点[node2]分组
bloc.append(节点1)
按节点[node1]分组=分组
elif node1在按节点分组的分组中,node2不在按节点分组的分组中:
bloc=按节点[node1]分组
bloc.append(node2)
blocs\u by\u节点[node2]=bloc
elif blocs_by_节点[node1]不是blocs_by_节点[node2]:
bloc=按节点[node1]分组
对于块中的节点,按节点[node2]:
bloc.append(节点)
blocs\u by\u node[节点]=bloc
f、 关闭()
f=打开(“test_data.csv”、“r”)
对于f中的行:
节点1、节点2、权重1=行分割(“,”)
如果len(按节点[node1]分组)大于2:
G.添加_边(节点1、节点2)
f、 关闭()
nx.绘图(G)
plt.show()
我读了两次文件,您可以通过将值存储在列表中重构代码以读取一次

顺便说一下,我希望示例的解决方案包含:

[('a', 'b'), ('b', 'c'), ('b', 'e'), ('e', 'f')]

您可以使用networkX bellman_ford方法查找长度超过给定最小值的路径。 为此,您需要一个权重设置为-1的有向图(或图)G

以下代码基于

将networkx导入为nx
将matplotlib.pyplot作为plt导入
数据=('a','b',50),('b','c',60),('b','e',25),
('e','f',20),('z','n',10),('x','m',25),
('v','p',15))
G=nx.DiGraph()
对于节点1、节点2、数据中的权重1:
G.添加边(节点1、节点2、权重=-1)
最小长度=2
F=nx.DiGraph()#过滤图
#与bellman_ford检查所有边缘
对于u、v和G边()
VAL,距离=nx.贝尔曼·福特(G,u)
如果最小距离(distance.values())<最小长度:
对于vals.items()中的u、v:
如果v:
F.添加_边(v,u)
nx.绘图(F)
plt.show()
这将生成符合要求的唯一图形:

请注意,这是确定具有最长路径(以距离为单位)的图的一般方法的简化。因此,如果您创建包含权重的图表,您可以在更改权重符号后应用bellman ford:

G = nx.DiGraph()
for node1, node2, weight1 in data:
    G.add_edge(node1, node2, weight=weight1)

min_lenght = 100  

H = nx.DiGraph(G)  # intermediate graph
# change sign of weights
for u, v in H.edges():
    H[u][v]['weight'] *= -1

# check all edges with bellman_ford
for u, v in G.edges():
    vals, distances = nx.bellman_ford(H, u)
    if min(distances.values()) < - min_lenght:
        #--- whatever ----
G=nx.DiGraph()
对于节点1、节点2、数据中的权重1:
G.添加边(节点1、节点2、权重=权重1)
最小长度=100
H=nx.有向图(G)#中间图
#改变重量的符号
对于u,v在H.边()中:
H[u][v][‘重量’]*=-1
#与bellman_ford检查所有边缘
对于u、v和G边()
VAL,距离=nx.贝尔曼·福特(H,u)
如果最小距离(distance.values())<最小长度:
#---随便----

每个人都给出了一些很好的答案,但出于我的特殊需要@joaquin的答案是最好的。谢谢你指出这是贝尔曼·福特车型,我可以看更多。
[('a', 'b'), ('b', 'c'), ('b', 'e'), ('e', 'f')]
import networkx as nx
import matplotlib.pyplot as plt

data = (('a','b',50), ('b','c',60), ('b','e',25),
        ('e','f',20), ('z','n',10), ('x','m',25),
        ('v','p',15))

G = nx.DiGraph()
for node1, node2, weight1 in data:
    G.add_edge(node1, node2, weight=-1)

min_lenght = 2
F = nx.DiGraph()   #filtered graphs

# check all edges with bellman_ford
for u, v in G.edges():
    vals, distances = nx.bellman_ford(G, u)
    if min(distances.values()) < - min_lenght:
        for u, v in vals.items():
            if v:
                F.add_edge(v, u)

nx.draw(F)
plt.show()
G = nx.DiGraph()
for node1, node2, weight1 in data:
    G.add_edge(node1, node2, weight=weight1)

min_lenght = 100  

H = nx.DiGraph(G)  # intermediate graph
# change sign of weights
for u, v in H.edges():
    H[u][v]['weight'] *= -1

# check all edges with bellman_ford
for u, v in G.edges():
    vals, distances = nx.bellman_ford(H, u)
    if min(distances.values()) < - min_lenght:
        #--- whatever ----