diff --git a/draw_graph_script.py b/draw_graph_script.py new file mode 100644 index 0000000000000000000000000000000000000000..fb1950d53b5cd2bcab97aba66825d752d5e3c3c3 --- /dev/null +++ b/draw_graph_script.py @@ -0,0 +1,40 @@ +# coding = utf-8 + +import argparse +import networkx as nx +import pandas as pd +import joblib,json + +from lib.draw import draw + +parser = argparse.ArgumentParser() +parser.add_argument("input_file",help="edgelist format (sep = \",\" )") +parser.add_argument("--encoder-file",help="LabelEncoder instance that allows to obtain a label for each node") +parser.add_argument("--country",help="if country node",action="store_true") +parser.add_argument("-w",action="store_true") +parser.add_argument("output_file") + +args = parser.parse_args() + +if args.w: + df = pd.read_csv(args.input_file,header=None,names="source target weight".split()) + G = nx.from_pandas_edgelist(df,edge_attr="weight") +else: + df = pd.read_csv(args.input_file, header=None, names="source target weight".split()) + G = nx.from_pandas_edgelist(df, edge_attr="weight") + +encoder = None +labels_dict = {} + +if args.encoder_file: + encoder = joblib.load(args.encoder_file) + if args.country: + iso2_name = json.load(open("data/ISO3166-1.alpha2.json.txt")) + for node in list(G.nodes()): + if args.country: + labels_dict[node] = iso2_name[encoder.inverse_transform([node])[0]] + else: + labels_dict[node] = encoder.inverse_transform([node])[0] + +fig, ax = draw(G,labels_dict) +fig.savefig("test.pdf") \ No newline at end of file diff --git a/lib/draw.py b/lib/draw.py index a205c2db33c3b7dd3c0e8abcb15682c9e60b8577..de68555c4074e43872e33c0a5d536651e6d041b9 100644 --- a/lib/draw.py +++ b/lib/draw.py @@ -89,3 +89,4 @@ def draw(G, labels_dict={}, iteration_force_atlase=2000, figsize=(40, 20), font_ if weight: plt.colorbar(edges) plt.axis("off") + return fig, ax diff --git a/nx2gt.py b/nx2gt.py deleted file mode 100644 index 13b7250ac860b44181f87dc40ebadb5d2eb925a7..0000000000000000000000000000000000000000 --- a/nx2gt.py +++ /dev/null @@ -1,119 +0,0 @@ -# code from http://bbengfort.github.io/snippets/2016/06/23/graph-tool-from-networkx.html - -import networkx as nx -import graph_tool as gt - - -def get_prop_type(value, key=None): - """ - Performs typing and value conversion for the graph_tool PropertyMap class. - If a key is provided, it also ensures the key is in a format that can be - used with the PropertyMap. Returns a tuple, (type name, value, key) - """ - - # Deal with the value - if isinstance(value, bool): - tname = 'bool' - - elif isinstance(value, int): - tname = 'float' - value = float(value) - - elif isinstance(value, float): - tname = 'float' - - elif isinstance(value, dict): - tname = 'object' - - else: - tname = 'string' - value = str(value) - - return tname, value, key - - -def nx2gt(nxG): - """ - Converts a networkx graph to a graph-tool graph. - """ - # Phase 0: Create a directed or undirected graph-tool Graph - gtG = gt.Graph(directed=nxG.is_directed()) - - # Add the Graph properties as "internal properties" - for key, value in nxG.graph.items(): - # Convert the value and key into a type for graph-tool - tname, value, key = get_prop_type(value, key) - - prop = gtG.new_graph_property(tname) # Create the PropertyMap - gtG.graph_properties[key] = prop # Set the PropertyMap - gtG.graph_properties[key] = value # Set the actual value - - # Phase 1: Add the vertex and edge property maps - # Go through all nodes and edges and add seen properties - # Add the node properties first - nprops = set() # cache keys to only add properties once - for node, data in nxG.nodes(data=True): - - # Go through all the properties if not seen and add them. - for key, val in data.items(): - if key in nprops: - continue # Skip properties already added - - # Convert the value and key into a type for graph-tool - tname, _, key = get_prop_type(val, key) - - prop = gtG.new_vertex_property(tname) # Create the PropertyMap - gtG.vertex_properties[key] = prop # Set the PropertyMap - - # Add the key to the already seen properties - nprops.add(key) - - # Also add the node id: in NetworkX a node can be any hashable type, but - # in graph-tool node are defined as indices. So we capture any strings - # in a special PropertyMap called 'id' -- modify as needed! - gtG.vertex_properties['id'] = gtG.new_vertex_property('string') - - # Add the edge properties second - eprops = set() # cache keys to only add properties once - for src, dst, data in nxG.edges(data=True): - - # Go through all the edge properties if not seen and add them. - for key, val in data.items(): - if key in eprops: - continue # Skip properties already added - - # Convert the value and key into a type for graph-tool - tname, _, key = get_prop_type(val, key) - - prop = gtG.new_edge_property(tname) # Create the PropertyMap - gtG.edge_properties[key] = prop # Set the PropertyMap - - # Add the key to the already seen properties - eprops.add(key) - - # Phase 2: Actually add all the nodes and vertices with their properties - # Add the nodes - vertices = {} # vertex mapping for tracking edges later - for node, data in nxG.nodes(data=True): - - # Create the vertex and annotate for our edges later - v = gtG.add_vertex() - vertices[node] = v - - # Set the vertex properties, not forgetting the id property - data['id'] = str(node) - for key, value in data.items(): - gtG.vp[key][v] = value # vp is short for vertex_properties - - # Add the edges - for src, dst, data in nxG.edges(data=True): - - # Look up the vertex structs from our vertices mapping and add edge. - e = gtG.add_edge(vertices[src], vertices[dst]) - - # Add the edge properties - for key, value in data.items(): - gtG.ep[key][e] = value # ep is short for edge_properties - - # Done, finally! - return gtG \ No newline at end of file