【问题标题】:Python visualization library for networks and dependencies用于网络和依赖项的 Python 可视化库
【发布时间】:2022-02-16 19:33:51
【问题描述】:

这是一个更普遍的问题,询问能够展示具有以下标准的网络的 Python 库:

  • 节点大小不同,具体取决于度量标准(例如,所有其他节点接收到的某个变量 X 的总和)
  • 节点之间的连接方向(例如,节点 A 向节点 B 发送 X 单元,而节点 B 向节点 A 发送 Y 单元,向节点 C 发送 Q 单元) - 因此节点可以同时接收和发送。
  • 连接器之间的“厚度”可能会有所不同,具体取决于它们接收/发送的单位数量
  • 动态 UI - 网络应该是动态的,例如用户可选择的日期范围等过滤器。

我检查了NetworkxPlotlty,但是它们不满足连接器的方向标准。

有人知道吗?

这样的表示也可以: https://viz.ged-project.de/

【问题讨论】:

  • “方向标准”是什么意思? networkx 支持有向图。
  • 我的错! - 使用“方向标准”,我的意思是连接线可以显示一个节点是另一个节点的输入还是输出,并且连接线的粗细标准可以很好地展示一个节点接收或发送多少相对于网络中的整体连接。同时两个节点之间可以相互接收和发送。不过谢谢指点!我将检查 Networkx 的 plotly 实现,看看它是否可以动态实现。其他比较建议更受欢迎!

标签: python dependencies networkx visualization


【解决方案1】:

您是正确的,igraph、networkx 和 plotly 默认情况下对两条双向边使用相同的路径,这样一条边会遮挡另一条边。这里的关键词是“默认”。如果您绘制曲线边而不是直边,则双向边使用单独的路径。

如果您确实想要直边,则必须使用netgraph,它为双向边使用单独的路径。就个人而言,我更喜欢使用颜色而不是宽度来可视化边缘权重,但netgraph 当然支持使用任何一种(或两者)。

import matplotlib.pyplot as plt
import networkx as nx
import netgraph # pip install netgraph

cube = nx.cubical_graph().to_directed()
cube_with_weights = [(v1, v2, np.random.rand()) for (v1, v2) in cube.edges()]
edge_width = {(v1, v2) : 2 * w for (v1, v2, w) in cube_with_weights}
node_size = {v : 5 * np.random.rand() for v in cube.nodes()}

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(6, 3))

g1 = netgraph.Graph(cube_with_weights,
                    node_size  = node_size,
                    edge_width = 2,
                    edge_cmap  = 'RdGy', 
                    arrows     = True,
                    ax         = ax1
)
g2 = netgraph.Graph(cube_with_weights,
                    node_layout = g1.node_positions,
                    node_size   = node_size,
                    edge_color  = 'black',
                    edge_width  = edge_width,
                    arrows      = True,
                    ax          = ax2
)

plt.show()

当涉及到动态 UI 和过滤操作时,无论您使用哪个库,您都必须自己实现这些。但是,对于 igraph、networkx 和 plotly,没有(简单的)方法可以在绘制后索引、更改或删除艺术家,因此您必须在每次更改后重新绘制完整的图表。

netgraph 以易于访问的方式公开 matplotlib 艺术家。因此,在过滤操作之后更改或隐藏艺术家非常简单。例如:

node_of_interest = 0
g1.node_artists[node_of_interest].set_visible(False)
fig.canvas.draw()

edge_of_interest = (1, 2)
g1.edge_artists[edge_of_interest].set_facecolor('cyan')
fig.canvas.draw()

免责声明:我写这篇文章是因为我对网络可视化的状态感到沮丧。所以我的观点肯定是有偏见的。

【讨论】:

    猜你喜欢
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2020-07-17
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多