python - 根据节点类用彩色节点绘制邻接矩阵

时间:2017-01-18 20:03:16

标签: python matplotlib networkx

我想绘制一个邻接矩阵,其中点的颜色与节点类一致。

如果存在x和y节点之间的边缘:

  • 如果两个节点都属于类0 =>颜色红色
  • 如果两个节点都属于1类=>颜色蓝色
  • 如果两个节点都属于class 2 =>颜色绿色
  • else =>颜色灰色

我有一个来自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。

  • 节点0 - > 0
  • 节点1 - > 0
  • 节点2 - > 1
  • 节点3 - > 1
  • 节点4 - > 2

    network_num = {0:0,1:0,2:1,3:1,4:2}

1 个答案:

答案 0 :(得分:0)

我将假设"绘制邻接矩阵"你的意思是这样,绘制一个numpy矩阵,并通过"点"你的意思是矩阵中的元素。

在下面的代码中,我使用您的matrixnetwork_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)

这是输出(我将绘制的矩阵)。请注意,根据您的matrixnetwork_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()

最终邻接矩阵:

enter image description here