Визуализация социальной сети с назначением цветов узлам - PullRequest
0 голосов
/ 10 января 2019

Я хочу визуализировать социальную сеть с узлами и ребрами, с цветами узлов, представляющими значения атрибутов . Было бы хорошо, если бы я мог сделать это с помощью инструментов в Python (например, networkx ), но я также открыт для других инструментов (таких как Gephi , graph-tools ) Узлы и ребра, которые у меня есть в моей социальной сети, имеют форму массивов. Я хочу, чтобы узлы этой визуализации были окрашены в соответствии со значениями атрибутов.

Каждая строка в массиве узлов указывает на пользователя. Каждый столбец в массиве узлов указывает на атрибут. Значения в каждом столбце массива узлов указывают на значения атрибутов. Вот пример массива узлов с 10 пользователями и 3 атрибутами (с именами [Att1, Att2, Att3].

Nodes = np.array([[1,2,4],[1,3,1],[2,2,1],[1,1,2],
              [1,2,2],[2,1,4],[1,2,1],[2,0,1],
              [2,2,4],[1,0,4]])

Аналогично, массив ребер (матрица смежности) - это квадратный массив с размером число узлов * количество узлов. Значение 1 в матрице смежности указывает на наличие ребра между двумя узлами, а значение 0 указывает на отсутствие ребра. Вот пример массива ребер.

Edges = np.random.randint(2, size=(10,10))

Допустим, я хочу, чтобы узлы были окрашены в соответствии со значениями атрибутов, приведенными в среднем столбце Nodes (т. Е. Attribute_Value = Nodes[:,1] = [2, 3, 2, 1, 2, 1, 2, 0, 2, 0]). Существует четыре уникальных значения атрибутов [0,1,2,3], поэтому я хотел бы иметь четыре разных цвета для узлы. В моем реальном графике у меня есть еще много уникальных значений для атрибутов. Кроме того, у меня есть десятки тысяч узлов, поэтому я хотел бы иметь возможность регулировать размеры (радиусы) узлов в моем графике.

После моего предыдущего поста я попробовал это:

import networkx as nx
G = nx.from_numpy_array(Edges)
nx.draw(G, with_labels=True)

Но результаты приведенного выше фрагмента кода не позволяют мне выбирать цвета в соответствии со значениями атрибута. Также мне нужно будет настроить размеры узлов. Как я могу визуализировать социальные графики описанным способом?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Networkx позволяет визуализировать графики и указывать размеры и цвета узлов. Например:

import networkx as nx
import matplotlib.pyplot as plt

G = nx.barabasi_albert_graph(20, 2)
node_colors = [x for x in range(20)]
node_sizes = [50 * x for x in range(20)]
cmap = plt.cm.jet
nx.draw_networkx(G,
                 with_labels=True,
                 labels={node : 'some text {}'.format(node) for node in G.nodes()},
                 node_color=node_colors,
                 node_size=node_sizes,
                 cmap=cmap)
plt.show()
  • метки - это массив меток (согласно порядку G.nodes ())
  • node_sizes - это массив целых чисел, определяющих размер каждого узла
  • node_colors - это массив чисел, определяющих цвет каждого узла
  • cmap - сопоставляет каждое число определенному цвету

Это приводит к: enter image description here

Чтобы полностью понять, как работает рисунок Networkx, я предлагаю прочитать документацию .

Лично для изучения и визуализации конкретного экземпляра графа я предпочитаю сохранить график networkx в файл и загрузить его с gephi . Если вам нужен автоматизированный процесс для многих экземпляров графов, возможно, networkxs будет лучше.

Если вы выберете Gephi, просто загрузите график и поиграйте с графическим интерфейсом, это довольно очевидно.

0 голосов
/ 10 января 2019

networkx.draw принимает списки для node_color и node_size, которые должны быть равны количеству узлов. Поэтому вам просто нужно сопоставить свои уникальные атрибуты с некоторыми цветами и создать эти списки. Если у вас много разных атрибутов, вы захотите сделать это сопоставление автоматически. Ниже я обрисую 2 варианта, один из которых использует цветовой цикл matplotlib, а другой просто назначает случайные цвета уникальным атрибутам.

import numpy as np
import matplotlib.pyplot as plt
import networkx as nx

Nodes = np.array([[1,2,4],
                  [1,3,1],
                  [2,2,1],
                  [1,1,2],
                  [1,2,2],
                  [2,1,4],
                  [1,2,1],
                  [2,0,1],
                  [2,2,4],
                  [1,0,4]])
Edges = np.random.randint(2, size=(10,10))
attribute_values = Nodes[:,1]

# make a color mapping from node attribute to color

# option 1: using the matplotlib color cycle;
# however, you may run out of colors if there are many different unique attributes
color_cycle = plt.rcParams['axes.prop_cycle'].by_key()['color']
attribute_to_color = dict()
for ii, attribute in enumerate(np.unique(attribute_values)):
    attribute_to_color[attribute] = color_cycle[ii]

# option 2: assign random colors
attribute_to_color = dict()
for ii, attribute in enumerate(np.unique(attribute_values)):
    attribute_to_color[attribute] = np.random.rand(3)

node_color = [attribute_to_color[attribute] for attribute in attribute_values]

# adjust node sizes according to some other attribute
node_size = Nodes[:, 2] * 100

G = nx.from_numpy_matrix(Edges)
nx.draw(G, node_color=node_color, node_size=node_size, with_labels=True)
plt.show()
...