我对用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中的每个节点之间是否分别存在边缘链接?
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
基于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)
结果:
文件:
编辑:
最后一幅图像的完整示例代码
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中显示一棵树,但我不知道如何。该树表示已连接节点的图形,如下所示: 我应该说我有自己的树类: 我只想画那棵树。我该怎么做?