在python的Networkx中制作动态图表

时间:2016-01-07 03:37:05

标签: python dynamic graph timestamp networkx

我正在尝试使用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中使用它。

我该怎么办?

2 个答案:

答案 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。重要的是边缘应该具有startend属性为double。节点也一样。然后每个边都应该有一个三元组列表:

[{'start': s, 'end' or 'endopen': e, 'weight': 4}, {..}]

答案 1 :(得分:1)

我推荐DyNetX

是用于描述,建模和研究的Python语言软件包 动态复杂网络。