用python画关系网络图-如何做出漂亮的复杂网络关系图?

……更新于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位数还在不断默默耕耘的“知乎良民”

:)

你可能感兴趣的:(用python画关系网络图-如何做出漂亮的复杂网络关系图?)