geomnet是一个基于ggplot2可视化图形和网络的R包,它使用sna包计算网络布局,并且包含了使用ggplot2绘制圆的geom_circle函数。
一、geomnet绘图
代码语言:javascript复制install.packages('geomnet')
library(dplyr)
library(geomnet)
data(theme_elements)
#theme_elements 分为两组子集,分别edges和vertices,edges中包含child和parent这两列
#数据整理:
TEnet <- fortify(as.edgedf(theme_elements$edges[,c("parent", "child")]),
theme_elements$vertices)
#as.edgedf:将数据映射到edgedf
#fortify:将网路边的数据转换为geomnet使用的格式
代码语言:javascript复制#计算节点的度:
TEnet <- TEnet %>% group_by(from_id) %>%
mutate(degree = sqrt(10 * n() 1))
#%>%是dplyr包中的管道函数,把左件的值发送给右件,并作为右件表达式函数的第一个参数
#mutate函数是添加新的列,将新增变量放在数据集的最后面
1. 例一
代码语言:javascript复制ggplot(data = TEnet,
aes(from_id = from_id, to_id = to_id))
geom_net(layout.alg = "fruchtermanreingold",
#layout.alg是布局使用的算法,有"kamadakawai","fruchtermanreingold","circle",
aes(fontsize = degree), directed = TRUE,
#根据节点度调整节点字的大小
#边有方向
labelon = TRUE, size = 1, labelcolour = 'black',
#labelon给节点添加标签,调整大小和颜色
ecolour = "grey70", arrowsize = 0.5,
#ecolour是边的颜色
#arrowsize调整箭头大小
linewidth =0.5, repel = TRUE
#linewidth是边的宽度
#repel如果为TRUE,则使用ggrepel包geoms而不是ggplot2 geoms绘制节点标签。
)
theme_net()
xlim(c(-0.05, 1.05))
ggtitle("layout.alg = fruchtermanreingold")
#加标题
theme(plot.title = element_text(lineheight=1, face="bold",hjust = 0.5))
#调整标题
2. 例二
代码语言:javascript复制library(geomnet)
data(blood)
ggplot(data = blood$edges, aes(from_id = from, to_id = to))
geom_net(colour = "darkred", layout.alg = "circle", labelon = TRUE,
size = 15, directed = TRUE, vjust = 0.5, labelcolour = "grey80",
arrowsize = 1.5, linewidth = 0.5, arrowgap = 0.05,
#arrowgap 箭头到节点的距离
selfloops = TRUE, ecolour = "grey40")
#selfloops,是否显示循环,若是,则在相应节点附近画一个圆,默认为FALSE
theme_net()
3. 例三
http://www.stats.ox.ac.uk/~snijders/siena/siena_datasets.htm
获取示例数据
代码语言:javascript复制library(geomnet)
head(hp.edges)
代码语言:javascript复制head(football$vertices)
代码语言:javascript复制hp.all <- fortify(as.edgedf(hp.edges), hp.chars, group = "book")
#使用name1作为from节点列,使用name2作为to节点列。
#如果这是不正确的,则重写dat,以使前两列分别为from和to节点。
#分别通过from_id和name连接边缘和节点信息。
#仅绘制给定书中具有任何连接的字符。
ggplot(data=hp.all, aes(from_id = from, to_id = to_id))
geom_net(fiteach=T, directed = T, size = 3, linewidth =0.5,
#网络图是否分别安装在每个面板中
ealpha =0 .5, labelon = T, fontsize = 3, repel = T,
labelcolour = "black", arrowsize = .5, singletons = FALSE,
#没有其他联系(度为0)的节点是否绘制,默认为TRUE
aes(colour = house, group = house, shape = gender))
# 根据house分颜色,house分组,gender分形状
scale_colour_manual(values = c("#941B08","#F1F31C",
"#071A80", "#154C07"))
facet_wrap(~book, labeller = "label_both")
theme_net()
theme(panel.background = element_rect(colour = 'black'))
二、与ggplotly包共用
plotly是交互式绘图展示方法
1. 例一
绘制后,将鼠标放置在图中的节点或者边上,会提示节点/边的详细信息
代码语言:javascript复制library(geomnet)
library(plotly)
data(blood)
#blood是geomnet自带数据
bloodnet <- fortify(as.edgedf(blood$edges), blood$vertices)
p <- ggplot(data = bloodnet, aes(from_id = from_id, to_id = to_id))
p2 <- p geom_net(aes(size=Predominance, colour=type, shape=rho, linetype=group_to),
linewidth=0.75, labelon =TRUE, directed = TRUE, labelcolour="black")
facet_wrap(~Ethnicity)
#分面
scale_colour_brewer(palette="Set2")
#主题颜色
ggplotly(p2)
2. 例二
绘制后,将鼠标放置在图中的节点或者边上,会提示节点/边的详细信息。右上方是工具栏。
代码语言:javascript复制data(football) #football是geomnet自带数据
ftnet <- fortify(as.edgedf(football$edges), football$vertices)
#合并数据
gg <- ggplot(data = ftnet,aes(from_id = from_id, to_id = to_id))
geom_net(layout.alg = 'fruchtermanreingold',
aes(colour = value, group = value,
linetype = factor(same.conf != 1)),
linewidth = 0.5,
size = 5, vjust = -0.75, alpha = 0.3)
#alpha是节点的Alpha透明混合处理,取值范围0至1
theme_net()
#移除背景
theme(legend.position = "bottom")
#图例位置
scale_colour_brewer("Conference", palette = "Paired")
#分组赋值颜色
guides(linetype = FALSE)
#guides,是否移除图例
ggplotly(gg)
小编总结:
除了Cytoscape软件以外,我们也可使用geomnet包来绘制网络图,而且这种交互式展示方法可用于数据库的设计中,美观且功能性强,大家可以借鉴哦!