【问题标题】:Update the networkx plot for different edge weights using slider使用滑块更新不同边缘权重的 networkx 图
【发布时间】:2021-10-12 07:40:07
【问题描述】:

我正在尝试使用滑块显示边权重对 networkx 图结构的影响。为此,我从三列 csv 文件中导入 networkx 图,其中包含 node1、node2、权重(0 到 1)的信息。

最初,我正在考虑构建网络并绘制它的所有边缘。现在,我想在滑块中嵌入权重信息,这样当我移动滑块时,我只会得到那些权重大于滑块值的边。我遇到以下问题:

  • 网络在滑块内绘制,当我在更新功能之外绘制它时,它没有更新。

  • 网络在变化,但不是根据滑块值。

我已经尝试了以下代码:

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

f = open("network.csv",'r')
G = nx.Graph()
net = [line.split() for line in f]
r = 0.0
for i in net:
    if float(i[6]) >= r:
        G.add_edge(i[0], i[1], weight=i[6])
pos = nx.spring_layout(G)
axnet = plt.axes([0.25, 0.2, 0.65, 0.5])
new_net = Slider(axnet, 'Cf', 0.0, 1.0, 1.0)
def update(val):
    r = new_net.val
    edges = [(i[0],i[1]) for i in net if i[6] <= r]
    G.remove_edges_from(edges)
    nx.draw_random(G)
    return()
new_net.on_changed(update)
# G.update()
# plt.clf()
plt.show()

【问题讨论】:

    标签: python matplotlib slider networkx


    【解决方案1】:

    在下面的代码中,我生成了一个可以使用的随机网络。

    需要说明的几点:

    • 仅当阈值变高时,从网络中删除边缘才有效 每次。为了确保边缘被添加回较低的阈值设置, 每次更新滑块时,我都会重新创建图表。
    • 此网络中的每条边都有不同的权重,范围从 0 到 29/30; 所以滑块每移动 3% 就会增加或减少一个边缘。
    • pos 字典默认使用从 -1 到 1 的原点坐标。
    • 我正在播种随机库和 spring_layout,以确保 结果每次都是一样的。
    import random
    import networkx as nx
    import matplotlib.pyplot as plt
    from matplotlib.widgets import Slider
    
    def remake_graph(r):
        G.clear()
        for i in net:
            if float(i[6]) >= r:
                G.add_edge(i[0], i[1], weight=i[6])
    
    def update(val):
        r = val
        # edges = [(i[0],i[1]) for i in net if i[6] <= r]
        # G.remove_edges_from(edges)
        remake_graph(r)
        ax.clear()
        pos = nx.spring_layout(G, seed=42)
        nx.draw(G, pos, ax)
        fig.canvas.draw_idle()
        pass
    
    random.seed(42)
    nodesel = range(10)
    max_edges = 30
    rn = lambda : random.choice(nodesel)
    net = [(rn(), rn(), 0, 0, 0, 0, i/max_edges) for i in range(max_edges)]
    r = 0.0
    G = nx.Graph()
    remake_graph(r)
    
    fig, ax = plt.subplots()
    pos = nx.spring_layout(G, seed=42)
    nx.draw(G, pos, ax)
    plt.subplots_adjust(bottom=0.25)
    # Make a horizontal slider to control the frequency.
    axcolor = 'lightgoldenrodyellow'
    axfreq = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor=axcolor)
    freq_slider = Slider(
        ax=axfreq,
        label='Weight treshold',
        valmin=0.0,
        valmax=1.0,
        valinit=r,
    )
    freq_slider.on_changed(update)
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      相关资源
      最近更新 更多