Как назначить определенный настроенный цвет узла для категории для визуализации с помощью networkx? - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть набор данных pandas, в котором есть столбец для группы, которой он назначен.Но я хочу настроить цвет узла.Например, для группы 0 узлы имеют красный цвет, для группы 1 - синий.Вот то, что я попробовал, основываясь на моих исследованиях, но по какой-то причине это не совсем соответствует группировке (должно быть только 2 цвета на основе групп), и я не могу редактировать цвета.

Этомой набор данных сохранен в файле sample.csv

ID|Parent|Group|
1 |   5  |  0  |
2 |   5  |  0  |
3 |   4  |  1  |
4 |   5  |  1  |
5 |   3  |  0  |

sample= pd.read_csv('sample.csv', encoding='cp1252')
G=nx.from_pandas_edgelist(sample, 'ID', 'Parent', create_using=nx.DiGraph())

carac=sample.set_index('ID')
carac=sample.reindex(G.nodes())
carac['Group']=pd.Categorical(carac['Group'])
carac['Group'].cat.codes

plt.figure(2,figsize=(5,5)) 
nx.draw(G, node_color=carac['Group'].cat.codes, cmap=plt.cm.Set1, node_size=150)

Результат

enter image description here

Обновление: я тоже пробовал это, ноэто также не следовало за группировкой цветов

# Build your graph
G=nx.from_pandas_edgelist(sample, 'ID', 'Parent', ['Group'], create_using=nx.DiGraph())
G.nodes()

colors = []

for node in G:
    if node in (sample["Group"] == 0):
        colors.append("red")
    elif node in (sample["Group"]== 1): 
        colors.append("blue")
nx.draw(G, with_labels=False, node_size=150, node_color=colors)

enter image description here

1 Ответ

1 голос
/ 27 апреля 2019

node_color используется не для групп узлов, а для каждого узла.Вы должны добавить к colors цвет каждого узла на вашем графике:

node_color (color string, or array of floats, (default=’#1f78b4’)) – Node color. Can be a single color format string, or a sequence of colors with the same length as nodelist. If numeric values are specified they will be mapped to colors using the cmap and vmin,vmax parameters. See matplotlib.scatter for more details.

G = nx.gnm_random_graph(20, 50, directed=True)

# Not for groups, but for each node
colors = ['red' if n > 10 else 'blue' for n in G.nodes]

nx.draw(G, with_labels=False, node_size=150, node_color=colors)

enter image description here

Также будьте осторожны, чтобы длина массива colors была равна длине G.nodes!Если они будут другими, node_color будут игнорироваться!

G = nx.gnm_random_graph(20, 50, directed=True)

# Because of .pop(), the length of colors is different
colors = ['red' if n > 10 else 'blue' for n in G.nodes].pop()

nx.draw(G, with_labels=False, node_size=150, node_color=colors)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...