使用 ggraph 在二分网络中指定节点形状和标签

Specify node shape and label in a bipartite network with ggraph

我想用 ggraph 绘制相邻矩阵。 我的数据看起来像这样

set.seed(43);
check <- matrix(rnorm(10), nrow = 5,ncol = 4, dimnames = list(c("AL","CH","CZ","DN","SC"), c("GR","EN","GE","FR")))

            GR          EN          GE          FR
AL -0.03751376 -0.27743280 -0.03751376 -0.27743280
CH -1.57460441  0.38643441 -1.57460441  0.38643441
CZ -0.48596752 -0.06040412 -0.48596752 -0.06040412
DN  0.46518623 -0.68617976  0.46518623 -0.68617976
SC -0.90409807 -1.90613679 -0.90409807 -1.90613679

我想使用二分网络绘制交互图,但我发现很难在顶部和底部的 x 轴上指定标签。 我也想改变节点的形状。我想在顶部看到一个蓝色方块,在底部看到一个绿色圆圈。

ggraph(check, layout = "bipartite") + 
  geom_edge_link0(aes(edge_width = weight),edge_colour = "grey66") +
  geom_node_point()

非常感谢任何帮助或评论。

如果在将邻接矩阵传递给绘图之前创建布局,则可以检查其中的变量。

library(ggraph)
#> Loading required package: ggplot2
set.seed(43);
check <- matrix(rnorm(10), nrow = 5,ncol = 4, 
                dimnames = list(c("AL","CH","CZ","DN","SC"), 
                                c("GR","EN","GE","FR")))

(layout <- create_layout(check, "bipartite"))
#>     x y  type name .ggraph.orig_index circular .ggraph.index
#> 1 0.5 1 FALSE   AL                  1    FALSE             1
#> 2 1.5 1 FALSE   CH                  2    FALSE             2
#> 3 2.5 1 FALSE   CZ                  3    FALSE             3
#> 4 3.5 1 FALSE   DN                  4    FALSE             4
#> 5 4.5 1 FALSE   SC                  5    FALSE             5
#> 6 1.0 0  TRUE   GR                  6    FALSE             6
#> 7 2.0 0  TRUE   EN                  7    FALSE             7
#> 8 3.0 0  TRUE   GE                  8    FALSE             8
#> 9 4.0 0  TRUE   FR                  9    FALSE             9

我们可以在上面的布局中看到,type 变量似乎对二分图的哪一部分在顶部和底部进行了编码。因此,我们可以使用节点层中的映射让shapecolour依赖于type变量。

g <- ggraph(layout) + 
  geom_edge_link0(aes(edge_width = weight),edge_colour = "grey66") +
  geom_node_point(aes(shape = type, colour = type), size = 6) +
  scale_colour_manual(values = c("blue", "green")) +
  scale_shape_manual(values = c(15, 19))
g

在 x 轴上获取正确的标签可能有点复杂,但基本上您可以从布局中提取中断和标签信息。

g + scale_x_continuous(
  breaks = layout$x[!layout$type],
  labels = layout$name[!layout$type],
  position = "top",
  sec.axis = dup_axis(
    breaks = layout$x[layout$type],
    labels = layout$name[layout$type]
  )
) +
  theme(axis.text = element_text())

reprex package (v1.0.0)

于 2021-07-10 创建

请注意,这可能不适用于 任何 图,但由于二分图的属性特别有效。标记节点的更通用策略是使用 geom_node_text():

g + geom_node_text(aes(label = name, 
                       y = y + ifelse(type, -0.05, 0.05)), 
                   vjust = "outward")