使用Gephi绘制动态网络的三种方法

来源:互联网 发布:文字照片软件 编辑:程序博客网 时间:2024/06/05 19:57

作者:JUDGE_MENT

邮箱:gao19920804@126.com

CSDN博客:http://blog.csdn.net/sinat_23137713

最后编辑时间:2016.12.5  V1.1

声明:

1)该资料结合官方文档及网上大牛的博客进行撰写,如有参考会在最后列出引用列表。

2)本文仅供学术交流,非商用。如果不小心侵犯了大家的利益,还望海涵,并联系博主删除。

3)本人才疏学浅,难免出错,还望各位大牛悉心指正。

4)转载请注明出处。


一、 纵向网络/动态网络是一种包括时间信息的简单网络。你可以想象一下关你的朋友关系网络;节点数和连接数随着时间的增长而增长,属性值也随之变化。如果每个人都有一个"孩子数"属性,这个属性也是可能会增长的《o(* ̄︶ ̄*)o, 还不去生孩子》。我们称之为动态属性,他们的值是与根据特定的时间段相关的。

    纵向网络

    为了使用gephi对这些特征进行建模,我们使用区间的概念来定义一段时间。有两种基本的方式来对纵向网络进行建模,一种是每个网络集合都有一个特定的时间点(一天,一个月,),或是网络片段中的每个元素都有其存在时间。这可以分别看作是离散时间连续时间的表示方式。本文中我们选择第二种方式,因为他更加灵活。

    举例来说:
    如果我们有一个三年包含三个点的网络。下面左边的是方法1(网络集合)在不同的三个时间点。右边是相应的方法2(每个元素)表示使用间隔。(右边n1的右区间是开的,因为这个点只在2008有,2009就没了)
    Gephi中你可以在“数据实验室”中看到时间区间是如何被创建的。如果网络是纵向的,将会有一个时间区间列。这列给出了元素的应该存在的时间区间。你可以通过在数据实验室配置对话框,开启展示时间区间图表选项,这样你就可以可视化了。

    二、 导入动态GEXF文件

      GEXF文件: XML格式,可扩展语言。包含动态网络(第二种方法)所有信息。
      你在GEXF中增加开始和结束的位置就是设置一个点或边的开始或消失。

      1、基本的例子:

        下面是一个2007-2009年有三个点的动态网络例子。
        <?xml version="1.0" encoding="UTF-8"?><gexfxmlns="http://www.gexf.net/1.1draft"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.gexf.net/1.1draft                             http://www.gexf.net/1.1draft/gexf.xsd"      version="1.1">  <graphmode="dynamic"defaultedgetype="directed">    <nodes>      <nodeid="n1"label="Node 1"start="2007"endopen="2009" />      <nodeid="n2"label="Node 2"start="2007"end="2009" />      <nodeid="n3"label="Node 3"start="2008"end="2009" />    </nodes>    <edges>      <edgesource="n1"target="n2" />      <edgesource="n1"target="n3"start="2008"/>      <edgesource="n3"target="n2"start="2008"endopen="2009"/>    </edges>  </graph></gexf>
        注意以下几点:
        1. 我们将图模式设为“dynamic”,这是必须的,因为GEXF格式也可以展现静态图。
        2. 对于闭区间的就用startend;如果是开区间的就用startopenendopen
        3. 不强制一定要对于每一个元素都设定一个开始和结束时间。如果不设置自动创建一个[-infinity,+infinity]这么个时间间隔,从正无穷到负
        无穷。如果只有一个边界被定义了,像上诉代码第二条边似的,那么将会自动变成[2009,+inf].

          2、动态属性

            上面的例子告诉我们如何通过时间节点、边的添加和移除,来展现网络的拓扑结构。现在让我们来演示一下gephi如何展现随着时间变化的属性值。下面是一个例子,节点拥有一个价格属性。
            <gexfxmlns="http://www.gexf.net/1.1draft"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.gexf.net/1.1draft                             http://www.gexf.net/1.1draft/gexf.xsd"      version="1.1">  <graphmode="dynamic"defaultedgetype="directed">    <attributesclass="node"mode="dynamic">      <attributeid="price"title="Price"type="float"/>    </attributes>    <nodes>      <nodeid="n1"label="Node 1"start="2007"endopen="2009" >      <attvalues>        <attvaluefor="price"value="25.5"start="2007"end="2008"/>        <attvaluefor="price"value="42.5"start="2008"/>      </attvalues>      </node>      <nodeid="n2"label="Node 2"start="2007"end="2009" >      <attvalues>        <attvaluefor="price"value="12"start="2008"/>      </attvalues>      </node>      <nodeid="n3"label="Node 3"start="2008"end="2009" >      <attvalues>        <attvaluefor="price"value="40.5"start="2008"end="2009" />      </attvalues>      </node>    </nodes>    <edges>      <edgesource="n1"target="n2" />      <edgesource="n1"target="n3"start="2008"/>      <edgesource="n3"target="n2"start="2008"endopen="2009"/>    </edges>  </graph></gexf>
            attvalues:属性值
            注意以下几点:
            不强制到处设置属性值,为了防止没值,我们可以使用默认值。
            对于节点n2,他的价格“12”从2008年开始,但是没有定义结束时间,这会自动调整为[2008+infinity]

            3. 动态权值

              正常来说一个边的权值直接定义了一个边元素中,然后定一个值。定义了一个动态权值属性允许重写这个值,提供了对动态权值的支持。
              方法就是定义边的时候加上“weight”。然后,使用“attvalue”来设置weight的变化。跟节点属性那一样。
              <attributes class="edge" mode="dynamic">   <attribute id="weight" title="Weight" type="float"/></attributes>

              三. 时间列转换为动态网络

                问题是非常简单的,如何转换时间列为动态网络,例如如何转换一年的数值列成为一个动态网络。
                想象你和一些朋友的社交网络。每个节点都是一个朋友,一个属性列是你遇到一个朋友的日期。问题是我们怎样才能将这个列转换成一个动态的时间间隔,然后通过时间线探索整个网络。

                步骤1:点击数据实验室-合并列
                  步骤2:分别把左窗格跟时间有关的列移到右边。如果你有开始时间和结束时间,那么就将这两列移到右边。在下图中,'First Met'只是一个开始列。然后选择时间间隔在那个选择器当中。
                    注意,开区间似乎已经被弃用了
                    步骤3:选择哪列是开始,选择哪列是结束。如果没有结束时间,就留空。如果列是数字化的(整数,浮点型,长浮点型),那么就选择“parse numbers”。如果数据是string形式的,他们也可以被解析转换为时间间隔。我们的“fiist met”列就是一年中的某一天,就是一个数字而已。

                      四. 使用时间框架,导入多个静态的GEXF充当动态的GEXF

                        这个方法教你如何通过一些时间点(GEXF文件)创建一个纵向/动态网络。如果你有这么一个不同时间点的复杂网络,然后想去看随着时间改变网络和它的属性都是如何变化的,那么请看这个方法。
                        注意,这个方法的实现仍然处于试验阶段,而且可能不会在所有的情况下工作。一定要确认以下几点:
                        • 不同文件中,节点标识符完全要一样(至少标签要一致)。
                        • GEXF文件中设置为static
                        • gephi工作区要保持干净,不要有别的图
                        • 属性列在所有GEXF中都是一样的

                        1. 数据集

                        假如说我们有三个静态GEXF,分别是2007年的GEXF,2008年的GEXF和2009年的GEXF。
                        2007年的静态网络如下,注意价格属性:
                        <?xml version="1.0" encoding="UTF-8"?><gexfxmlns="http://www.gexf.net/1.1draft"version="1.1">  <graphmode="static"defaultedgetype="directed">    <attributesclass="node"type="static">      <attributeid="price"title="Price"type="int"/>    </attributes>    <nodes>      <nodeid="1"label="Node 1">        <attvaluefor="price"value="12"/>      </node>      <nodeid="2"label="Node 2">        <attvaluefor="price"value="8"/>      </node>      <nodeid="3"label="Node 3">        <attvaluefor="price"value="5"/>      </node>    </nodes>    <edges>      <edgesource="1"target="2"weight="1" />      <edgesource="1"target="3"weight="2" />    </edges>  </graph></gexf>
                        2008年的静态网络如下,节点“3”消失了,一个节点出现“4”。价格和边缘的权重也已经改变了。
                        <?xml version="1.0" encoding="UTF-8"?><gexfxmlns="http://www.gexf.net/1.1draft"version="1.1">  <graphmode="static"defaultedgetype="directed">    <attributesclass="node"type="static">      <attributeid="price"title="Price"type="int"/>    </attributes>    <nodes>      <nodeid="1"label="Node 1">        <attvaluefor="price"value="15"/>      </node>      <nodeid="2"label="Node 2">        <attvaluefor="price"value="6"/>      </node>      <nodeid="4"label="Node 4">        <attvaluefor="price"value="8"/>      </node>    </nodes>    <edges>      <edgesource="1"target="2"weight="4" />      <edgesource="1"target="4"weight="3" />      <edgesource="2"target="4"weight="1" />    </edges>  </graph></gexf>
                        静态网络在2009年, 节点“3”回来了,节点“2”消失了, 并且再次改变价格。
                        <?xml version="1.0" encoding="UTF-8"?><gexfxmlns="http://www.gexf.net/1.1draft"version="1.1">  <graphmode="static"defaultedgetype="directed">    <attributesclass="node"type="static">      <attributeid="price"title="Price"type="int"/>    </attributes>    <nodes>      <nodeid="1"label="Node 1">        <attvaluefor="price"value="10"/>      </node>      <nodeid="3"label="Node 3">        <attvaluefor="price"value="3"/>      </node>      <nodeid="4"label="Node 4">        <attvaluefor="price"value="12"/>      </node>    </nodes>    <edges>      <edgesource="1"target="3"weight="5" />    </edges>  </graph></gexf>

                        2. 导入Gephi

                          按照如下步骤,可以在一个空项目中导入你的这几个GEXF文件:
                          步骤1导入第一个GEXF文件,并在导入报告是选择Time Frame,单击OK。这将显示一个设置对话框。

                          步骤2选择一个日期或一个数字作为时间。默认选择是一个数字,这里我们把2007年输入。单击OK,文件导入。

                          步骤3: 现在你重复步骤2。只是相应的时间,第二个文件选择2008、..2009等。

                          结果就会得到在Gephi里出现的纵向/动态网络,节点和边有他们相应的时间段。同样的,所有属性都是动态属性。数据集中的“价格”属性是DYNAMIC_INTEGER格式的列。此外,边的权重也是动态的。
                          2 0
                          原创粉丝点击