前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言做网络图的又一个小例子

R语言做网络图的又一个小例子

作者头像
用户7010445
发布2020-04-14 14:35:46
1.6K0
发布2020-04-14 14:35:46
举报
使用R语言包ggraph做网络图需要准备的最基本的数据是:

1、一个包括一列数据的数据框,每一行是各个节点的名称

2、一个包含两列数据的数据框,每一行代表节点节点之间的连线

比如一个有四个节点的网络,每个节点是A,B,C,D。两两节点互相连接。数据的样子:
代码语言:javascript
复制
> nodes<-data.frame(node=c("A","B","C","D"))
> edges<-data.frame(node1=c("A","A","A","B","B","C"),
+                   node2=c("B","C","D","C","D","D"))
> nodes
  node
1    A
2    B
3    C
4    D
> edges
  node1 node2
1     A     B
2     A     C
3     A     D
4     B     C
5     B     D
6     C     D
>
接下来对这个网络进行可视化
代码语言:javascript
复制
library(ggraph)
library(igraph)
net<-graph_from_data_frame(d=edges,vertices = nodes,directed = F)
ggraph(net)+
  geom_edge_link()+
  geom_node_point()
接下来我想给节点分组,不同组节点填充不同的颜色;按照自己的数值给节点大小;每条连线也可以分配粗细和颜色。这些信息都可以在构造数据的时候添加进去。

给节点添加一列分组信息,给每个节点一个数值,用来映射节点大小。

代码语言:javascript
复制
nodes$Group<-c("group_1","group_1","group_2","group_2")
nodes$Size<-c(5,15,10,18)
nodes$Name<-nodes$node

给每条边添加颜色和粗细的映射数值

代码语言:javascript
复制
edges$color<-sample(seq(0,1,by=0.01),6)
edges$width<-sample(1:100,6)
基本图形如下
代码语言:javascript
复制
net<-graph_from_data_frame(d=edges,vertices = nodes,directed = F)
ggraph(net)+
  geom_edge_link(aes(edge_width=width,edge_color=color))+
  geom_node_point(aes(size=Size,color=Group))+
  geom_node_text(aes(label=Name))
接下来设置一下细节美化

边的渐变色深蓝到浅蓝不太好看,换!加上语句

scale_edge_color_continuous(low = "cyan",high = "red")

代码语言:javascript
复制
ggraph(net)+
  geom_edge_link(aes(edge_width=width,edge_color=color))+
  geom_node_point(aes(size=Size,color=Group))+
  geom_node_text(aes(label=Name))+
  scale_edge_color_continuous(low = "cyan",high = "red")

每个节点的点太小了,增大!加上语句

scale_size_area(max_size = 30)

代码语言:javascript
复制
ggraph(net)+
  geom_edge_link(aes(edge_width=width,edge_color=color))+
  geom_node_point(aes(size=Size,color=Group))+
  geom_node_text(aes(label=Name))+
  scale_edge_color_continuous(low = "cyan",high = "red")+
  scale_size_area(max_size = 30)

点的图例太大了,占了其他图例的位置,不要他了!加上语句

guides(size=F)

代码语言:javascript
复制
ggraph(net)+
  geom_edge_link(aes(edge_width=width,edge_color=color))+
  geom_node_point(aes(size=Size,color=Group))+
  geom_node_text(aes(label=Name))+
  scale_edge_color_continuous(low = "cyan",high = "red")+
  scale_size_area(max_size = 30)+
  guides(size=F)

这里遇到一个问题是:有没有办法改变图例中点的大小呢?

新学到的:还可以改变图例的前后顺序,添加语句

guides(color=guide_legend(order=3))

代码语言:javascript
复制
ggraph(net)+
  geom_edge_link(aes(edge_width=width,edge_color=color))+
  geom_node_point(aes(size=Size,color=Group))+
  geom_node_text(aes(label=Name))+
  scale_edge_color_continuous(low = "cyan",high = "red")+
  scale_size_area(max_size = 30)+
  guides(size=F)+
  guides(color=guide_legend(order=3))

虽然点大小的图例删掉了,但是他应该还是站着位置呢!如果想要把颜色图例设置为最后可能得把order设置为4。

有的节点超出了绘图边界,可以通过修改x和y轴的范围来调整,加上命令

theme_bw()就可以显示出坐标轴的范围

代码语言:javascript
复制
ggraph(net)+
  geom_edge_link(aes(edge_width=width,edge_color=color))+
  geom_node_point(aes(size=Size,color=Group))+
  geom_node_text(aes(label=Name))+
  scale_edge_color_continuous(low = "cyan",high = "red")+
  scale_size_area(max_size = 30)+
  guides(size=F)+
  guides(color=guide_legend(order=3))+
  theme_bw()+
  xlim(-0.8,0.8)+ylim(-0.8,0.8)

下面问题又来了:去掉边框,去掉坐标轴标签,去掉坐标轴上的小短线,如何实现?这个我知道,但是不在这篇文章中写了!

下面我不知道的问题又来了:有没有办法人为的改变边的长度呢?应该是可以的,但是自己还不知道!

参考文章

图例设置

https://zhuanlan.zhihu.com/p/78937185

网络图

https://www.jianshu.com/p/d853685bba92

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小明的数据分析笔记本 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用R语言包ggraph做网络图需要准备的最基本的数据是:
  • 比如一个有四个节点的网络,每个节点是A,B,C,D。两两节点互相连接。数据的样子:
  • 接下来对这个网络进行可视化
  • 接下来我想给节点分组,不同组节点填充不同的颜色;按照自己的数值给节点大小;每条连线也可以分配粗细和颜色。这些信息都可以在构造数据的时候添加进去。
  • 基本图形如下
  • 接下来设置一下细节美化
  • 参考文章
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档