说起来这个ggnet,也是我当时瞎折腾出来的结果。我那会儿手头有个数据,是关于用户之间互动关系的,想可视化出来看看,哪个用户跟哪个用户联系紧密,或者说有没有什么小圈子。
最开始我是想用R里的那些老牌包,像igraph什么的。igraph是真强大,功能多得吓人。但是就喜欢好看的图,以前用ggplot2画图画习惯了,觉得那风格特对胃口。可igraph画出来的图,虽然能看,但总觉得差点儿意思,要调颜色调样式,得费老大劲儿。
于是乎,我就开始在网上乱搜,想看看有没有什么能把网络图和ggplot2结合起来的。这一搜,就搜到了ggnet这个包。当时心想,这名字起得gg开头,肯定跟ggplot2沾边儿。立马就动手去装了。
那会儿装包,我还记得挺清楚的,因为它不是直接就能搞定的,得用devtools从GitHub上装。我就先装了devtools,然后敲了行代码:devtools::install_github("briatte/ggnet")。等它吭哧吭哧装完,心里还挺期待的。
第一次尝试:看它能画出啥
装完之后,我赶紧把几个需要的包都加载进来:library(ggplot2)、library(network),当然还有咱们的主角library(ggnet)。然后就是准备数据。
我的数据是那种邻接矩阵的格式,就是谁跟谁有关系,用1表示,没关系用0。我先随便弄了个小矩阵,比如5个节点之间的一些关系,转成了一个network对象。这是ggnet的基础,它吃的是network包里的网络对象。转数据这步,当时我是看了好多官方文档才弄明白的,各种参数,什么节点属性、边属性,一开始弄得我有点晕。
数据搞定,立马就跑了第一行代码:ggnet2(my_network_object)。我记得当时一回车,屏幕上唰地就出来一张图。虽然是默认的,颜色也单一,但那种ggplot2的底子一下子就出来了,跟平时画的柱状图、散点图感觉很像,一下子就有了亲切感。
摸索参数:让图活起来
光默认的肯定不行,得让它好看,有意义。我就开始翻文档,看ggnet2都能调哪些参数。
- 布局(Layout):默认的布局有点乱,我就看到它有这个参数。我就去试
"fruchtermanreingold",这个是大家用的比较多的力导向布局,能把关联紧密的节点拉到一起,关联不紧的分开。还有"kamadakawai"、"circle"、"random"这些,我都一个个试了。发现不同的数据,用不同的布局出来的效果差异还挺大的。每次换个布局,看图上的节点分布重新组织,就觉得挺有意思的。 - 节点(Nodes):
- 大小(Size):我最想让节点的大小反映它的重要程度,比如度(degree)。我就先把每个节点的度算出来,然后把这个度作为节点的一个属性加到
network对象里。接着在ggnet2里用* = "degree",一下子节点就有了大小区别,一眼就能看出哪个节点更活跃了。 - 颜色(Color):有的时候,我还想给节点按不同的类别上色。比如我的用户分成了几类,我就把分类信息也作为节点属性加进去,然后用
* = "category"。图一出来,不同颜色的节点聚在一起,特别直观。 - 标签(Label):节点光有大小颜色还不够,得知道它是谁。我就把用户的ID作为节点标签加上去,用
* = TRUE。字体大小、颜色这些,也都可以调。
- 大小(Size):我最想让节点的大小反映它的重要程度,比如度(degree)。我就先把每个节点的度算出来,然后把这个度作为节点的一个属性加到
- 边(Edges):
- 颜色粗细:边代表关系,我也想给它加点戏。比如想看哪些边更重要,我就可以把边的权重加进去,然后用
* = "weight"让边粗细有别。颜色也可以调,* = "grey"或者干脆让它不显示。 - 箭头(Arrows):我的数据是互动的,有方向性。我就把
* = 5之类的加上去,立马就能看到关系是从哪到哪了。
- 颜色粗细:边代表关系,我也想给它加点戏。比如想看哪些边更重要,我就可以把边的权重加进去,然后用
跟ggplot2结合:精修细节
ggnet2最厉害的地方,就是它画出来的图,本质上还是个ggplot对象。这意味着什么?意味着所有ggplot2的“魔法”我都可以用上!
比如,默认的图背景有点灰,我一眼就觉得不舒服。立马就加个+ theme_void(),把背景、网格线全去掉,让图变得干净清爽。标题、副标题,用labs()加进去。图例的文字太小,位置不用theme(* = "bottom")调整。颜色不够好看,用scale_color_manual()自己指定色板,想用啥色就用啥色。
那段时间,我几乎是把ggnet2的参数来来回回试了个遍,又结合ggplot2的各种主题和比例尺调整。每次调试出一张好看又清晰的图,心里就特别有成就感。从最初一张乱糟糟的图,到后来能够清晰地展示出用户群体之间的互动模式,那种感觉真挺棒的。
遇到过不少坑。比如数据格式不对,报错信息看不懂;或者节点太多,图画出来密密麻麻的,标签互相覆盖。这些时候,就是一边查文档,一边上网搜别人的代码,模仿着去改。慢慢地,就总结出了一些经验,比如节点太多可以考虑只显示度比较高的节点,或者干脆用交互式工具。但对于大部分情况,ggnet搭配ggplot2,已经足够我用了。
所以说,从一个对网络可视化有点懵逼的人,到后来能熟练地用ggnet画出自己想要的图,这个过程就像是探险一样。一步步摸索,一点点进步,虽然有时候会卡壳,但最终看到成果的那一刻,什么付出都值了。
