我有关于图表的问题。我有30个节点(点)。我想构造一个邻接矩阵,使得每组十个节点都像三角形的顶点。因此,假设一组10个节点位于三角形ABC的顶点A,B和C.
两个顶点集应该只有10个边(基本上每个节点中的每个节点都连接到另一个节点)。让我们说A组和B组在组内有10条边。而第三个顶点集应该有11个边(每个节点10个边,一个节点连接两个节点,因此该组中有11个边)。可以说C上的那个有11个边缘。
所有这三个簇在它们之间都有一条边形成一个三角形。即A处的连接组,B处有一个边缘的B组和带有一个边缘的C和带有一个边缘的A的C。
稍后我会在B和C之间再添加一条边。在附图中以虚线表示。顶点处的点可以是圆形或任何其他形式,只要它们代表一个组。
如何为这样的事物创建邻接矩阵。我实际上知道如何为这样的矩阵创建邻接矩阵,因为它只是二元对称矩阵(无向图),但问题是当我尝试绘制该邻接矩阵时,它会使来自其他组的一个节点更靠近该组该节点连接的是哪个。因此,假设我通过连接两者之间的边缘,将顶点A处的一个节点与顶点B处的一个节点连接起来。该边缘将描绘三角形的AB侧。但是当我使用networkx描绘它时,从这两个不同组连接的那两个节点最终会更接近并看起来像一个组的一部分。如何将其作为单独的组保留。 ?
请注意我正在使用python的networkx lib,它有助于绘制邻接矩阵。
编辑:
我试图在灵感之后使用的代码:
G=nx.Graph()
# Creating three separate groups of nodes (10 nodes each)
node_clusters = [range(1,11), range(11,21) , range(21,31)]
# Adding edges between each set of nodes in each group.
for x in node_clusters:
for y in x:
if(y!=x[-1]):
G.add_edge(y,y+1,len=2)
else:
G.add_edge(y,x[0],len=2)
# Adding three inter group edges separately:
for x in range(len(node_clusters)):
if(x<2):
G.add_edge(node_clusters[x][-1],node_clusters[x+1][0],len=8)
else:
G.add_edge(node_clusters[x][-1],node_clusters[0][0],len=8)
nx.draw_graphviz(G, prog='neato')
给出以下错误:
--> 260 '(not available for Python3)')
261 if root is not None:
262 args+="-Groot=%s"%root
ImportError: ('requires pygraphviz ', 'http://networkx.lanl.gov/pygraphviz ', '(not available for Python3)')
我的python版本不是3,它的2.我正在使用anaconda发行版
EDIT2:
我使用了Marius的代码,但使用了以下内容来绘制:
graph_pos=nx.spring_layout(G,k=0.20,iterations=50)
nx.draw_networkx(G,graph_pos)
它彻底摧毁了整个图表。并显示:
答案 0 :(得分:2)
我能够通过黑客攻击来快速获得一些东西,所有你需要做的就是把代表每个边缘的元组放在一起,你也可以在边缘上设置一些任意长度来得到你想要的合适的近似值布局:
import networkx
import string
all_nodes = string.ascii_letters[:30]
a_nodes = all_nodes[:10]
b_nodes = all_nodes[10:20]
c_nodes = all_nodes[20:]
all_edges = []
for node_set in [a_nodes, b_nodes, c_nodes]:
# Link each node to the next
for i, node in enumerate(node_set[:-1]):
all_edges.append((node, node_set[i + 1], 2))
# Finish off the circle
all_edges.append((node_set[0], node_set[-1], 2))
joins = [(a_nodes[0], b_nodes[0], 8), (b_nodes[-1], c_nodes[0], 8), (c_nodes[-1], a_nodes[-1], 8)]
all_edges += joins
# One extra edge for C:
all_edges.append((c_nodes[0], c_nodes[5], 5))
G = networkx.Graph()
for edge in all_edges:
G.add_edge(edge[0], edge[1], len=edge[2])
networkx.draw_graphviz(G, prog='neato')
如果您想要作为邻接矩阵导出,请尝试networkx.to_numpy_matrix(G)
之类的内容。