为什么这个网络图没有把同一组的节点放在R中?

cngwdvgl  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(104)

我有一个dataframe nodes,组信息如下:

dput(nodes)

structure(list(id = c("AC006329.1", "AC027796.4", "AC111170.2", 
"AC111170.3", "AC138207.4", "AP000695.2", "CDK15", "COL14A1", 
"COL15A1", "DDX11-AS1", "FOXP4-AS1", "IFNG-AS1", "ITGB2-AS1", 
"LINC00944", "LINC01213", "LINC01395", "MIR155HG", "MSTRG.108144", 
"MSTRG.110466", "MSTRG.11483", "MSTRG.130624", "MSTRG.134576", 
"MSTRG.147129", "MSTRG.180740", "MSTRG.180762", "MSTRG.24184", 
"MSTRG.9061", "SERHL"), label = c("AC006329.1", "AC027796.4", 
"AC111170.2", "AC111170.3", "AC138207.4", "AP000695.2", "CDK15", 
"COL14A1", "COL15A1", "DDX11-AS1", "FOXP4-AS1", "IFNG-AS1", "ITGB2-AS1", 
"LINC00944", "LINC01213", "LINC01395", "MIR155HG", "MSTRG.108144", 
"MSTRG.110466", "MSTRG.11483", "MSTRG.130624", "MSTRG.134576", 
"MSTRG.147129", "MSTRG.180740", "MSTRG.180762", "MSTRG.24184", 
"MSTRG.9061", "SERHL"), group = structure(c(1L, 6L, 6L, 6L, 4L, 
3L, 4L, 4L, 4L, 1L, 1L, 2L, 2L, 2L, 5L, 5L, 2L, 4L, 2L, 1L, 6L, 
5L, 5L, 3L, 3L, 3L, 1L, 5L), levels = c("blue", "brown", "cyan", 
"green", "purple", "red"), class = "factor")), row.names = c(NA, 
-28L), class = "data.frame")

字符串
edges看起来像下面这样:
下面是edges.csv文件
使用nodesedges,我使用以下代码创建网络图:
当我像下面这样使用时,网络图一直在移动,根本不会停止。

visNetwork(nodes, edges)


我也试着把visPhysics(stabilization = FALSE)添加到上面的行中,但没有工作。
所以,我尝试了下面的igraph布局:

visNetwork(nodes, edges) %>%
  visIgraphLayout()


x1c 0d1x的数据
这不会将来自同一组的节点保持在一起。谁能告诉我如何将同一组/颜色的节点保存在一起?
它应该看起来像下面这样:


lsmepo6l

lsmepo6l1#

我通常发现使用tidygraphggraph生态系统定制网络图更容易。您的图形具有比给定示例更多的边,因此可能需要进行一些调整以使边看起来像您想要的那样。

library(tidygraph)
library(ggraph)

# Match colours in given example:
colormap <- c(red = '#fa3233', blue = '#3d85e9',
  green = '#4cb30f', purple = '#7b29ef',
  cyan = '#e02aef', brown = '#ffa500')

fillmap <- c(red = '#fb7e81', blue = '#97c2fc',
             green = '#7be142', purple = '#ad85e4',
             cyan = '#ea7cf3', brown = '#ffff00')

tbl_graph(nodes, 
          cbind(edges, colour = nodes$group[match(edges$from, nodes$id)])) %>%
  ggraph(layout = 'igraph', algorithm = 'fr') +
  geom_edge_diagonal(aes(color = colour, width = weight)) +
  geom_node_circle(aes(r = 1, color = group, fill = group)) +
  coord_equal() +
  scale_edge_color_manual(values = colormap) +
  scale_color_manual(values = colormap) +
  scale_fill_manual(values = fillmap) +
  scale_edge_width_continuous(range = c(0.1, 5)) +
  theme_void() +
  theme(legend.position = 'none')

字符串


的数据

编辑

要调整布局,使组之间不会太近,并以清晰的方式标记节点,您可以执行以下操作:

tbl_graph(nodes, 
          cbind(edges, colour = nodes$group[match(edges$from, nodes$id)])) %>%
  ggraph(layout = 'igraph', algorithm = 'fr', weights = (edges$weight)^0.2) +
  geom_edge_diagonal(aes(color = colour, width = weight)) +
  geom_node_label(aes(label = label, fill = group, color = group), size = 3,
                  label.r = unit(0.5, "lines")) +
  geom_node_text(aes(label = label), size = 3) +
  coord_equal(clip = 'off') +
  scale_edge_color_manual(values = colormap) +
  scale_color_manual(values = colormap) +
  scale_fill_manual(values = fillmap) +
  scale_edge_width_continuous(range = c(0.1, 5)) +
  theme_void() +
  theme(legend.position = 'none')


piv4azn7

piv4azn72#

这就是我对igraph的尝试

g <- edges %>%
    mutate(
        color1 = with(nodes, as.character(group)[match(from, id)]),
        color2 = with(nodes, as.character(group)[match(to, id)])
    ) %>%
    mutate(color = ifelse(color1 == color2, color1, "gray")) %>%
    mutate(width = ifelse(color == "gray", weight, weight * 100)) %>%
    graph_from_data_frame(directed = FALSE) %>%
    set_vertex_attr(name = "color", value = with(nodes, as.character(group)[match(names(V(.)), id)])) %>%
    set_vertex_attr(name = "label", value = with(nodes, label[match(names(V(.)), label)])) %>%
    set_vertex_attr(name = "size", value = 10) %>%
    set_edge_attr(name = "curved", value = TRUE)

字符串
然后把它画出来

plot(g, layout = layout_with_fr)


的数据

相关问题