使用 nx.degree_histogram 绘制图的度分布

新手上路,请多包涵

我尝试使用以下代码绘制 networkx.DiGraph G 的度数分布:

 def plot_degree_In(G):
    in_degrees = G.in_degree()
    in_degrees=dict(in_degrees)
    in_values = sorted(set(in_degrees.values()))
    in_hist = [list(in_degrees.values()).count(x) for x in in_values]

    plt.figure()
    plt.grid(False)
    plt.loglog(in_values, in_hist, 'r.')
    #plt.loglog(out_values, out_hist, 'b.')
    #plt.legend(['In-degree', 'Out-degree'])
    plt.xlabel('k')
    plt.ylabel('p(k)')
    plt.title('Degree Distribution')
    plt.xlim([0, 2*100**1])

但是后来我意识到这不是正确的方法,所以我将其更改为:

 def plot_degree_dist(G):
    degree_hist = nx.degree_histogram(G)
    degree_hist = np.array(degree_hist, dtype=float)
    degree_prob = degree_hist/G.number_of_nodes()
    plt.loglog(np.arange(degree_prob.shape[0]),degree_prob,'b.')
    plt.xlabel('k')
    plt.ylabel('p(k)')
    plt.title('Degree Distribution')
    plt.show()

但这给了我一个没有数据的空图。

原文由 Amit Mek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

一种使用测试代码打印(进-加出-)度直方图的方法:

 import matplotlib.pyplot as plt
import networkx as nx

def plot_degree_dist(G):
    degrees = [G.degree(n) for n in G.nodes()]
    plt.hist(degrees)
    plt.show()

plot_degree_dist(nx.gnp_random_graph(100, 0.5, directed=True))

可以通过向 plt.hist 添加第二个参数来调整直方图的 bin 数。

原文由 user10605163 发布,翻译遵循 CC BY-SA 4.0 许可协议

我们可以使用 nx.degree_histogram ,它返回网络中度数的频率列表,其中度值是列表中的相应索引。但是,此功能仅适用于无向图。我将首先说明如何在无向图的情况下使用它,然后显示一个有向图的示例,我们是否可以看到如何通过稍微调整 nx.degree_histogram 来获得度分布。

  • 对于无向图

对于有向图,我们可以使用 nx.degree_histogram 。下面是一个使用随机图生成器 nx.barabasi_albert_graph 的示例。

通常,在绘制度分布时采用 xy 轴的对数,这有助于查看 networkx 是否 无标度(度分布遵循幂律的网络), 所以我们可以使用 matplotlib 的 plt.loglog :

 m=3
G = nx.barabasi_albert_graph(1000, m)

degree_freq = nx.degree_histogram(G)
degrees = range(len(degree_freq))
plt.figure(figsize=(12, 8))
plt.loglog(degrees[m:], degree_freq[m:],'go-')
plt.xlabel('Degree')
plt.ylabel('Frequency')

在此处输入图像描述


  • 对于有向图

对于有向图,我们可以稍微修改函数 nx.degree_histogram 来考虑入度和出度:

 def degree_histogram_directed(G, in_degree=False, out_degree=False):
    """Return a list of the frequency of each degree value.

    Parameters
    ----------
    G : Networkx graph
       A graph
    in_degree : bool
    out_degree : bool

    Returns
    -------
    hist : list
       A list of frequencies of degrees.
       The degree values are the index in the list.

    Notes
    -----
    Note: the bins are width one, hence len(list) can be large
    (Order(number_of_edges))
    """
    nodes = G.nodes()
    if in_degree:
        in_degree = dict(G.in_degree())
        degseq=[in_degree.get(k,0) for k in nodes]
    elif out_degree:
        out_degree = dict(G.out_degree())
        degseq=[out_degree.get(k,0) for k in nodes]
    else:
        degseq=[v for k, v in G.degree()]
    dmax=max(degseq)+1
    freq= [ 0 for d in range(dmax) ]
    for d in degseq:
        freq[d] += 1
    return freq

和上面类似,我们可以为入度或/和出度生成一个图。这是一个带有随机比例-gree 图的示例:

 G = nx.scale_free_graph(5000)

in_degree_freq = degree_histogram_directed(G, in_degree=True)
out_degree_freq = degree_histogram_directed(G, out_degree=True)
degrees = range(len(in_degree_freq))
plt.figure(figsize=(12, 8))
plt.loglog(range(len(in_degree_freq)), in_degree_freq, 'go-', label='in-degree')
plt.loglog(range(len(out_degree_freq)), out_degree_freq, 'bo-', label='out-degree')
plt.xlabel('Degree')
plt.ylabel('Frequency')

在此处输入图像描述

原文由 yatu 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题