……更新于2016.3.20号,附上所有代码……
最近刚用R的igraph包和networkD3完成了一个项目的可视化内容(前者是静态的后者是动态的),感觉还是比较好看的哈哈(温馨提示,调亮手机) 。
:)
/>
/>
/>
/>
———————————————分割线——————————————
那现在我们来理一下思路,要做出这个效果其实真的一点都不难,现在再翻看刚开始学习时候写的代码……真的是……Naive哈哈。没有一个循环一个function就能直接出图的,不信你看——
```{r}
setwd('d:/Rproject')
set.seed(200)
App.use<-read.table("app_data.txt",header
= FALSE,sep= ",",
colClasses
=c("character","character"))
g1<-na.omit(App.use)
```
#
# 说明
设定工作目录;
设定种子节点,同一种布局画出来的图就是可以重复,不然即使同一种布局,展现的时候 由于位置的随机也会呈现出不一样的结果;
去除NA值,清除了若干条包含有缺失值的信息。
#
```{r}
library(igraph)
g2 =
graph.data.frame(d =g1, directed = F);
V(g2)
E(g2)
x<-par(bg="white")
graph.density(g2)
V(g2)$bte =
betweenness(g2, directed = F)
par(mar = c(0, 2,
0, 0))
plot(V(g2)$bte)
```
#
# 说明
载入igraph包,这个包是R中对复杂网络的一个解决包;
对数据进行格式转化,我选择的数据是没有方向度量的数据;
这两者都使社会网络分析的函数代码,分别代表定点和边;
将背景设置为白色;
可以查询群体的中心密度,并画出相应的图。
#
```{r}
x<-par(bg="black")
V(g2)$size = 5
V(g2)[bte>=1000]$size
=10
V(g2)[bte<=100]$size
=2
plot(g2,layout=layout.fruchterman.reingold,
vertex.label=NA,edge.arrow.size=1)
V(g2)[bte>=1000]
# 说明
背景图设置为黑色;
根据节点中心度的图,现做以下处理;
①将中心度高于1000的节点的大小设置为10;
②将中心度低于100的节点的大小设置为2;
③将中心度在100到1000的节点的大小设置为5;
从图中也可以直观地看出,中间度最高的几个节点,确实位于中介的地位具体看这六个点,分别是微信、百度地图、淘宝、优酷、QQ和360。
```{r}
plot(g2,layout=layout.fruchterman.reingold,
vertex.size=V(g2)$size,vertex.label=V(g2)$V1)
plot(g2,layout=layout.fruchterman.reingold,vertex.size=V(g2)$size,
vertex.color=rgb(0.2,1,0.8,0.6),vertex.label=NA,edge.arrow.size=1)
```
# 说明
标签数量太多,图形看的很乱,因此开始用layout的函数进行调试;
vertex.size即点的大小;vertex.color是点的颜色;
vertex.label即标签名,因为太多所以舍弃;
edge.arrow.size没试出来,不知道是不是因为数据的原因;
此外还有vertex.label.cex、edge.color、edge.arrow.mode、edge.arrow.size等参数;
由于这个网络并不存在方向,所以size没法使用;
另外调节线的宽度可以用下面这种方法单独将“E(g2)$width=”列出来。
#
```{r}
com =
walktrap.community(g2,steps=5,merges = TRUE,
modularity = TRUE,
membership = TRUE)
V(g2)$sg=com$membership
V(g2)$color=rainbow(max(V(g2)$sg),alpha=0.6)[V(g2)$sg]
E(g2)$color=rgb(0.3,0.6,1,0.2)
```
#
# 资料
Igraph包中社区分类函数有以下几种:
fastgreedy.community
spinglass.community
edge.betweenness.community
leading.eigenvector.community
walktrap.community
label.propagation.community
clique.community
multilevel.community
# 说明
不同的分类算法,速度和适用社区网络大小都有所侧重;
对于同一网络,采用什么样的分类算法需要实践后去人工判断是否符合预期;
step类似于一种阈值,值越大划分的约粗糙,由于本身数据的量不大,所以step取值较小;
第一行是特殊用法,sp即为subgroup;
其中rainbow即点的颜色,除了这种表达方式之外还能用rainbow(10, 0.8, 0.8, alpha=0.6);
[V(g2)$sg]实验之后感觉是对颜色的排序进行定义,将相同的类别以相同的颜色表现。
#
```{r}
plot(g2,layout=layout.fruchterman.reingold,
vertex.size=V(g2)$size,
vertex.color=V(g2)$color,
edge.width=2,edge.arrow.size=0,
vertex.frame.color=NA,margin= rep(0, 1),
vertex.label=NA)
```
# 说明
设置点的大小为之前的值,点的颜色为之前设置为彩虹色,具体的参数还不熟悉,无箭头标度;
设置边得颜色为RGB,宽度为2,透明度为20%,具体数值可调整,边界方位在0和1之间。
# 环形单色虹
```{r}
sg1 <-
cluster_spinglass(g2, spins=6, gamma=2.0)
layout=layout.circle
E(g2)$color=rgb(0.3,0.6,1,0.4)
plot(g2,
layout=layout, vertex.size=V(g2)$size, vertex.label=NA,edge.width=1,
vertex.color= rgb(0.3,0.6,1,0.4))
```
# 环形彩虹
```{r}
E(g2)$color=V(g2)[name=ends(g2,E(g2))[,2]]$color
plot(g2,
layout=layout, vertex.size=V(g2)$size, vertex.label=NA,edge.width=1,
vertex.color= rainbow(10, 0.8, 0.8,
alpha=0.8)[sg1$membership])
```
# 单色球体结构的社会网络分布
```{r}
sg1 <-
cluster_spinglass(g2, spins=6, gamma=2.0)
layout=layout.sphere
E(g2)$color=rgb(0.3,0.6,1,0.4)
plot(g2,
layout=layout, vertex.size=V(g2)$size, vertex.label=NA,edge.width=1,
vertex.color= rgb(0.3,0.6,1,0.4))
```
# 多色球体单色线条结构的社会网络分布
```{r}
sg1 <-
cluster_spinglass(g2, spins=6, gamma=2.0)
layout=layout.sphere
E(g2)$color=rgb(0.3,0.6,1,0.4)
plot(g2,
layout=layout, vertex.size=V(g2)$size, vertex.label=NA,edge.width=1,
vertex.color=rainbow(10, 0.8, 0.8,
alpha=0.6)[sg1$membership])
```
#多色球体多色线条结构的社会网络分布
```{r}
sg1 <-
cluster_spinglass(g2, spins=6, gamma=2.0)
layout=layout.sphere
E(g2)$color=V(g2)[name=ends(g2,E(g2))[,2]]$color
plot(g2, layout=layout,
vertex.size=V(g2)$size, vertex.label=NA,edge.width=1,
vertex.color=rainbow(10, 0.8, 0.8,
alpha=0.6)[sg1$membership])
```
#
如果看到这了,觉得有用有帮助的,请点个赞加个关注呗:)
毕竟我只是一个关注不过3位数还在不断默默耕耘的“知乎良民”
:)