python – networkx – grafica nodos de diferentes colores usando dos listas

Soy nuevo en networkx y necesito ayuda. He buscado anteriormente y no pude resolver mi problema. Tengo una imagen graphxiz de networkx que hice, usando una lista como entrada para los nodos y un archivo de dos columnas para los bordes. Un segundo archivo contiene los elementos de la primera lista, así como los valores que corresponden al tamaño del nodo. Tengo otro archivo, que contiene elementos que están en la lista original, y necesito que los elementos idénticos aparezcan en otro color, sin cambiar el diseño o la estructura del gráfico.

Aquí hay algunos de los códigos que he estado probando:

import sys from collections import defaultdict import networkx as nx import matplotlib.pyplot as plt inp = sys.argv[1] cluster = sys.argv[1] + ".cluster" counts = sys.argv[1] + ".counts" hybrids = sys.argv[2] with open(cluster, "r") as f1: edges = [line.strip().split('\t') for line in f1] with open(counts, "r") as f2: countsdic = defaultdict(list) for line in f2: k,v = line.strip().split() countsdic[k].append(v) with open(hybrids, "r") as f3: hybrids = [line.strip() for line in f3] tmp = [] for el in sum(edges, []): tmp.append(el) nodes = [] for t in tmp: if t not in nodes: nodes.append(t) node_sizes = {} for n in nodes: node_sizes[n] = ' '.join(countsdic[n]) sizes = [] for v in node_sizes.values(): x = int(v) * 10 sizes.append(x) g = nx.Graph() g.add_nodes_from(nodes) g.add_edges_from(edges) for node in nodes: if node in hybrids: color = 'green' if node not in hybrids: color = 'blue' nx.draw_graphviz(g, prog="fdp", node_color-color, node_size = sizes) for node in nodes: if node in hybrids: g.add_node(node, fillcolor='green') if node not in hybrids: g.add_node(node, fillcolor='blue') A = nx.to_agraph(g) A.layout() A.draw(inp + ".png") plt.figure(1,figsize=(2000,2000)) plt.savefig(out + ".png", dpi = 1000) plt.show() 

Necesito poder cambiar el color del nodo si el elemento en las listas híbridas existe en las listas de nodos, sin alterar la estructura de la lista de nodos para mantener la estructura de la imagen original. Intenté eliminar elementos que coinciden con los híbridos en los nodos y usar ambas listas para crear nodos de diferente color, sin embargo, no hubo cambio de color, y el diseño del gráfico cambió significativamente. Me gustaría continuar usando el “fdp” de graphviz, a menos que alguien pueda sugerir una forma de colocar los clusters verticalmente de mayor a menor.

Me topé con el A = nx.to_agraph (G) en mis búsquedas y me gusta la representación, y los colores cambiaron como se suponía, sin embargo, la imagen es de baja calidad y para los grupos más grandes, nada es discernible. ¿Alguien puede sugerir cómo boost la calidad de la imagen? Tal vez, ¿es más grande para estirar los grandes grupos?

Aquí está el gráfico original de Graphviz fdp:

    introduzca la descripción de la imagen aquí

    Y aquí está la salida de A = nx.to_graph:

    introduzca la descripción de la imagen aquí

    Se prefiere corregir ambos métodos, y se agradece toda la ayuda.

    Aquí está lo que utilicé para colorear mi gráfica.

     ## assign a node attribute, which I am going to color according to for node in G.nodes(): G.node[node]['category'] = my_category_dict[node] ## put together a color map, one color for a category color_map = {'type_A':'b', 'type_B':'#FF0099', 'type_C':'#660066'} ## construct a list of colors then pass to node_color nx.draw(G, node_color=[color_map[G.node[node]['category']] for node in G]) plt.show() 

    Y luego tengo mi imagen como abajo. Utilicé más colores que en el ejemplo. ¿Es esto lo que quieres?

    Además, esta página tiene muchos ejemplos que me parecieron útiles al trazar mi gráfica.

    introduzca la descripción de la imagen aquí

    Gracias, sophiad por tu respuesta. Parece que la respuesta que estaba buscando estaba en mi nariz todo el tiempo. Necesitaba hacer una lista de los colores para pasar a nx.draw_graphviz.

    Entonces, el código correcto (que encontré) para pasar un cierto color a un nodo comparando dos listas:

     colors=[] for n in nodes: if n in hybrids: colors.append('g') else: colors.append('b') nx.draw_graphviz(g, prog="fdp", node_color = colors, node_size = sizes) 

    Y para cambiar la versión de texto, para reflejar la versión del nodo de color, todo lo que tenía que hacer era cambiar A.layout () a A.layout (prog = “fdp”)

    Y no cambia el diseño!

    La imagen original:

    introduzca la descripción de la imagen aquí

    La nueva imagen: introduzca la descripción de la imagen aquí

    La nueva versión de texto:

    Ok, así que casi lo tengo. Pude cambiar el color de los nodos que quería, sin embargo, no mantenía la misma forma del gráfico, y también pude actualizar el gráfico para representar el formato fdp de graphviz. Si alguien está interesado aquí hay algunos cambios:

     with open(counts, "r") as f2: countsdic = defaultdict(list) for line in f2: k,v = line.strip().split() countsdic[k].append(v) with open(hybrids, "r") as f3: hybrids = [line.strip() for line in f3] print hybrids tmp = [] for el in sum(edges, []): tmp.append(el) nodes = [] for t in tmp: if t not in nodes: nodes.append(t) node_sizes = {} for n in nodes: node_sizes[n] = ' '.join(countsdic[n]) sizes = [] for v in node_sizes.values(): x = int(v) * 10 sizes.append(x) g = nx.Graph() #g.add_nodes_from(nodes) g.add_edges_from(edges) #for node in nodes: # if node in hybrids: # color = 'green' # if node not in hybrids: # color = 'blue' pos=nx.graphviz_layout(g, prog='fdp') nx.draw_networkx_nodes(g, pos, nodelist=[str(n) for n in nodes], node_color='b', node_size = sizes) nx.draw_networkx_nodes(g, pos, nodelist=[str(n) for n in nodes if n in hybrids], node_color='g', node_size = sizes) nx.draw_networkx_edges(g,pos) #nxgraph(graph) #for node in nodes: # if node in hybrids: # y.add_node(node, fillcolor='green') # if node not in hybrids: # g.add_node(node, fillcolor='blue') A = nx.to_agraph(g) A.layout(prog="fdp") A.draw(inp + "2.png") plt.figure(1,figsize=(2000,2000)) plt.savefig(out + ".png", dpi = 1000) plt.show() 

    Sin embargo, usar el formato fdp con agraph hizo que todo fuera negro. Todavía me gustaría hacer los colores específicos de los nodos si alguien puede ayudar con eso. También me gustaría mantener la forma y el formato original del gráfico, y simplemente cambiar el color del nodo, si alguien todavía puede ayudar con eso. Continuaré trabajando en esto y publicaré otra respuesta si lo descubro. Gracias a cualquiera que haya mirado este post. (No pude publicar la imagen actualizada ya que era demasiado grande)