Graficación de log-bin distribuciones de grado de red

A menudo he encontrado y realizado distribuciones de grado largo / histogtwigs de redes complejas como las que se muestran a continuación. Hacen el extremo pesado de estas colas, bueno, muy pesado y lleno de muchas observaciones:

Distribución clásica de títulos de cola larga.

Sin embargo, muchas de las publicaciones que leo tienen distribuciones de grado mucho más limpias que no tienen esta acumulación al final de la distribución y las observaciones están espaciadas de manera más uniforme.

! Distribución clásica de títulos de cola larga.

¿Cómo se hace un gráfico como este con NetworkX y matplotlib ?

Utilice el registro de registros ( ver también ). Aquí está el código para tomar un objeto Counter que representa un histogtwig de valores de grado y registrar en el registro la distribución para producir una distribución más dispersa y suave.

 import numpy as np def drop_zeros(a_list): return [i for i in a_list if i>0] def log_binning(counter_dict,bin_count=35): max_x = log10(max(counter_dict.keys())) max_y = log10(max(counter_dict.values())) max_base = max([max_x,max_y]) min_x = log10(min(drop_zeros(counter_dict.keys()))) bins = np.logspace(min_x,max_base,num=bin_count) # Based off of: http://stackoverflow.com/questions/6163334/binning-data-in-python-with-scipy-numpy bin_means_y = (np.histogram(counter_dict.keys(),bins,weights=counter_dict.values())[0] / np.histogram(counter_dict.keys(),bins)[0]) bin_means_x = (np.histogram(counter_dict.keys(),bins,weights=counter_dict.keys())[0] / np.histogram(counter_dict.keys(),bins)[0]) return bin_means_x,bin_means_y 

Generando una red clásica sin escala en NetworkX y luego trazando esto:

 import networkx as nx ba_g = nx.barabasi_albert_graph(10000,2) ba_c = nx.degree_centrality(ba_g) # To convert normalized degrees to raw degrees #ba_c = {k:int(v*(len(ba_g)-1)) for k,v in ba_c.iteritems()} ba_c2 = dict(Counter(ba_c.values())) ba_x,ba_y = log_binning(ba_c2,50) plt.xscale('log') plt.yscale('log') plt.scatter(ba_x,ba_y,c='r',marker='s',s=50) plt.scatter(ba_c2.keys(),ba_c2.values(),c='b',marker='x') plt.xlim((1e-4,1e-1)) plt.ylim((.9,1e4)) plt.xlabel('Connections (normalized)') plt.ylabel('Frequency') plt.show() 

Produce la siguiente gráfica que muestra la superposición entre la distribución “en bruto” en azul y la distribución en “binned” en rojo.

Comparación entre raw y log-binned

Los pensamientos sobre cómo mejorar este enfoque o comentarios si me he perdido algo obvio son bienvenidos.