社会网络分析方法+R实战(自学笔记3)
发布网友
发布时间:2024-10-01 10:52
我来回答
共1个回答
热心网友
时间:2024-11-24 21:37
社会网络分析——网络可视化与美化
作为社会科学家,我们希望讲述关于所研究网络结构和动态的生动故事。可视化和统计是传达这些故事的主要工具。
本教程将教授如何调整网络可视化的美学。在可视化网络时,我们可以调整多个元素。首先,可以改变节点的颜色、大小、形状和标签。其次,可以调整颜色、宽度、曲率和边缘的外观。可以突出显示网络中不同组的位置。
让我们从调整基本的可视化开始。
首先,加载我们在前一篇教程中创建的数据,并将其绘制成网络。下面的代码应该看起来很熟悉。
唯一区别是,我将money_edgelist转换为一个矩阵,与将其绘制为edgelist的图形在同一行中。这称为嵌套函数。可以嵌套的函数数量没有*,但通常情况下,如果将它们分解成多行会更容易阅读。
可视化网络就像输入plot(moneyNetwork)一样简单。但是默认plot出来的网络图特别丑。我们可以调整plot的设置,使结果的可视化更美观。对于igraph plot()函数有许多设置,我们将介绍开始自己制作体面的可视化所需的最低限度设置。
我们可以改变的最基本的东西是节点的大小和颜色。当网络很大时,节点通常会显得太大并且聚集在一起。参数vertex.Size允许您调整节点的大小(顶点是图论中表示节点的术语!)
这是在igraph中更改plot函数设置的基本方法——在网络对象的旁边加上一个逗号,键入想要更改的设置的名称,并将其设置为一个新值。这里我们设置vertex.Size为10。当您不更改任何设置时,R将自动使用默认设置。你可以在该函数的帮助部分找到它们(即输入?plot)
节点有一个难看的浅橙色,我们可以使用vertex.Color将它们的颜色变成更好的颜色。我们还可以通过将vertex.frame.color设置为NA来删除难看的黑色帧。
你可以在R中找到所有命名颜色的列表:stat.columbia.e/~tzhe...
标签太大,而且是蓝色的。我们可以用vertex.label.cex调整标签的大小。我们可以用vertex.label.color来调整颜色。
或者,如果我们想去掉标签,我们可以设置vertex.label到NA。
最后,我们可以使边缘更小和弯曲,给他们更好的美感
但设置不要太过了。如果你设置了edge.curved>1时,它看起来就像面。
网络可视化的一个重要部分是它的布局,它决定了节点在图中的位置。社交网络分析已经开发出了各种各样的布局。它们都试图最小化交叉的边的数量,但使用不同的算法来实现这一目标。一般来说,我使用Kamada Kawai算法或Fruchterman Reingold算法。
Igraph有一组布局函数,当传递一个网络对象时,这些函数返回一个坐标数组,然后可以在绘制该网络时使用。这些坐标应该保存到单独的R对象中,然后在plot函数中调用该对象。它们都有格式:layout DOT算法名。例如,layout.kamada.kawai()或layout.fruchterman.reingold()
Kamada Kawai
Frucherman-Reingold
你可以查看?layout_获得更多选项和细节。
我们可以任意影响这些美学。例如,你可能更喜欢网络边缘是弯曲的而不是直线的样子。然而,我们经常根据我们的经验背景的理论来做决定。如果我们认为种族对网络结构很重要,我们可以根据种族给节点着色。如果我们认为种族和性别都很重要,我们可以根据种族给节点上色,根据性别改变节点的形状。我们也可以根据财富大小来确定节点的大小。我们通常被*一次可视化节点的三个属性(使用颜色、形状和大小),尽管我发现任何超过两个(颜色和大小)的东西都很难解释。
接下来,为了可视化属性是如何分布在网络节点上的,大多数网络项目需要两个独立的数据集。除了创建和加载一个关系数据集(我们在前一篇教程中介绍过)之外,我们还需要第二个数据集来详细描述参与者的属性,我们需要将数据添加到网络中。决定哪些属性是相关的将取决于领域和你的研究问题;如果你在研究芝加哥南部的帮派,你可能会记录演员的帮派成员和住所;如果你对沙特精英之间的商业关系感兴趣,你可能会记录下他们的年龄和血统。
让我们回到Excel,为我们的网络构建一个属性数据集。这种数据集要传统得多:每一行是一个人(或者称为观察结果),每一列符合您为这个人测量的某些属性。这是我为我的家庭货币供应网络制作的一个示例属性数据集的图片。
Hoffman family attributes 家族属性
我将这个属性数据集作为.csv文件保存在我的R目录中。我将把它加载到R中,就像我在前一个教程中对edgelist做的那样(所有这些都应该是练习和熟悉的!)如果没有,请重新阅读前一篇教程)。
这为我们提供了一个data.frame,其中每一行对应一个人,每一列对应网络中人的一个属性,但要在igraph中使用这些属性,我们必须将它们分配给igraph对象(即moneyNetwork)中的节点。
图中的属性分别分配给节点和边。正如在前一篇教程中提到的,顶点是使用V()函数访问的,而边是使用E()函数访问的。然后使用后跟属性名称的美元符号操作符访问属性。例如,如前所述,V(countrysideNetwork)$name将告诉我们网络中所有节点的名称。要更改一个属性,只需使用等号将其设置为其他值。举个例子,这里我改变了网络中节点的名称:
目前,我们的网络除了名称之外没有任何属性。如果我们试图查看节点的性别,结果将是NULL。
因此,我们需要将属性文件中的属性附加到网络中。这样做的方法可能有点复杂。如果我们有一个边缘列表,我们可以使用_from_data_frame()函数而不是graph.edgelist(),并包括属性文件作为顶点参数。不管出于什么原因,在本例中,边列表需要是data.frame,所以不需要将其转换为矩阵。另外,重要的是要注意,igraph假设第一列是名称列,所以要确保情况是这样的!
现在,如果我们看一下我们的网络,我们会看到在attr旁边有更多的。
我们可以用V()$函数查看每一个。例如,这是性别。
在上一节中,我们将属性数据导入到网络对象中,这将允许我们根据节点属性操作网络。让我们从根据性别来处理颜色开始.
为了做到这一点,我们必须根据人们的性别给他们分配颜色。我们使用ifelse函数。ifelse()函数接受三个参数。第一个是测试(计算结果为TRUE或FALSE的东西),第二个是如果测试为TRUE返回什么,第三个是如果测试为FALSE返回什么。
因此,我们设置了一个ifelse函数,它测试一个节点的性别是否为男性,如果为TRUE(即它们是男性),则为其分配颜色为“蓝色”,如果为FALSE(即否则/它们是女性),则为“绿色”。记住,R是区分大小写的,所以如果你的性别变量包含“Male”和“Female”,那么确保你在ifelse语句中放入Male或Female(大写)。
现在我们可以重新绘制网络。这一次,节点的颜色将是绿色或蓝色,这取决于它们的性别。注意,我没有设置vertex.因为这样做将覆盖我们刚刚给节点的颜色。
现在让我们试试role。首先,我重置颜色。有四种角色(Father, Mother, Son, Daughter),因此我们需要更多的ifelse语句来为所有这些角色编码。
最后但并非最不重要的是,让我们调整节点的大小,以便它们反映年龄的差异。我们可以用下面的代码将节点大小设置为节点年龄的1/5。简单,但有效。看起来最老的节点给了最多的人。
over!撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。