英文:
Why this Network plot doesn't keep the nodes from same group together in R?
问题
我有一个名为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文件
我使用了以下代码来创建网络图,使用了nodes
和edges
:
当我像下面这样使用时,网络图一直在移动,根本停不下来。
visNetwork(nodes, edges)
我还尝试在上面的代码中添加了visPhysics(stabilization = FALSE)
,但没有效果。
所以,我尝试了以下方法,使用了igraph的布局:
visNetwork(nodes, edges) %>%
visIgraphLayout()
这样做后,节点不会按照同一组/颜色放在一起。请问有人可以告诉我如何将同一组/颜色的节点放在一起吗?
它应该看起来像这样:
英文:
I have dataframe nodes
with the group information like below:
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")
And the edges
look like below:
here is the edges.csv file
Using nodes
and edges
I used the below code to create the network plot:
When I used like below, the network plot was constantly moving and doesn't stop at all.
visNetwork(nodes, edges)
I also tried adding visPhysics(stabilization = FALSE)
to above line, but didn't work.
So, I tried like below with igraph layout:
visNetwork(nodes, edges) %>%
visIgraphLayout()
This doesn't keep the nodes from same group together. Can anyone please tell me how to keep the nodes from same group / color together?
It should look like below:
答案1
得分: 3
我通常发现使用 tidygraph
和 ggraph
生态系统来自定义网络图更容易。您的图形边数比给定的示例要多得多,因此可能需要一些调整才能使边看起来符合您的要求。
library(tidygraph)
library(ggraph)
# 匹配给定示例中的颜色:
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')
这是您提供的代码的翻译部分。
<details>
<summary>英文:</summary>
I usually find it easier to customize a network graph using the `tidygraph` and `ggraph` ecosystem. Your graph has a lot more edges than the given example, so it might take some tweaks to get the edges looking as you want them.
``` r
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')
Edit
To adjust the layout so that the groups are not too close together, and to label the nodes in a legible way, you could do:
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')
答案2
得分: 3
这是我尝试使用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)
英文:
This is what I have tried with 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)
and then plot it
plot(g, layout = layout_with_fr)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论