Как работать с перекрывающимися узлами в сетевой графике

Я пытаюсь сделать графику в networkx, в которой группы узлов связаны, как на рисунке:

график

Тем не менее, некоторые узлы появляются, другие отображаются нейтральным цветом.

Я хочу знать, есть ли способ:

  • цвет только один узел для каждой подгруппы (например, один узел с красным цветом) – другие с нейтральным цветом;
  • или окрасить все узлы.

Это мой код:

def draw_graph(transactions, method, suffix): G = nx.Graph() # get the string prefixes for each group (column of nodes) # possible prefixes are: aa, bb, cc, etc. prefixes = [c[:2] for c in classifiers] # for each transaction, use also a unique index (i_t) for i_t, t in enumerate(transactions): # tid is the groups signature, eg if the tuple of # classification is ('1', '2', '1') tid is 121 # tid has always 3 characters - there are only 3 # with at maximum 7 classifications in each group tid = ''.join([c[2] for c in t]) # nodes have name the concatenated string composed of: # * classification (eg aa1) <- please note prefix # * tid (eg 121) # * unique identifier node1 = t[0] + tid + str(i_t) node2 = t[1] + tid + str(i_t) node3 = t[2] + tid + str(i_t) # link correspondent nodes on each group G.add_edge(node1, node2, weight=0.2) G.add_edge(node2, node3, weight=0.2) # based on prefix decide in which group store the node pos = {} group1 = [] group2 = [] group3 = [] for node in G.nodes(): if node.startswith(prefixes[0]): group1.append(node) elif node.startswith(prefixes[1]): group2.append(node) else: group3.append(node) # sort each group by classification AND tid group1.sort(key=lambda x: x[2:6]) group2.sort(key=lambda x: x[2:6]) group3.sort(key=lambda x: x[2:6]) # define position for each node based on group and index # of node inside the group for i_group, group in enumerate([group1, group2, group3]): for i_node, node in enumerate(group): xpos = float(i_group) * 2 ypos = float(i_node) / len(group) pos[node] = [xpos, ypos] # decide node color based on classification (nn[2]). # avail_colors is a list of colors defined outside this method node_color = [avail_colors[int(nn[2])] for nn in G.nodes()] # draw each node with correspondent position and color nx.draw_networkx_nodes(G, pos, node_size=200, node_color=node_color) # draw edges with defined weight (not used in this example) for (u, v, d) in G.edges(data=True): w = d['weight'] nx.draw_networkx_edges(G, pos, edgelist=[(u, v)], width=w) plt.axis('off') plt.close() 

Надеюсь, это понятно. Если не спросите меня.

благодаря

Это может быть не совсем то, что вы хотите. Вы можете управлять отдельными цветами, прозрачностью и относительным перекрытием отдельных узлов;

 import matplotlib.pyplot as plt import networkx as nx G = nx.Graph() G.add_node(1) G.add_node(2) G.add_node(3) pos = {1:(0.99,1.0), 2:(1.0,1.0), 3:(1.01,1.0)} r = nx.draw_networkx_nodes(G, pos, nodelist=[1], node_color='r', node_size=30000) g = nx.draw_networkx_nodes(G, pos, nodelist=[2], node_color='g', node_size=30000) b = nx.draw_networkx_nodes(G, pos, nodelist=[3], node_color='b', node_size=30000) r.set_zorder(3) # move red node to front b.set_alpha(0.05) # make blue node (almost) "invisible" plt.xlim(0.95,1.05) plt.axis('off') plt.show() 

введите описание изображения здесь

Я обнаружил, что в моем случае то, что решает мою проблему, – это установка

 linewidths=0 

в draw_networkx_nodes() , потому что граница окружности создавала эффект перекрытия.

Надеюсь, поможет.