ggraph中节点的特定比例的线性图R

时间:2018-02-20 15:58:29

标签: r ggplot2 tidyverse ggraph

我正在尝试使用优秀的ggraph库来描绘一些非常难以描述科学工作的相互关系。具体来说,我想在遗传基因座中显示SNP-SNP相互作用。如果我将相互作用绘制为图的弯曲节点,那将是非常好的,其中SNP根据它们的遗传位置以线性方式定位。来自ggraph库的geom_edge_arc()美学将是理想的。但是,我不能根据位置将节点放在一个顺序中。

这是一个例子

library(igraph)
library(tidyverse)
library(ggraph)

set.seed(10)
nodes <- tibble(nodes = paste("SNP",seq(1:10)), pos = sample(c(10000:20000),10))
edges <- expand.grid(nodes$nodes,nodes$nodes) %>% 
              mutate(interaction = rnorm(100)) %>%
              filter(abs(interaction)>1)

gr <- graph_from_data_frame(edges, vertices = nodes)

ggraph(gr, 'linear', circular=F) +
  geom_edge_arc(aes(edge_width=interaction)) 

这里的节点均匀分布,因为&#34;因素&#34;。但是,我想将它们放在pos变量指定的x坐标上(后者又成为节点的属性)。将+ geom_node_point(aes(x=pos))添加到ggplot对象不会导致正确的渲染。我可以用&#34; basic&#34; ipgraph也是,但我喜欢ggraph和ggplot2,这将是一个优雅而简单的方法来绘制。

亲切的问候,并提前感谢,

罗伯特

1 个答案:

答案 0 :(得分:1)

不确定这是否仍然相关,但有两种方法可以解决这个问题。

如@axeman所述,您可以使用manual布局,并基本上将xy坐标传递给它:

ggraph(gr, 
       layout = 'manual', 
       node.position = data_frame(y = rep(0, length(nodes$pos)), x = nodes$pos)) +
  geom_edge_arc(aes(edge_width=interaction))

其他方式是覆盖x内的geom_edge_arc aes。为了能够将节点属性传递给aes,我们需要使用geom_edge_arc2

ggraph(gr, 'linear', circular=F) +
  geom_edge_arc2(aes(edge_width=interaction, x = node.pos))

reprex package(v0.2.0)创建于2018-05-30。