我的机械网

搜索
查看: 3270|回复: 25

如何做出漂亮的复杂网络关系图?

[复制链接]

0

主题

0

回帖

0

积分

小白会员

Rank: 1

积分
0
发表于 2017-3-5 16:36:04 | |阅读模式
各位网友请注意:我的机械网所有附件、百度网盘提取码、机械资料、PDF资料、压缩包文件均需要回帖后才能下载!
在UMAP论文中看到其中的配图都非常漂亮,希望在数学建模中可以配上这样比较Fancy的图(比如下面两图),但是不知道用什么软件可以比较方便快捷的做出,同时做出的效果又还不错?UCINET可以做出比较好的效果吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 一键登录:

x

0

主题

0

回帖

-5

积分

限制会员

积分
-5
发表于 2017-3-5 16:42:26 |
igraph这个包就很好用的。

0

主题

0

回帖

14

积分

新手上路

Rank: 1

积分
14
发表于 2017-3-5 16:48:22 |
耶!感觉跟房屋平面设计差不多

0

主题

0

回帖

0

积分

小白会员

Rank: 1

积分
0
发表于 2017-3-5 16:55:04 |
推荐使用D3

0

主题

0

回帖

0

积分

小白会员

Rank: 1

积分
0
发表于 2017-3-5 17:00:45 |
Gephi吧,简单易用,本人借助其做市场竞争分析。

0

主题

0

回帖

-1

积分

限制会员

积分
-1
发表于 2017-3-5 17:06:42 |
Gephi可以比较容易地实现网络可视化
如果你用Python,有个package叫networkx也不错
更自由同时需要写更多code的方式是使用D3

0

主题

0

回帖

0

积分

小白会员

Rank: 1

积分
0
发表于 2017-3-5 17:12:36 |
Gephi是一个入门级别的工具,够傻瓜,上手容易
R语言中的iGraph和networkD3包也足够优秀,可以满足你绝大多数的画图需要。
Processing和Photoshop是在此基础上画出更多效果的工具,前者将静态图做成动画,后者不仅可以做成动画,还可以增加很多的渲染。

网络可视化现在已经有很多工具,但是如何画图,还有专门研究展示算法的工作,比如R语言包中iGraph调用时的random-layout是一种算法,再比如Gephi中也提供了几种常用的展示算法,如果你下载Gephi的插件还可以得到更多的展示算法等。

0

主题

0

回帖

0

积分

小白会员

Rank: 1

积分
0
发表于 2017-3-5 17:19:03 |
一般用R中的igraph包就可以实现。不过需要自己仔细调校。同时像mathematica应该这是可以直接做类似的图。

0

主题

0

回帖

-1

积分

限制会员

积分
-1
发表于 2017-3-5 17:30:19 |
谢邀
可能满足你的需求的软件是Gephi,显示效果应该可以算作fancy,而且Ucinet中的.net文件格式可以直接导入Gephi中。      Ucinet可以做到上述第二幅图的效果,对线条粗细颜色、箭头大小、结点颜色、标签字体大小、分布方式进行调节。Ucinet的计算分析功能是很强大的,但是显示效果个人觉得一般,Gephi在这方面做得更好。

题主的目的是要好看并且方便快捷。个人的理解可视化效果要好主要是三个要素:
1.数据量。同样的方法,同样的设置,数据量的增大无疑会大大增加信息量和展示效果。
2.可视化信息:结点形状颜色和大小 连接线条粗细颜色及箭头 标签字体颜色及大小。这里面的每一个部分都需要根据表达目的进行调整和区分,而整体的效果是它们组合的结果,所以这一部分的调整比较耗时。
3.后期调整。布局方面,一般的软件都有设定的布局算法,进行选择即可。选择完后,自己再进行微调。此外,自己如果有额外的信息想显示,可以加以PS,如上面的第一幅图中的小图片应该是后期调整的结果。

对于方便快捷方面,个人觉得以上的两个软件都还可以,基本都可以设置得到。当然,做网络图的小软件有很多特别是国外,论文应该也是发现这写小软件的途径,个人使用经历也很有限只是提供一个可能的方法。最后提一句,漂亮是重要的,不过弄清楚自己想要表达哪些信息是可视化的第一步,也是非常重要的一步。

以上。希望能帮到你。

0

主题

0

回帖

0

积分

小白会员

Rank: 1

积分
0
发表于 2017-3-5 17:36:07 |
……更新于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位数还在不断默默耕耘的“知乎良民”
:)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 一键登录:

x
快速回复 返回顶部 返回列表