python networkX: создание графика из кортежей и назначение разных цветов для узлов

new = (('AXIN', 37, REPORTED),
 ('LGR', 34, REPORTED),
 ('NKD', 29, REPORTED),
 ('TNFRSF', 23, REPORTED),
 ('APCDD', 18, REPORTED),
 ('TOX', 15, UNREPORTED),
 ('LEF', 14, REPORTED),
 ('PLCB', 13, REPORTED),
 ('MME', 13, UNREPORTED),
 ('NOTUM', 13,UN REPORTED),
 ('GNG', 11, , REPORTED),
 ('LOXL', 10, UNREPORTED))

import matplotlib.pyplot as plt
import networkx as nx
children = sorted(new, key=lambda x: x[1])
parent = children.pop()[0]

G = nx.Graph()
for child, weight in children: G.add_edge(parent, child, weight=weight)
width = list(nx.get_edge_attributes(G, 'weight').values())
plt.savefig("plt.gene-expression.pdf")
plt.figure(figsize = (20, 10))

nx.draw_networkx(G, font_size=10, node_size=2000, alpha=0.6)  #width=width is very fat lines
plt.savefig("gene-expression-graph.pdf")

Как на этом графике nx сделать UNREPORTED-зеленым цветом, REPORTED-желтым цветом? Родительский узел — это узел с наибольшим номером, т. е. AXIN, 37.


person J.A    schedule 09.03.2017    source источник


Ответы (2)


Несоответствие в порядке возникает из-за словарей, лежащих в основе представления графа networkx. Если вы убедитесь, что список цветов упорядочен таким же образом, у вас будет правильный цвет для правильного узла. Я написал здесь два разных подхода, которые достигают того, что, как я думаю, вы хотите.

Примечание. Я объявил значения для зарегистрированных и несообщенных, а не превращал третью часть каждого кортежа в строку. Но эта часть не является существенной

# Delcare the graph:
REPORTED = 1
UNREPORTED = 2

new = (('AXIN', 37, REPORTED),
 ('LGR', 34, REPORTED),
 <...>
 ('LOXL', 10, UNREPORTED))

# 2 axes to show different approaches
plt.figure(1); plt.clf()
fig, ax = plt.subplots(1, 2, num=1, sharex=True, sharey=True)

### option 1: draw components step-by-step
# positions for drawing of all components in right place
pos = nx.spring_layout(G)

# identify which nodes are reported/unreported
nl_r = [name for (name, w, state) in new if state == REPORTED]
nl_u = [name for (name, w, state) in new if state == UNREPORTED]

# draw each subset of nodes in relevant color
nx.draw_networkx_nodes(G, pos=pos, nodelist=nl_r, node_color='g', nodesize=2000, ax=ax[0])
nx.draw_networkx_nodes(G, pos=pos, nodelist=nl_u, node_color='y', nodesize=2000, ax=ax[0])
# also need to draw the egdes
nx.draw_networkx_edges(G, pos=pos, ax=ax[0])
nx.draw_networkx_labels(G, pos=pos, ax=ax[0], font_size=10)

### option 2: more complex color list construction (but simpler plot command)
nl, cl = zip(*[(name, 'g') if state == REPORTED else (name, 'y') for (name, w, state) in new])

nx.draw_networkx(G, pos=pos, nodelist=nl, node_color=cl, nodesize=2000, ax=ax[1], font_size=10)

plt.show()

пример вывода

person Bonlenfum    schedule 13.03.2017

person    schedule
comment
он назначает желтый и зеленый цвета узлу, не глядя на идентификатор узла: например, первая руна кода дает мне axin - зеленый узел, следующий запуск того же кода дает мне axin как желтый узел. - person J.A; 10.03.2017
comment
@Bonlenfum Ребята, не могли бы вы подсказать, как мне решить этот вопрос nx? stackoverflow .com/questions/43090538/ - person J.A; 29.03.2017