我正在尝试使用networkx制作动态图表。例如,当我使用:
import networkx as nx
G = nx.Graph()
它创建一个空图G,默认情况下是静态的。如何将其更改为动态?某些节点/边可能存在于一个时间戳中,但不存在于其他时间戳中。我该如何融入时间? 举个例子,假设我的图有三个节点'a','b'和'c'。在时间t1,'a'和'b'之间只有一条边。在时间t2,边缘的配置改变,并且在该时间戳中,所有节点彼此连接。说:
G.add_edge('a','b',timestamp='t1')
G.add_node('c',timestamp='t1')
G.add_edge('a','b',timestamp='t2')
G.add_edge('a','c',timestamp='t2')
G.add_edge('b','c',timestamp='t2')
但这不起作用!
我需要这样做的原因是我想以gexf格式保存图形以在Gephi中使用它。
我该怎么办?
答案 0 :(得分:3)
使用nx.Graph()
,两个节点之间不能有多个边缘。
但是,如果您使用nx.MultiGraph()
,则可以。
您可以做的是使用简单的计数器索引图形的节点,将节点ID和时间戳设置为属性。如果要使用nx.get_node_attributes(G, 'id')
选择子集,则必须根据其属性过滤节点。
一般来说,NetworkX不适用于动态图表。您可以使用专为此设计的Stinger。
编辑:对于Gephi来说,它完全不同。您应该在GEXF中导出图表并祈祷Gephi阅读它。基本上是这样的:<?xml version="1.0" encoding="UTF-8"?>
<gexf xmlns="http://www.gexf.net/1.2draft" version="1.2" xmlns:viz="http://www.gexf.net/1.2draft/viz" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.gexf.net/1.2draft http://www.gexf.net/1.2draft/gexf.xsd">
<meta lastmodifieddate="2016-01-07">
<creator>Gephi 0.8.1</creator>
<description></description>
</meta>
<graph defaultedgetype="directed" timeformat="double" mode="dynamic">
<attributes class="node" mode="dynamic">
<attribute id="score" title="score" type="integer"></attribute>
</attributes>
<attributes class="edge" mode="dynamic">
<attribute id="weight" title="Weight" type="float"></attribute>
</attributes>
<nodes>
<node id="n0" label="n0" start="2001.0" end="2022.0">
<attvalues>
<attvalue for="score" value="4" start="2001.0" end="2010.0"></attvalue>
<attvalue for="score" value="3" start="2011.0" end="2011.0"></attvalue>
</attvalues>
<viz:size value="10.0"></viz:size>
<viz:position x="46.152466" y="-287.68558" z="0.0"></viz:position>
<viz:color r="25" g="213" b="100"></viz:color>
</node>
<node id="n1" label="n1" start="2001.0" end="2024.0">
<attvalues>
<attvalue for="score" value="2" start="2001.0" end="2007.0"></attvalue>
<attvalue for="score" value="3" start="2008.0" end="2008.0"></attvalue>
</attvalues>
<viz:size value="10.0"></viz:size>
<viz:position x="-293.90674" y="-442.9504" z="0.0"></viz:position>
<viz:color r="25" g="213" b="100"></viz:color>
</node>
</nodes>
<edges>
<edge source="n0" target="n1">
<attvalues>
<attvalue for="weight" value="3.0" start="2010.0" endopen="2012.0"></attvalue>
<attvalue for="weight" value="4.0" start="2012.0" endopen="2014.0"></attvalue>
<attvalue for="weight" value="4.0" start="2014.0" endopen="2016.0"></attvalue>
<attvalue for="weight" value="4.0" start="2016.0" endopen="2018.0"></attvalue>
<attvalue for="weight" value="5.0" start="2018.0" endopen="2020.0"></attvalue>
<attvalue for="weight" value="6.0" start="2020.0" endopen="2022.0"></attvalue>
<attvalue for="weight" value="8.0" start="2022.0" endopen="2024.0"></attvalue>
<attvalue for="weight" value="9.0" start="2024.0" end="2026.0"></attvalue>
</attvalues>
</edge>
</edges>
</graph>
</gexf>
我不确定您是否可以通过Networkx直接实现这一目标。 People have tried。重要的是边缘应该具有start
和end
属性为double。节点也一样。然后每个边都应该有一个三元组列表:
[{'start': s, 'end' or 'endopen': e, 'weight': 4}, {..}]
答案 1 :(得分:1)
我推荐DyNetX,
是用于描述,建模和研究的Python语言软件包 动态复杂网络。