Example #1
0
def filter_network(g, degree_threshold=None, largest_connected_component=True):
    print "V,E:", g.number_of_nodes(), g.number_of_edges()
    degrees = g.degree(with_labels=True)
    subgraph_nodes = []
    for id, d in degrees.iteritems():
	if degree_threshold is None or d <= degree_threshold:
	    subgraph_nodes.append(id)
    g_filtered = g.subgraph(subgraph_nodes)
    if largest_connected_component:
	component_nodes = networkx.connected_components(g_filtered)[0]
	g_filtered = g_filtered.subgraph(component_nodes )
    print "V,E filtered:", g_filtered.number_of_nodes(), g_filtered.number_of_edges()
    return g_filtered
Example #2
0
def filter_network(g, degree_threshold=None, largest_connected_component=True):
    print "V,E:", g.number_of_nodes(), g.number_of_edges()
    degrees = g.degree(with_labels=True)
    subgraph_nodes = []
    for id, d in degrees.iteritems():
        if degree_threshold is None or d <= degree_threshold:
            subgraph_nodes.append(id)
    g_filtered = g.subgraph(subgraph_nodes)
    if largest_connected_component:
        component_nodes = networkx.connected_components(g_filtered)[0]
        g_filtered = g_filtered.subgraph(component_nodes)
    print "V,E filtered:", g_filtered.number_of_nodes(
    ), g_filtered.number_of_edges()
    return g_filtered
Example #3
0
def get_connected_components(G, return_as_graph_list=True):
    """
        Finds (strongly in the case of directed network) connected components of graph
        returnAsGraphList: returns list of graph objects corresponding to connected components (from larger to smaller)
        otherwise returns list of node list corresponding nodes in connected components
    """
    result_list = []

    if return_as_graph_list:
        result_list = networkx.connected_component_subgraphs(G)
    else:
        result_list = networkx.connected_components(G)

    return result_list
Example #4
0
def get_connected_components(G, return_as_graph_list=True):
    """
        Finds (strongly in the case of directed network) connected components of graph
        returnAsGraphList: returns list of graph objects corresponding to connected components (from larger to smaller)
        otherwise returns list of node list corresponding nodes in connected components
    """
    result_list = []

    if return_as_graph_list:
        result_list = networkx.connected_component_subgraphs(G)
    else:
        result_list = networkx.connected_components(G)

    return result_list
Example #5
0
def analyze_network(g, out_file=None, seeds=None, calculate_radius=False):
    if out_file is None:
        from sys import stdout
        out_method = stdout.write
    else:
        file = open(out_file, "a")
        out_method = file.write
    # print networkx.info(g) # currently buggy but fixed in the next version of networkx
    out_method("(V,E): %d %d\n" % (g.number_of_nodes(), g.number_of_edges()))
    out_method("V/E: %f\n" %
               (int(g.number_of_nodes()) / float(g.number_of_edges())))
    degrees = g.degree()
    degrees.sort()
    out_method("Average degree: %f\n" %
               float(sum(degrees) / float(len(degrees))))
    out_method("Most connected 20 nodes: %s\n" % degrees[-20:])
    connected_components = networkx.connected_components(g)
    out_method("Connected component sizes: %s\n" %
               map(len, connected_components))
    # Radius calculation is very time consuming
    if calculate_radius:
        out_method("Radius (of the largest connected component): %d\n" %
                   get_network_radius(g.subgraph(connected_components[0])))
    #print get_network_degree_histogram(g)
    if seeds is not None:
        if len(seeds) <= 1:
            out_method("Average linker degree: %f\n" % (0))
            out_method("Average seed connecting shortest paths length: %f\n" %
                       (0))
        else:
            node_to_ld = get_node_linker_degrees(g, seeds)
            vals = [node_to_ld[v] for v in seeds]
            out_method("Average linker degree: %f\n" %
                       (float(sum(vals)) / len(vals)))
            #sp_lengths = networkx.all_pairs_shortest_path_length(g)
            sum_length = 0
            count = 0
            for i, u in enumerate(seeds):
                sp_lengths = networkx.single_source_dijkstra_path_length(g, u)
                for j, v in enumerate(seeds):
                    if j < i:
                        sum_length += sp_lengths[v]  #[u][v]
                        count += 1
            out_method("Average seed connecting shortest paths length: %f\n" %
                       (float(sum_length) / count))
    if out_file is not None:
        file.close()
    return
Example #6
0
def analyze_network(g, out_file = None, seeds = None, calculate_radius = False):
    if out_file is None:
	from sys import stdout 
	out_method = stdout.write
    else:
	file = open(out_file, "a")
	out_method = file.write
    # print networkx.info(g) # currently buggy but fixed in the next version of networkx
    out_method("(V,E): %d %d\n" % (g.number_of_nodes(), g.number_of_edges()))
    out_method("V/E: %f\n" % (int(g.number_of_nodes()) / float(g.number_of_edges())))
    degrees = g.degree() 
    degrees.sort()
    out_method("Average degree: %f\n" % float(sum(degrees)/float(len(degrees))))
    out_method("Most connected 20 nodes: %s\n" % degrees[-20:])
    connected_components = networkx.connected_components(g)
    out_method("Connected component sizes: %s\n" % map(len, connected_components))
    # Radius calculation is very time consuming
    if calculate_radius:
	out_method("Radius (of the largest connected component): %d\n" % get_network_radius(g.subgraph(connected_components[0])))
    #print get_network_degree_histogram(g)
    if seeds is not None:
	if len(seeds) <= 1:
	    out_method("Average linker degree: %f\n" % (0))
	    out_method("Average seed connecting shortest paths length: %f\n" % (0))
	else:
	    node_to_ld = get_node_linker_degrees(g, seeds)
	    vals = [ node_to_ld[v] for v in seeds ]
	    out_method("Average linker degree: %f\n" % (float(sum(vals))/len(vals)))
	    #sp_lengths = networkx.all_pairs_shortest_path_length(g)
	    sum_length = 0
	    count = 0
	    for i, u in enumerate(seeds):
		sp_lengths = networkx.single_source_dijkstra_path_length(g, u)
		for j, v in enumerate(seeds):
		    if j<i:
			sum_length += sp_lengths[v] #[u][v]
			count += 1
	    out_method("Average seed connecting shortest paths length: %f\n" % (float(sum_length)/count))
    if out_file is not None:
	file.close()
    return
Example #7
0
def create_R_analyze_network_script(g,
                                    seeds=None,
                                    out_path="./",
                                    title="",
                                    scale_by_log=False):
    if scale_by_log:
        f = open(out_path + "analyze_network_log_scaled.r", "w")
        f.write(
            "postscript(\"%sanalyze_network_log_scaled.eps\", width = 6, height = 6, horizontal = FALSE, onefile = FALSE, paper = \"special\", title = \"%s\")\n"
            % (out_path, title))
    else:
        f = open(out_path + "analyze_network.r", "w")
        f.write(
            "postscript(\"%sanalyze_network.eps\", width = 6, height = 6, horizontal = FALSE, onefile = FALSE, paper = \"special\", title = \"%s\")\n"
            % (out_path, title))
    f.write("par(mfrow=c(3,2))\n")

    node_to_values = get_node_degree_related_values(g, seeds)

    f.write(
        "f<-function(l) { \nr<-c()\nfor(i in 1:length(l)) {\n if(l[i] <= 1) {\n  r[i]<-l[i]\n }\n else { \n  r[i]<-(1+log10(l[i]))\n } \n}\nreturn(r)\n}\n"
    )
    # Degree distribution
    #degrees = g.degree(with_labels = True)
    #n_node = len(degrees)
    #d_max = max(degrees.values())
    d_max = max(node_to_values.values(), key=lambda x: x[0])[0]
    non_seed_degree_counts = [0] * (d_max + 1)
    seed_degree_counts = [0] * (d_max + 1)
    #for v,d in degrees.iteritems():
    for v, values in node_to_values.iteritems():
        d, ld, d2, ld2 = values
        #if d_ != d: print v, d, d_ # networkx includes self edges in degree
        if v in seeds:
            seed_degree_counts[d] += 1
        else:
            non_seed_degree_counts[d] += 1
    f.write("n<-c(%s)\n" % ",".join(map(str, seed_degree_counts)))
    f.write("N<-c(%s)\n" % ",".join(map(str, non_seed_degree_counts)))
    f.write("s<-(n+N)\n")
    if scale_by_log:
        f.write("A<-matrix(c(f(n), f(N+n)-f(n)), nrow=2, byrow=TRUE)\n")
        f.write(
            "barplot(A, yaxt=\"n\", names.arg=c(0:(length(n)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Degree\", ylab=\"Number of nodes (Log scale)\")\n"
        )
        f.write("axis(2, 0:5, labels=c(0,%s), las=2)\n" %
                ",".join(map(str, [10**i for i in xrange(5)])))
    else:
        f.write("A<-matrix(c(n, N), nrow=2, byrow=TRUE)\n")
        ##f.write("barplot(A, yaxp=c(0,max(N+n),1), xaxp=c(1, length(n), 1), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Degree\", ylab=\"Number of nodes\")\n")
        f.write(
            "barplot(A, ylim=c(0,round(max(s)/4)), names.arg=c(0:(length(n)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Degree\", ylab=\"Number of nodes\")\n"
        )
        #f.write("barplot(A, xaxt=\"n\", legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Degree\", ylab=\"Number of nodes\")\n")
        #f.write("axis(1, seq(0,length(n)-1,round(length(n)/5)), labels=seq(0,length(n)-1,round(length(n)/5)))\n")

        # Log-log plot of degree distribution
        #f.write("par(fig=c(0.6, 1, 0.1, 0.5), new = T)\n") # Make this plot inner
    f.write("p<-c()\n")
    f.write("d<-c()\n")
    f.write(
        "for(i in 2:length(s)) { if(s[i] != 0) { p[i]<-s[i]; d[i]<-i; } }\n")
    f.write("fit<-lm(log10(d) ~ log10(p))\n")
    f.write(
        "plot(0:(length(s)-1), s, log=\"xy\", yaxt=\"n\", xlab=\"Degree (Log scale)\", ylab=\"Number of nodes (Log scale)\")\n"
    )
    f.write("axis(2, las=2)\n")
    f.write(
        "#plot(d, p, yaxt=\"n\", xlab=\"log(degree)\", ylab=\"log(# of nodes)\")\n"
    )
    f.write("#axis(2, 0:5, labels=c(0,%s), las=2)\n" %
            ",".join(map(str, [10**i for i in xrange(5)])))
    f.write("abline(fit, col=2, lty=2)\n")
    f.write("legend(\"topright\", c(\"linear (ls) fit\"), col=c(2), lty=2)\n")
    #f.write("par(fig=c(0, 1, 0, 1))\n")

    # Linker degree distribution
    #node_to_ld = get_node_linker_degrees(g, seeds)
    #ld_max = max(node_to_ld.values())
    ld_max = max(node_to_values.values(), key=lambda x: x[1])[1]
    non_seed_ldegree_counts = [0] * (ld_max + 1)
    seed_ldegree_counts = [0] * (ld_max + 1)
    #for v,ld in node_to_ld.iteritems():
    for v, values in node_to_values.iteritems():
        d, ld, d2, ld2 = values
        #d, ld_, d2, ld2 = node_to_values[v]
        #assert (ld_ == ld)
        #if ld_ != ld: print v, ld, ld_
        if v in seeds:
            seed_ldegree_counts[ld] += 1
        else:
            non_seed_ldegree_counts[ld] += 1
    f.write("ln<-c(%s)\n" % ",".join(map(str, seed_ldegree_counts)))
    f.write("lN<-c(%s)\n" % ",".join(map(str, non_seed_ldegree_counts)))
    if scale_by_log:
        f.write("lA<-matrix(c(f(ln), f(lN+ln)-f(ln)), nrow=2, byrow=TRUE)\n")
        f.write(
            "barplot(lA, yaxt=\"n\", names.arg=c(0:(length(ln)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Linker Degree\", ylab=\"Number of nodes (Log scale)\")\n"
        )
        f.write("#lA<-matrix(c(f(lN+ln), f(ln)), nrow=2, byrow=TRUE)\n")
        f.write(
            "#barplot(lA, beside=TRUE, yaxt=\"n\", names.arg=c(0:(length(ln)-1)), legend.text=rev(c(\"seed\",\"all\")), col=rev(heat.colors(2)), xlab=\"Linker Degree\", ylab=\"Number of nodes (Log scale)\")\n"
        )
        f.write("axis(2, 0:5, labels=c(0,%s), las=2)\n" %
                ",".join(map(str, [10**i for i in xrange(5)])))
    else:
        f.write("lA<-matrix(c(ln, lN), nrow=2, byrow=TRUE)\n")
        f.write(
            "barplot(lA, ylim=c(0,round(max(s)/4)), names.arg=c(0:(length(ln)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Linker Degree\", ylab=\"Number of nodes\")\n"
        )

    # Linker degree ratio
    non_seed_ld_ratio_counts = [0] * 11
    seed_ld_ratio_counts = [0] * 11
    #for v,ld in node_to_ld.iteritems():
    for v, values in node_to_values.iteritems():
        d, ld, d2, ld2 = values
        #ratio = float(ld) / degrees[v]
        if ld == 0:
            ratio = 0
        else:
            ratio = float(ld) / d
        ratio = int(ratio * 10)
        if v in seeds:
            seed_ld_ratio_counts[ratio] += 1
        else:
            non_seed_ld_ratio_counts[ratio] += 1
    f.write("rn<-c(%s)\n" % ",".join(map(str, seed_ld_ratio_counts)))
    f.write("rN<-c(%s)\n" % ",".join(map(str, non_seed_ld_ratio_counts)))
    if scale_by_log:
        f.write("rA<-matrix(c(f(rn), f(rN+rn)-f(rn)), nrow=2, byrow=TRUE)\n")
        f.write(
            "barplot(rA, yaxt=\"n\", names.arg=c(0:(length(rn)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Linker degree / Degree\", ylab=\"Number of nodes (Log scale)\")\n"
        )
        f.write("axis(2, 0:5, labels=c(0,%s), las=2)\n" %
                ",".join(map(str, [10**i for i in xrange(5)])))
    else:
        f.write("rA<-matrix(c(rn, rN), nrow=2, byrow=TRUE)\n")
        f.write(
            "barplot(rA, ylim=c(0,round(max(s)/4)), names.arg=c(0:(length(rn)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Linker degree / Degree\", ylab=\"Number of nodes\")\n"
        )

    # Linker degree ratio at level 2
    non_seed_ld2_ratio_counts = [0] * 11
    seed_ld2_ratio_counts = [0] * 11
    for v, values in node_to_values.iteritems():
        d, ld, d2, ld2 = values
        if ld2 == 0:
            ratio = 0
        else:
            ratio = float(ld2) / d2
        ratio = int(ratio * 10)
        if v in seeds:
            seed_ld2_ratio_counts[ratio] += 1
        else:
            non_seed_ld2_ratio_counts[ratio] += 1
    f.write("rn2<-c(%s)\n" % ",".join(map(str, seed_ld2_ratio_counts)))
    f.write("rN2<-c(%s)\n" % ",".join(map(str, non_seed_ld2_ratio_counts)))
    if scale_by_log:
        f.write(
            "rA2<-matrix(c(f(rn2), f(rN2+rn2)-f(rn2)), nrow=2, byrow=TRUE)\n")
        f.write(
            "barplot(rA2, yaxt=\"n\", names.arg=c(0:(length(rn2)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Linker degree level2 / Degree level2\", ylab=\"Number of nodes (Log scale)\")\n"
        )
        f.write("axis(2, 0:5, labels=c(0,%s), las=2)\n" %
                ",".join(map(str, [10**i for i in xrange(5)])))
    else:
        f.write("rA2<-matrix(c(rn2, rN2), nrow=2, byrow=TRUE)\n")
        f.write(
            "barplot(rA2, ylim=c(0,round(max(s)/4)), names.arg=c(0:(length(rn2)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Linker degree level2 / Degree level2\", ylab=\"Number of nodes\")\n"
        )

    connected_components = networkx.connected_components(g)
    connected_component_sizes = map(len, connected_components)
    max_size = max(connected_component_sizes)
    connected_component_seed_counts = [0] * (max_size + 1)
    connected_component_non_seed_counts = [0] * (max_size + 1)
    for connected_component in connected_components:
        for i in connected_component:
            if i in seeds:
                connected_component_seed_counts[len(connected_component)] += 1
            else:
                connected_component_non_seed_counts[len(
                    connected_component)] += 1
    f.write("c<-c(%s)\n" % ",".join(map(str, connected_component_seed_counts)))
    f.write("C<-c(%s)\n" %
            ",".join(map(str, connected_component_non_seed_counts)))
    if scale_by_log:
        f.write("cA<-matrix(c(f(c), f(C+c)-f(c)), nrow=2, byrow=TRUE)\n")
        #f.write("barplot(cA, yaxt=\"n\", log=\"x\", xaxp=c(0,length(c),1), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Connected component size (Log scale)\", ylab=\"Number of nodes (Log scale)\")\n")
        f.write(
            "barplot(cA, yaxt=\"n\", xaxt=\"n\", legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Connected component size (Log scale)\", ylab=\"Number of nodes (Log scale)\")\n"
        )
        f.write("axis(2, 0:5, labels=c(0,%s), las=2)\n" %
                ",".join(map(str, [10**i for i in xrange(5)])))
        f.write(
            "axis(1, seq(1,length(c),round(length(c)/5)), labels=seq(1,length(c),round(length(c)/5)))\n"
        )
    else:
        f.write("cA<-matrix(c(c, C), nrow=2, byrow=TRUE)\n")
        f.write(
            "barplot(cA, ylim=c(0,round(max(s)/4)), names.arg=c(1:length(c)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Connected component size\", ylab=\"Number of nodes\")\n"
        )

    f.write("mtext(\'%s\', outer=TRUE, line=-1)\n" % title)
    f.write("dev.off()\n")
    f.close()
    return
Example #8
0
def create_R_analyze_network_script(g, seeds = None, out_path = "./", title = "", scale_by_log=False):
    if scale_by_log:
	f = open(out_path + "analyze_network_log_scaled.r", "w")
	f.write("postscript(\"%sanalyze_network_log_scaled.eps\", width = 6, height = 6, horizontal = FALSE, onefile = FALSE, paper = \"special\", title = \"%s\")\n" % (out_path, title))
    else:
	f = open(out_path + "analyze_network.r", "w")
	f.write("postscript(\"%sanalyze_network.eps\", width = 6, height = 6, horizontal = FALSE, onefile = FALSE, paper = \"special\", title = \"%s\")\n" % (out_path, title))
    f.write("par(mfrow=c(3,2))\n")
    
    node_to_values = get_node_degree_related_values(g, seeds)

    f.write("f<-function(l) { \nr<-c()\nfor(i in 1:length(l)) {\n if(l[i] <= 1) {\n  r[i]<-l[i]\n }\n else { \n  r[i]<-(1+log10(l[i]))\n } \n}\nreturn(r)\n}\n")
    # Degree distribution
    #degrees = g.degree(with_labels = True) 
    #n_node = len(degrees)
    #d_max = max(degrees.values())
    d_max = max(node_to_values.values(), key=lambda x: x[0])[0]
    non_seed_degree_counts = [ 0 ] * (d_max + 1)
    seed_degree_counts = [ 0 ] * (d_max + 1)
    #for v,d in degrees.iteritems():
    for v, values in node_to_values.iteritems():
	d, ld, d2, ld2 = values
	#if d_ != d: print v, d, d_ # networkx includes self edges in degree
	if v in seeds:
	    seed_degree_counts[d] += 1
	else:
	    non_seed_degree_counts[d] += 1
    f.write("n<-c(%s)\n" % ",".join(map(str, seed_degree_counts)))
    f.write("N<-c(%s)\n" % ",".join(map(str, non_seed_degree_counts)))
    f.write("s<-(n+N)\n")
    if scale_by_log:
	f.write("A<-matrix(c(f(n), f(N+n)-f(n)), nrow=2, byrow=TRUE)\n")
	f.write("barplot(A, yaxt=\"n\", names.arg=c(0:(length(n)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Degree\", ylab=\"Number of nodes (Log scale)\")\n")
	f.write("axis(2, 0:5, labels=c(0,%s), las=2)\n" % ",".join(map(str, [ 10**i for i in xrange(5) ])))
    else:
	f.write("A<-matrix(c(n, N), nrow=2, byrow=TRUE)\n")
	##f.write("barplot(A, yaxp=c(0,max(N+n),1), xaxp=c(1, length(n), 1), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Degree\", ylab=\"Number of nodes\")\n")
	f.write("barplot(A, ylim=c(0,round(max(s)/4)), names.arg=c(0:(length(n)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Degree\", ylab=\"Number of nodes\")\n")
	#f.write("barplot(A, xaxt=\"n\", legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Degree\", ylab=\"Number of nodes\")\n")
	#f.write("axis(1, seq(0,length(n)-1,round(length(n)/5)), labels=seq(0,length(n)-1,round(length(n)/5)))\n")

    # Log-log plot of degree distribution
    #f.write("par(fig=c(0.6, 1, 0.1, 0.5), new = T)\n") # Make this plot inner
    f.write("p<-c()\n")
    f.write("d<-c()\n")
    f.write("for(i in 2:length(s)) { if(s[i] != 0) { p[i]<-s[i]; d[i]<-i; } }\n")
    f.write("fit<-lm(log10(d) ~ log10(p))\n")
    f.write("plot(0:(length(s)-1), s, log=\"xy\", yaxt=\"n\", xlab=\"Degree (Log scale)\", ylab=\"Number of nodes (Log scale)\")\n")
    f.write("axis(2, las=2)\n")
    f.write("#plot(d, p, yaxt=\"n\", xlab=\"log(degree)\", ylab=\"log(# of nodes)\")\n")
    f.write("#axis(2, 0:5, labels=c(0,%s), las=2)\n" % ",".join(map(str, [ 10**i for i in xrange(5) ])))
    f.write("abline(fit, col=2, lty=2)\n")
    f.write("legend(\"topright\", c(\"linear (ls) fit\"), col=c(2), lty=2)\n")
    #f.write("par(fig=c(0, 1, 0, 1))\n")

    # Linker degree distribution
    #node_to_ld = get_node_linker_degrees(g, seeds)
    #ld_max = max(node_to_ld.values())
    ld_max = max(node_to_values.values(), key=lambda x: x[1])[1]
    non_seed_ldegree_counts = [ 0 ] * (ld_max + 1)
    seed_ldegree_counts = [ 0 ] * (ld_max + 1)
    #for v,ld in node_to_ld.iteritems():
    for v, values in node_to_values.iteritems():
	d, ld, d2, ld2 = values
	#d, ld_, d2, ld2 = node_to_values[v]
	#assert (ld_ == ld)
	#if ld_ != ld: print v, ld, ld_
	if v in seeds:
	    seed_ldegree_counts[ld] += 1
	else:
	    non_seed_ldegree_counts[ld] += 1
    f.write("ln<-c(%s)\n" % ",".join(map(str, seed_ldegree_counts)))
    f.write("lN<-c(%s)\n" % ",".join(map(str, non_seed_ldegree_counts)))
    if scale_by_log:
	f.write("lA<-matrix(c(f(ln), f(lN+ln)-f(ln)), nrow=2, byrow=TRUE)\n")
	f.write("barplot(lA, yaxt=\"n\", names.arg=c(0:(length(ln)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Linker Degree\", ylab=\"Number of nodes (Log scale)\")\n")
	f.write("#lA<-matrix(c(f(lN+ln), f(ln)), nrow=2, byrow=TRUE)\n")
	f.write("#barplot(lA, beside=TRUE, yaxt=\"n\", names.arg=c(0:(length(ln)-1)), legend.text=rev(c(\"seed\",\"all\")), col=rev(heat.colors(2)), xlab=\"Linker Degree\", ylab=\"Number of nodes (Log scale)\")\n")
	f.write("axis(2, 0:5, labels=c(0,%s), las=2)\n" % ",".join(map(str, [ 10**i for i in xrange(5) ])))
    else:
	f.write("lA<-matrix(c(ln, lN), nrow=2, byrow=TRUE)\n")
	f.write("barplot(lA, ylim=c(0,round(max(s)/4)), names.arg=c(0:(length(ln)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Linker Degree\", ylab=\"Number of nodes\")\n")

    # Linker degree ratio
    non_seed_ld_ratio_counts = [ 0 ] * 11
    seed_ld_ratio_counts = [ 0 ] * 11
    #for v,ld in node_to_ld.iteritems():
    for v, values in node_to_values.iteritems():
	d, ld, d2, ld2 = values
	#ratio = float(ld) / degrees[v]
	if ld == 0:
	    ratio = 0
	else:
	    ratio = float(ld) / d
	ratio = int(ratio * 10)
	if v in seeds:
	    seed_ld_ratio_counts[ratio] += 1
	else:
	    non_seed_ld_ratio_counts[ratio] += 1
    f.write("rn<-c(%s)\n" % ",".join(map(str, seed_ld_ratio_counts)))
    f.write("rN<-c(%s)\n" % ",".join(map(str, non_seed_ld_ratio_counts)))
    if scale_by_log:
	f.write("rA<-matrix(c(f(rn), f(rN+rn)-f(rn)), nrow=2, byrow=TRUE)\n")
	f.write("barplot(rA, yaxt=\"n\", names.arg=c(0:(length(rn)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Linker degree / Degree\", ylab=\"Number of nodes (Log scale)\")\n")
	f.write("axis(2, 0:5, labels=c(0,%s), las=2)\n" % ",".join(map(str, [ 10**i for i in xrange(5) ])))
    else:
	f.write("rA<-matrix(c(rn, rN), nrow=2, byrow=TRUE)\n")
	f.write("barplot(rA, ylim=c(0,round(max(s)/4)), names.arg=c(0:(length(rn)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Linker degree / Degree\", ylab=\"Number of nodes\")\n")

    # Linker degree ratio at level 2
    non_seed_ld2_ratio_counts = [ 0 ] * 11
    seed_ld2_ratio_counts = [ 0 ] * 11
    for v, values in node_to_values.iteritems():
	d, ld, d2, ld2 = values
	if ld2 == 0:
	    ratio = 0
	else:
	    ratio = float(ld2) / d2
	ratio = int(ratio * 10)
	if v in seeds:
	    seed_ld2_ratio_counts[ratio] += 1
	else:
	    non_seed_ld2_ratio_counts[ratio] += 1
    f.write("rn2<-c(%s)\n" % ",".join(map(str, seed_ld2_ratio_counts)))
    f.write("rN2<-c(%s)\n" % ",".join(map(str, non_seed_ld2_ratio_counts)))
    if scale_by_log:
	f.write("rA2<-matrix(c(f(rn2), f(rN2+rn2)-f(rn2)), nrow=2, byrow=TRUE)\n")
	f.write("barplot(rA2, yaxt=\"n\", names.arg=c(0:(length(rn2)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Linker degree level2 / Degree level2\", ylab=\"Number of nodes (Log scale)\")\n")
	f.write("axis(2, 0:5, labels=c(0,%s), las=2)\n" % ",".join(map(str, [ 10**i for i in xrange(5) ])))
    else:
	f.write("rA2<-matrix(c(rn2, rN2), nrow=2, byrow=TRUE)\n")
	f.write("barplot(rA2, ylim=c(0,round(max(s)/4)), names.arg=c(0:(length(rn2)-1)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Linker degree level2 / Degree level2\", ylab=\"Number of nodes\")\n")

    connected_components = networkx.connected_components(g)
    connected_component_sizes = map(len, connected_components)
    max_size = max(connected_component_sizes)
    connected_component_seed_counts = [ 0 ] * (max_size + 1)
    connected_component_non_seed_counts = [ 0 ] * (max_size + 1)
    for connected_component in connected_components:
	for i in connected_component:
	    if i in seeds:
		connected_component_seed_counts[len(connected_component)] += 1
	    else:
		connected_component_non_seed_counts[len(connected_component)] += 1
    f.write("c<-c(%s)\n" % ",".join(map(str, connected_component_seed_counts)))
    f.write("C<-c(%s)\n" % ",".join(map(str,  connected_component_non_seed_counts)))
    if scale_by_log:
	f.write("cA<-matrix(c(f(c), f(C+c)-f(c)), nrow=2, byrow=TRUE)\n")
	#f.write("barplot(cA, yaxt=\"n\", log=\"x\", xaxp=c(0,length(c),1), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Connected component size (Log scale)\", ylab=\"Number of nodes (Log scale)\")\n")
	f.write("barplot(cA, yaxt=\"n\", xaxt=\"n\", legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Connected component size (Log scale)\", ylab=\"Number of nodes (Log scale)\")\n")
	f.write("axis(2, 0:5, labels=c(0,%s), las=2)\n" % ",".join(map(str, [ 10**i for i in xrange(5) ])))
	f.write("axis(1, seq(1,length(c),round(length(c)/5)), labels=seq(1,length(c),round(length(c)/5)))\n")
    else:
	f.write("cA<-matrix(c(c, C), nrow=2, byrow=TRUE)\n")
	f.write("barplot(cA, ylim=c(0,round(max(s)/4)), names.arg=c(1:length(c)), legend.text=c(\"seed\",\"all\"), col=heat.colors(2), xlab=\"Connected component size\", ylab=\"Number of nodes\")\n")

    f.write("mtext(\'%s\', outer=TRUE, line=-1)\n" % title) 
    f.write("dev.off()\n")
    f.close()
    return