|
社会网络分析——网络可视化与美化
作为社会科学家,我们想要讲述关于我们所研究的网络的结构和动态的令人信服的故事。可视化和统计是我们用来传达这些故事的主要工具。
在本教程中,我们将学习如何改变我们的网络可视化的美学。在可视化网络时,我们可以调整许多不同的元素。首先,我们可以改变节点的颜色、大小、形状和标签。其次,我们可以改变颜色,宽度,曲率和外观的边缘。我们可以突出显示网络中不同组的位置。
基础
让我们从调整基本的可视化开始。
首先,加载我们在上一篇教程中创建的数据,并将其画成一个网络。下面的代码看起来应该很熟悉。
唯一的区别是,我将money_edgelist转换为一个矩阵,与将其绘制为edgelist的图形在同一行中。这称为嵌套函数。可以嵌套的函数数量没有限制,但通常情况下,如果将它们分解成多行会更容易阅读。
library(igraph)
money_edgelist <- read.csv(&#34;Data/money_edgelist.csv&#34;, stringsAsFactors = F)
moneyNetwork <- graph.edgelist(as.matrix(money_edgelist), directed=TRUE)可视化网络就像输入plot(moneyNetwork)一样简单。但是默认plot出来的网络图特别丑。我们可以调整plot的设置,使结果的可视化更美观。对于igraph plot()函数有许多设置,我们将介绍开始自己制作体面的可视化所需的最低限度设置。
我们可以改变的最基本的东西是节点的大小和颜色。当你的网络很大的时候,节点通常会显得太大并且聚集在一起。参数顶点。Size允许您调整节点的大小(顶点是图论中表示节点的术语!)
plot(moneyNetwork, vertex.size = 10)

设置节点大小10
这是在igraph中更改plot函数设置的基本方法——在网络对象的旁边加上一个逗号,键入想要更改的设置的名称,并将其设置为一个新值。这里我们设置顶点。大小为10。当您不更改任何设置时,R将自动使用默认设置。你可以在该函数的帮助部分找到它们(即输入?plot。) 节点有一个难看的浅橙色,我们可以使用顶点。把它们的颜色变成更好的颜色。我们还可以通过将vertex.frame.color设置为NA来删除难看的黑色帧。
你可以在R中找到所有命名颜色的列表:
http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf plot(moneyNetwork, vertex.size = 10, vertex.color = &#34;tomato&#34;, vertex.frame.color = NA)

设置节点颜色
标签太大,而且是蓝色的。我们可以用vertex.label.cex调整标签的大小。我们可以用vertex.label.color来调整颜色。
plot(moneyNetwork, vertex.size = 10,
vertex.color = &#34;tomato&#34;,
vertex.frame.color = NA,
vertex.label.cex = .7,
vertex.label.color = &#34;black&#34;)

修改标签的大小和颜色--指人名(网络节点的名称-标签)
或者,如果我们想去掉标签,我们可以设置顶点。标签到NA。
plot(moneyNetwork,
vertex.size = 10,
vertex.color = &#34;tomato&#34;,
vertex.frame.color = NA,
vertex.label = NA)

去标签
最后,我们可以使边缘更小和弯曲,给他们更好的美感
plot(moneyNetwork,
vertex.size = 10,
vertex.color = &#34;tomato&#34;,
vertex.frame.color = NA,
vertex.label.cex = .7,
vertex.label = NA,
edge.curved = .1,
edge.arrow.size = .3,
edge.width = .7)

使边缘更小和弯曲
但设置不要太过了。如果你设置了edge.curved>1时,它看起来就像面。
plot(moneyNetwork, vertex.size = 10,
vertex.color = &#34;tomato&#34;, vertex.frame.color = NA,
vertex.label.cex = .7, vertex.label = NA,
edge.curved = 1.7, edge.arrow.size = .3, edge.width = .7)

曲率设置过头的样子
布局layout
网络可视化的一个重要部分是它的布局,它决定了节点在图中的位置。社交网络分析已经开发出了各种各样的布局。它们都试图最小化交叉的边的数量,但使用不同的算法来实现这一目标。一般来说,我使用Kamada Kawai算法或Fruchterman Reingold算法。
Igraph有一组布局函数,当传递一个网络对象时,这些函数返回一个坐标数组,然后可以在绘制该网络时使用。这些坐标应该保存到单独的R对象中,然后在plot函数中调用该对象。它们都有格式:layout DOT算法名。例如,layout.kamada.kawai()或layout.fruchterman.reingold()
Kamada Kawai
# 首先,我们在图形上运行布局函数
kamadaLayout <- layout.kamada.kawai(moneyNetwork)
# 然后我们改变默认布局设置,使其与上面生成的布局相同
plot(moneyNetwork,
layout = kamadaLayout,
vertex.size = 10,
vertex.color = &#34;tomato&#34;,
vertex.frame.color = NA,
vertex.label.cex = .7,
vertex.label = NA,
edge.curved = .1,
edge.arrow.size = .3,
edge.width = .7)

Kamada Kawai布局
Frucherman-Reingold
fruchtermanLayout <- layout.fruchterman.reingold(moneyNetwork)
plot(moneyNetwork,
layout = fruchtermanLayout,
vertex.size = 10,
vertex.color = &#34;tomato&#34;,
vertex.frame.color = NA,
vertex.label.cex = .7,
vertex.label = NA,
edge.curved = .1,
edge.arrow.size = .3,
edge.width = .7)

Frucherman-Reingold布局
你可以查看?layout_获得更多选项和细节。 向网络对象添加属性
我们可以任意影响这些美学。例如,你可能更喜欢网络边缘是弯曲的而不是直线的样子。然而,我们经常根据我们的经验背景的理论来做决定。如果我们认为种族对网络结构很重要,我们可以根据种族给节点着色。如果我们认为种族和性别都很重要,我们可以根据种族给节点上色,根据性别改变节点的形状。我们也可以根据财富大小来确定节点的大小。我们通常被限制一次可视化节点的三个属性(使用颜色、形状和大小),尽管我发现任何超过两个(颜色和大小)的东西都很难解释。
接下来,为了可视化属性是如何分布在网络节点上的,大多数网络项目需要两个独立的数据集。除了创建和加载一个关系数据集(我们在上一篇教程中介绍过)之外,我们还需要第二个数据集来详细描述参与者的属性,我们需要将数据添加到网络中。决定哪些属性是相关的将取决于领域和你的研究问题;如果你在研究芝加哥南部的帮派,你可能会记录演员的帮派成员和住所;如果你对沙特精英之间的商业关系感兴趣,你可能会记录下他们的年龄和血统。
让我们回到Excel,为我们的网络构建一个属性数据集。这种数据集要传统得多:每一行是一个人(或者称为观察结果),每一列符合您为这个人测量的某些属性。这是我为我的家庭货币供应网络制作的一个示例属性数据集的图片。
Hoffman family attributes 家族属性


为节点增加属性-年龄、性别、角色
我将这个属性数据集作为.csv文件保存在我的R目录中。我将把它加载到R中,就像我在前一个教程中对edgelist做的那样(所有这些都应该是练习和熟悉的!)如果没有,请重新阅读上一篇教程)。
attributes <- read.csv(&#34;Data/attribute_df.csv&#34;, stringsAsFactors = F)
head(attributes)

在R中查看属性是否正确
这为我们提供了一个data.frame,其中每一行对应一个人,每一列对应网络中人的一个属性,但要在igraph中使用这些属性,我们必须将它们分配给igraph对象(即moneyNetwork)中的节点。
图中的属性分别分配给节点和边。正如在上一篇教程中提到的,顶点是使用V()函数访问的,而边是使用E()函数访问的。然后使用后跟属性名称的美元符号操作符访问属性。例如,如前所述,V(countrysideNetwork)$name将告诉我们网络中所有节点的名称。要更改一个属性,只需使用等号将其设置为其他值。举个例子,这里我改变了网络中节点的名称:
# 改变名字
V(moneyNetwork)$name = c(&#34;Bob&#34;, &#34;Linda&#34;, &#34;Elias&#34;,
&#34;Catherine&#34;, &#34;Eloise&#34;, &#34;Pumpkin&#34;)
# 打印节点名字 看是否改变
print(V(moneyNetwork)$name)
[1] &#34;Bob&#34; &#34;Linda&#34; &#34;Elias&#34; &#34;Catherine&#34; &#34;Eloise&#34; &#34;Pumpkin&#34; 目前,我们的网络除了名称之外没有任何属性。如果我们试图查看节点的性别,结果将是NULL。
V(moneyNetwork)$gender[1:6]因此,我们需要将属性文件中的属性附加到网络中。这样做的方法可能有点复杂。
如果我们有一个边缘列表,我们可以使用_from_data_frame()函数而不是graph.edgelist(),并包括属性文件作为顶点参数。不管出于什么原因,在本例中,边列表需要是data.frame,所以不需要将其转换为矩阵。另外,重要的是要注意,igraph假设第一列是名称列,所以要确保情况是这样的!
# 边 表
money_edgelist <- read.csv(&#34;Data/money_edgelist.csv&#34;,
stringsAsFactors = F)
# 属性变量
attributes <- read.csv(&#34;Data/attribute_df.csv&#34;,
stringsAsFactors = F)
# 添加属性给边表
moneyNetwork1 <- graph_from_data_frame(money_edgelist,
directed = T,
vertices = attributes)
现在,如果我们看一下我们的网络,我们会看到在attr旁边有更多的。

增加属性到网络中
我们可以用V()$函数查看每一个。例如,这是性别。
V(moneyNetwork1)$Gender
[1] &#34;Male&#34; &#34;Female&#34; &#34;Male&#34; &#34;Female&#34; &#34;Female&#34; &#34;Male&#34; 基于属性的绘图
在上一节中,我们将属性数据导入到网络对象中,这将允许我们根据节点属性操作网络。让我们从根据性别来处理颜色开始.
为了做到这一点,我们必须根据人们的性别给他们分配颜色。我们使用ifelse函数。ifelse()函数接受三个参数。第一个是测试(计算结果为TRUE或FALSE的东西),第二个是如果测试为TRUE返回什么,第三个是如果测试为FALSE返回什么。
因此,我们设置了一个ifelse函数,它测试一个节点的性别是否为男性,如果为TRUE(即它们是男性),则为其分配颜色为“蓝色”,如果为FALSE(即否则/它们是女性),则为“绿色”。记住,R是区分大小写的,所以如果你的性别变量包含“Male”和“Female”,那么确保你在ifelse语句中放入Male或Female(大写)。‘
gender <- V(moneyNetwork1)$Gender
V(moneyNetwork1)$color <- ifelse(gender == &#34;Male&#34;, &#34;dodgerblue3&#34;,&#34;seagreen&#34;)
现在我们可以重新绘制网络。这一次,节点的颜色将是绿色或蓝色,这取决于它们的性别。注意,我没有设置顶点。因为这样做将覆盖我们刚刚给节点的颜色。
plot(moneyNetwork1, vertex.size = 10,
vertex.frame.color = &#34;black&#34;,
vertex.label.cex = .7,
vertex.label = NA,
edge.curved = .1, edge.arrow.size = .3)

根据性别更改节点颜色
现在让我们试试role。首先,我重置颜色。有四种角色(Father, Mother, Son, Daughter),因此我们需要更多的ifelse语句来为所有这些角色编码。
V(moneyNetwork)$color <- NA
V(moneyNetwork)$color <- ifelse(V(moneyNetwork)$Role == &#34;Father&#34;, &#34;burlywood1&#34;,&#34;tomato&#34;)
V(moneyNetwork)$color <- ifelse(V(moneyNetwork)$Role == &#34;Mother&#34;, &#34;seagreen&#34;, V(moneyNetwork)$color)
V(moneyNetwork)$color <- ifelse(V(moneyNetwork)$Role == &#34;Son&#34;, &#34;grey70&#34;, V(moneyNetwork)$color)
plot(moneyNetwork,vertex.size = 10,
vertex.label.cex = .7,
vertex.label = NA,
edge.curved = .1,
vertex.frame.color = &#34;black&#34;,
edge.arrow.size = .3,
edge.width = .7,
edge.color = &#34;grey30&#34;)

根据角色更改节点颜色
最后但并非最不重要的是,让我们调整节点的大小,以便它们反映年龄的差异。我们可以用下面的代码将节点大小设置为节点年龄的1/5。简单,但有效。看起来最老的节点给了最多的人。
V(moneyNetwork)$size = V(moneyNetwork)$Age/5
plot(moneyNetwork,
vertex.label.cex = .7,
vertex.label = NA,
edge.curved = .1,
vertex.frame.color = &#34;black&#34;,
edge.arrow.size = .3,
edge.width = .7,
edge.color = &#34;grey30&#34;)

节点大小改变啦
over!撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。 |
|