如何使用networkx(和d3js)计算和存储图形及其所有修改?

2024-03-29 09:53:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用这种形式的简单无向关系图的形式来表示由各种相关项组成的数据集:

Simple graph (D3JS force-directed graph)

数据集最初以日志文件的形式显示,在修改后,每个日志行都有一个项目的副本。这包括项的属性以及与之相关的其他项。在

下面是一个基本示例:

logs = {
    "item_1": {
        "color": "blue",
        "relatives": []
    },
    "item_2": {
        "color": "green",
        "relatives": []
    },
    "item_1": {
        "color": "blue",
        "relatives": ["object_1"]
    },
    "item_1": {
        "color": "red",
        "relatives": []
    }
}

(如果有用的话,日志最初是以复杂XML的形式出现的,我用xmltodict将其转换为字典)

这里,第三个日志表示在条目1和条目2之间创建链接,第四个日志表示删除相同的链接(除了更改条目1的属性之外)。在

因此,用图形表示,这是一个添加蓝色“1”节点,然后添加一个绿色“2”节点,然后连接这两个节点,然后移除项目1和项目2之间的边并更改节点“1”的颜色。在

目前,我可以用类似下面的代码创建图形:

^{2}$

我的问题如下:

如何妥善处理关系删除的情况?在

我的代码允许您用新节点和链接填充图形,并在属性更改时更新属性,但我不知道如何检测链接的删除。在

我想看看使用jsondiff库计算diff是否有帮助。通过显式jsondiff语法,我可以得到以下形式的日志:

{UPDATE: {"color":"red","relative": {DELETE:[0]}}}}}

但是,这需要在内存中保存所有对象的当前状态,以便知道图中哪个链接对应于要删除的第0个元素。所以我考虑传递一个包含networkx相关项列表的对象作为节点(而不是单独的标签)。有更好的方法吗?在

如何访问在给定的日志行之后构建的图形?在

这是我的主要问题。我需要能够在任何时候看到图形的状态(即,在任何选定的日志行之后)。存储图形的方法是什么让我可以正确地执行此操作?天真的是,每一刻都有一个图形,但它很快变得异常沉重(我的示例数据集有几千个日志,我必须能够处理更大的日志)。也许通过将链接的生存期放入其属性中,并将其用作显示或不显示边缘的条件?在

理想的解决方案是用d3.js显示一个动画,它直观地表示数据集的演变。在

提前谢谢你的帮助。在


Tags: 数据项目图形示例属性节点关系链接
1条回答
网友
1楼 · 发布于 2024-03-29 09:53:31

不是很鼓舞人心吧?在

我继续思考我的问题,得出了以下解决方案,它回答了这两个问题(管理链接的消失和存储图形随时间的演变):在每个链接中写下出生和死亡的日期。在

因此,在处理了日志文件之后,我得到了一个四元组的列表(i, r, b, d),每一个都代表一个项目{}和第二个相关项目{}之间的链接,它在日期b出现在图中,在日期d时消失。在

我发现这种表示图演化的方式叫做链接流:Clémence Magnien's lecture (French),并且Tiphaine Viard's Thesis来讨论它。在

至于使用d3.js实现的动画可视化,我在this SO thread中找到了一个非常接近的答案,特别是d3.js代码的例子,我只需要根据链接的出生和死亡属性进行调整。在

相关问题 更多 >