【发布时间】:2021-04-13 12:32:01
【问题描述】:
我有一个如下图所示的 Networkx 图 (image source)
我执行边缘攻击并观察结果子图节点处的值变化。
例如, 如果我攻击边缘 (a,2):边缘 (a, 2) 和 (2, 1) 将被删除。稍微解释一下,当边 (a, 2) 被攻击时,节点 2 的度数
上述攻击导致子图
每次攻击边缘时,观察到的标记为e的终端节点的值随时间变化。假设我执行了 5 次(攻击 = 5)次攻击,我有一个 time x attack 矩阵(时间 = 25,攻击 = 5)来存储节点 e 的时间序列数据。
我想就如何可视化这些攻击对节点e 值随时间变化的影响寻求建议。
编辑:
您希望能够从您的 可视化?
我想查看对哪个边缘的攻击对e 观察到的时间过程值的影响最大。我们可以想象这是一个运输网络,节点的值反映了到达该位置/节点的产品数量。从源节点b,货物被运送到目标节点e。观察到的是边被攻击后节点值的变化,没有观察到边值。
请找出用于攻击边缘的代码
import networkx as nx
import matplotlib.pyplot as plt
def attack(G):
print(G.edges())
for i, edge in enumerate(G.edges()):
no_attack = [(6, 9), (3, 16)]
if edge not in no_attack:
data = {}
print(f'attacking edge {edge}')
H = G.copy()
# attack an edge
H.remove_edges_from(ebunch=[edge])
n = len(G.nodes)
retain_node_ids = [9, 3]
H.add_edges_from([(u, v) for u in retain_node_ids for v in (n+1, n+2)])
# remove nodes with degree < 2
H = nx.k_core(H, k=2)
H.remove_nodes_from([n + 1, n + 2])
# graph_utils_py.draw_graph3d(H, fig=2, show=True)
# H = nx.convert_node_labels_to_integers(H, first_label=1, ordering='default', label_attribute=None)
# delete connected nodes and edges
diff_nodes = set(G.nodes()).difference(H.nodes())
diff_edges = {e for e in G.edges() for n in diff_nodes if n in e}
print(f"deleting connected nodes {diff_nodes} ...")
print(f"deleting connected edges {diff_edges} ...")
data['diff_nodes'] = list(diff_nodes)
data['diff_edges'] = list(diff_edges)
data['edge'] = edge
if __name__ == '__main__':
n = 20
G = nx.gnm_random_graph(n=20, m=30, seed=1)
# nx.draw(G, with_labels=True)
# plt.show()
retain_node_ids = [11, 4]
G.add_edges_from([(u, v) for u in retain_node_ids for v in (n, n + 1)])
G = nx.k_core(G, k=2)
G.remove_nodes_from([n, n + 1])
# nx.draw(G, with_labels=True)
# plt.show()
G = nx.convert_node_labels_to_integers(G, first_label=1, ordering='default', label_attribute=None)
nx.draw(G, with_labels=True)
plt.show()
attack(G)
编辑2: 下面发布的答案建议通过改变不透明度和设置不同的配色方案来可视化边缘攻击。不幸的是,这无济于事。必须为每次攻击创建不同的图像。我还在寻找其他建议。
EDIT3:澄清一下我究竟想要可视化什么以保持简单。
我正在寻找如下所示的交互式图表。
可以单击被攻击的边缘,LHS 图将显示在目标节点上进行的观察。虚线是由于对给定边的攻击(存储在变量edge中)而受到影响的边(存储在代码中的变量diff_edges中)。
如果在攻击链接后受影响的边缘有重叠,我们可以将其显示为具有相应颜色映射的多条线。交互式图表将帮助用户选择边缘攻击来比较节点 e 的观察结果。可以通过改变不透明度/线条样式/颜色来显示被攻击的边缘。
EDIT4:下面发布的答案有帮助。但是当受影响的边缘重叠时就会出现问题。
例如, 攻击(H,(6, 4),颜色='红色') 攻击(H, (5, 4), color='yellow')
给予
颜色重叠,很难想象。如果我们可以将受影响的边缘彼此相邻绘制而不重叠,如上面在edit3中发布的图片所示,那就太好了。
【问题讨论】:
-
有什么建议吗?
-
您希望能够从可视化中看到或识别哪些信息?能否详细说明一下边值是如何变化的?
-
@templatetypedef 你能看看编辑吗?
-
@templatetypedef 请在原帖中找到更新的用于攻击边缘的代码
-
@templatetypedef 有什么建议吗?
标签: python-3.x graph data-visualization networkx graph-visualization