我想绘制一个邻接矩阵,其中点的颜色与节点类一致。
如果存在x和y节点之间的边缘:
我有一个来自networkx的邻接矩阵(作为nx) 让我们说:
matrix = np.array([[1 0 0 0 0],[1 0 1 0 0],[1 1 0 1 0],[1 0 0 0 1],[1 0 1 0 0]])
我还有一个名为' network_num'对于每个节点将其分类为0或1或2。
节点4 - > 2
network_num = {0:0,1:0,2:1,3:1,4:2}
答案 0 :(得分:0)
我将假设"绘制邻接矩阵"你的意思是这样,绘制一个numpy矩阵,并通过"点"你的意思是矩阵中的元素。
在下面的代码中,我使用您的matrix
和network_num
创建我的drawn_matrix
(将进行绘图)。
在检查边缘是否存在后,我为您的"红色"分配drawn_matrix
0.25。 case,0.5为你的" blue"案例和1.0为您的"绿色"案例(更多关于以下这些数字)。
请注意,我没有标记任何边(matrix
中的0)为灰色。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
# Graph data
network_num = {0: 0, 1: 0, 2: 1, 3: 1, 4: 2}
matrix = np.array([[1, 0, 0, 0, 0],
[1, 0, 1, 0, 0],
[1, 1, 0, 1, 0],
[1, 0, 0, 0, 1],
[1, 0, 1, 0, 0]])
drawn_matrix = np.zeros((5, 5))
# Iterate 5x5 matrix
for row in range(5):
for col in range(5):
# check if edge exists
if matrix[row][col] == 1:
# red
if network_num[row] == 0 and network_num[col] == 0:
drawn_matrix[row][col] = 0.25
# blue
elif network_num[row] == 1 and network_num[col] == 1:
drawn_matrix[row][col] = 0.5
# green
elif network_num[row] == 2 and network_num[col] == 2:
drawn_matrix[row][col] = 1.0
# gray
else:
drawn_matrix[row][col] = 0.0
else:
drawn_matrix[row][col] = 0.0 # no edge is marked as gray
print("Matrix with color info:")
print(drawn_matrix)
这是输出(我将绘制的矩阵)。请注意,根据您的matrix
和network_num
,图中没有绿色。
Matrix with color info:
[[ 0.25 0. 0. 0. 0. ]
[ 0.25 0. 0. 0. 0. ]
[ 0. 0. 0. 0.5 0. ]
[ 0. 0. 0. 0. 0. ]
[ 0. 0. 0. 0. 0. ]]
现在的情节。在这里,我发现this anwser非常有帮助。
在代码中,我定义了一个自定义色彩映射表,其颜色如下:灰色,红色,蓝色和绿色。请注意,rvb
中的数值与我之前发布的代码中的值相匹配。
def make_colormap(seq):
"""Return a LinearSegmentedColormap
seq: a sequence of floats and RGB-tuples. The floats should be increasing
and in the interval (0,1).
"""
seq = [(None,) * 3, 0.0] + list(seq) + [1.0, (None,) * 3]
cdict = {'red': [], 'green': [], 'blue': []}
for i, item in enumerate(seq):
if isinstance(item, float):
r1, g1, b1 = seq[i - 1]
r2, g2, b2 = seq[i + 1]
cdict['red'].append([item, r1, r2])
cdict['green'].append([item, g1, g2])
cdict['blue'].append([item, b1, b2])
return mcolors.LinearSegmentedColormap('CustomMap', cdict)
c = mcolors.ColorConverter().to_rgb
rvb = make_colormap(
[c('gray'), c('red'), 0.25, c('red'), c('blue'), 0.5, c('blue'), c('green'), 0.75, c('green')])
plt.matshow(drawn_matrix, vmin=0.0, vmax=1.0, cmap=rvb)
plt.show()
最终邻接矩阵: