当前位置: 首页 > 知识库问答 >
问题:

如何使用networkx绘制图形网络,并询问Python中的父节点和子节点之间是否应该有连接?

太叔睿
2023-03-14

我对用Python制作网络图是完全陌生的。我了解到networkx库可以用于在Python中绘制网络图。

我有11个节点。Node1、Node2、...、Node11。我想将它们绘制在四个不同的级别。Node1在1级。Node2和Node3在2级。Node4到Node7在3级,Node8到Node11在4级。

我使用创建了一个非常简单的1级和2级之间的基本网络图

# Build a dataframe with 4 connections
df = pd.DataFrame({ 'from':['Node1',"Node1"], 'to':["Node2","Node3"]})
 
# Build your graph
G=nx.from_pandas_edgelist(df, 'from', 'to')
 
# Plot it
nx.draw(G, arrows = True, with_labels = True)
plt.show()

为了在级别2和级别3之间绘制,我想询问用户,节点2和节点3之间以及节点4、节点5、节点6和节点7之间是否存在边缘链接。此外,我想问用户,级别3和级别4中的每个节点之间是否分别存在边缘链接?

共有2个答案

邹华皓
2023-03-14

furas已经回答了我问题的前半部分。对于第二部分,我使用for-loop创建了两个列表,以确定两个特定节点之间是否存在链接,并相应地更新了列表。使用该列表,我创建了一个包含< code>From和< code>To列的dataframe,它们反映了从任何父节点到子节点的链接。

a = ["Node1","Node1"]
b = ["Node2","Node3"]

#Ask if you want link between nodes 2 and 3, with each of node 4 to 7
for i in range(2,4):
    for j in range(4,8):
        edge = input(f"Edge between {i} and {j}?")
        if edge == "Yes":
            a.append(f"Node{i}")
            b.append(f"Node{j}")

#Ask if you want link between nodes 4 and 7, with each of node 5 to 8
for i in range(4,8):
    for j in range(8,12):
        edge = input(f"Edge between {i} and {j}?")
        if edge == "Yes":
            a.append(f"Node{i}")
            b.append(f"Node{j}")

#Create a dataframe using the lists a and b
df = pd.DataFrame([])
df["From"] = a
df["To"] = b
df
荆树
2023-03-14

基于Stackoverflow上的其他问题:networkxadd_node特定位置

您可以使用绘制(..., pos=字典,...)在特定位置设置节点。

positions = {
    'Node1': (0, 0),
    'Node2': (1, 1),
    'Node3': (1, -1),
    'Node4': (2, 2),
    'Node5': (2, 0),
}  

draw(..., pos=positions, ...)

最小工作代码

import pandas as pd
import networkx as nx
from matplotlib import pyplot as plt

df = pd.DataFrame({
    'from': ['Node1', 'Node1', 'Node2', 'Node2'],
    'to': ['Node2', 'Node3', 'Node4', 'Node5']
})
 
G = nx.from_pandas_edgelist(df, 'from', 'to')
 
positions = {
    'Node1': (0, 0),
    'Node2': (1, 1),
    'Node3': (1, -1),
    'Node4': (2, 2),
    'Node5': (2, 0),
}  

nx.draw(G, pos=positions, arrows=True, with_labels=True)
plt.show()

结果:

基于Stackoverflow上的其他答案-您可以使用< code>node_shape来更改形状,就像在< code>matplotlib中一样。我发现只有正方形- node_shape='s' -使用< code>node_size=1000我可以改变所有正方形的大小,或者使用list/tuple < code > node _ size =(1000,1000,...)分别更改每个节点的大小

nx.draw(G, pos=positions, arrows=True, with_labels=True, node_shape='s', node_size=1000)

结果:

根据文档,我发现您可以单独绘制节点标签边缘,以便您可以为实验室使用不同的位置并将它们设置在节点上方。

nodes_positions = {
    'Node1': (0, 0),
    'Node2': (1, 1),
    'Node3': (1, -1),
    'Node4': (2, 2),
    'Node5': (2, 0),
}    

labels_positions = {
    'Node1': (0, 0.3),
    'Node2': (1, 1.3),
    'Node3': (1, -0.7),
    'Node4': (2, 2.3),
    'Node5': (2, 0.3),
}    

nx.draw_networkx_nodes(G, pos=nodes_positions, node_shape='s', node_size=1000)
nx.draw_networkx_labels(G, pos=labels_positions)
nx.draw_networkx_edges(G, pos=nodes_positions)

结果:

文件:

  • draw_networkx_nodes
  • draw_networkx_labels
  • draw_networkx_Edge

编辑:

最后一幅图像的完整示例代码

import pandas as pd
import networkx as nx
from matplotlib import pyplot as plt

#df = pd.DataFrame({
#    'from': ['Node1', 'Node1', 'Node2', 'Node2'],
#    'to': ['Node2', 'Node3', 'Node4', 'Node5']
#})

df = pd.DataFrame([
    # pairs (from, to)
    ('Node1', 'Node2'),
    ('Node1', 'Node3'),
    ('Node2', 'Node4'),
    ('Node2', 'Node5'),
], columns=['from', 'to'])
 
G = nx.from_pandas_edgelist(df, 'from', 'to')
 
nodes_positions = {
    'Node1': (0, 0),
    'Node2': (1, 1),
    'Node3': (1, -1),
    'Node4': (2, 2),
    'Node5': (2, 0),
}    

labels_positions = {
    'Node1': (0, 0.3),
    'Node2': (1, 1.3),
    'Node3': (1, -0.7),
    'Node4': (2, 2.3),
    'Node5': (2, 0.3),
}    

#nx.draw(G, pos=positions, arrows=True, with_labels=True, node_shape='s', node_size=1000)
nx.draw_networkx_nodes(G, pos=nodes_positions, node_shape='s', node_size=1000)
nx.draw_networkx_labels(G, pos=labels_positions)
nx.draw_networkx_edges(G, pos=nodes_positions)

plt.show()
 类似资料:
  • 我想使用Xpath提取父节点和子节点之间的vale。如何做到这一点? 如何将文本值输出为“要提取的值”?它不应该是“要提取密钥的值”“关键”应该被忽略。

  • 我有一个这样的结构` ...等等,在

  • 我需要将子元素复制到父元素中。 输入 期望输出 我尝试的内容(输出与输入保持相同): 我肯定会错过一些非常简单的事情。子元素与父元素具有相同的名称,这应该不是问题?

  • 如果我没弄错的话,树通常是一个列表,其中的元素按特定顺序排列。孩子们不在他们自己的子列表中,他们都在同一个列表中。 所以,我试图创建一个Tree类,其中包含TreeNodes(类)使用Tree类中的List。 我如何跟踪父母/孩子/叶子?如果父母“父母1”,有两个孩子“孩子A”和“孩子B”,我如何将他们联系在一起?

  • 我想从父节点复制到子节点。我真的不确定这是如何实现的。 我的源xml 我想得到输出为 我想要XSLT1.0中的解决方案。 我想将这些节点复制到子节点 谢谢。

  • 我想在Java GUI中显示一棵树,但我不知道如何。该树表示已连接节点的图形,如下所示: 我应该说我有自己的树类: 我只想画那棵树。我该怎么做?