''' altgraph.GraphStat - Functions providing various graph statistics ================================================================= ''' def degree_dist(graph, limits=(0, 0), bin_num=10, mode='out'): ''' Computes the degree distribution for a graph. Returns a list of tuples where the first element of the tuple is the center of the bin representing a range of degrees and the second element of the tuple are the number of nodes with the degree falling in the range. Example:: .... ''' deg = [] if mode == 'inc': get_deg = graph.inc_degree else: get_deg = graph.out_degree for node in graph: deg.append(get_deg(node)) if not deg: return [] results = _binning(values=deg, limits=limits, bin_num=bin_num) return results _EPS = 1.0/(2.0**32) def _binning(values, limits=(0, 0), bin_num=10): ''' Bins data that falls between certain limits, if the limits are (0, 0) the minimum and maximum values are used. Returns a list of tuples where the first element of the tuple is the center of the bin and the second element of the tuple are the counts. ''' if limits == (0, 0): min_val, max_val = min(values) - _EPS, max(values) + _EPS else: min_val, max_val = limits # get bin size bin_size = (max_val - min_val)/float(bin_num) bins = [0] * (bin_num) # will ignore these outliers for now for value in values: try: if (value - min_val) >= 0: index = int((value - min_val)/float(bin_size)) bins[index] += 1 except IndexError: pass # make it ready for an x,y plot result = [] center = (bin_size/2) + min_val for i, y in enumerate(bins): x = center + bin_size * i result.append((x, y)) return result