在ggraph()中的每个面板中复制整个网络的小倍数图

gkn4icbw  于 2023-03-10  发布在  其他
关注(0)|答案(1)|浏览(135)

我想使用ggraph绘制一个网络的小倍数图。对于网络中的每个节点,我有两个特征:feat1feat2。我想在一个面板中可视化整个网络的feat1,在另一个面板中可视化整个网络的feat2。每个面板应包含网络中的所有节点和边。在相同的位置。最终我会想这样做的10-20个功能,说。
要解决表格数据的此类问题,我将使用pivot_longer()gather将数据转换为长格式,然后将长数据传递给ggplot()并使用facet_wrap()facet_grid()。据我所知,ggraphtidygraph不提供pivot_longer()的图形变体。所以我不确定如何解决这个问题,我正在寻找一个惯用的ggraph/tidygraph解决方案(如果有的话)。
这里有一个我想改进的解决方案。

library(ggraph)
#> Loading required package: ggplot2
library(tidygraph)
#> 
#> Attaching package: 'tidygraph'
#> The following object is masked from 'package:stats':
#> 
#>     filter
library(patchwork)
library(tidyr)

gr <- as_tbl_graph(highschool) |>
  mutate(
    feat1 = sample(LETTERS[1:3], n(), replace = TRUE),
    feat2 = sample(LETTERS[1:8], n(), replace = TRUE)
  ) |>
  mutate_at(vars(feat1, feat2), as.factor)

p1 <- ggraph(gr) +
  geom_edge_link(alpha = 0.1) +
  geom_node_point(aes(color = feat1)) +
  scale_color_brewer(type = "qual") +
  theme_graph()
#> Using "stress" as default layout

p2 <- ggraph(gr) +
  geom_edge_link(alpha = 0.1) +
  geom_node_point(aes(color = feat2)) +
  scale_color_brewer(type = "qual") +
  theme_graph()
#> Using "stress" as default layout

p1 + p2
#> Warning: Using the `size` aesthetic in this geom was deprecated in ggplot2 3.4.0.
#> ℹ Please use `linewidth` in the `default_aes` field and elsewhere instead.

我还尝试通过使用create_layout()处理表格数据空间中的数据来解决我的问题,在表格数据空间中我可以使用pivot_longer()

layout <- gr|>
  create_layout(layout = 'stress')

# it seems i can pass layouts to ggraph instead of graph objects
layout |>
  ggraph() +
  geom_edge_link(alpha = 0.1) +
  geom_node_point(aes(color = feat2)) +
  scale_color_brewer(type = "qual") +
  theme_graph()

# pivot the layout data
layout_long <- layout |>
  pivot_longer(
    contains("feat"),
    names_to = "feat_name",
    values_to = "feat_value"
  )

# pivoting messes up class and attribute information so fix it?
class(layout_long) <- class(layout)
attributes(layout_long) <- attributes(layout)

# this sadly doesn't work, presumably because the dimensions of the graph and the layout no longer match
layout_long |>
  ggraph() +
  geom_edge_link(alpha = 0.1) +
  geom_node_point() +
  scale_color_brewer(type = "qual") +
  theme_graph()
#> Error in `geom_node_point()`:
#> ! Problem while computing aesthetics.
#> ℹ Error occurred in the 2nd layer.
#> Caused by error in `check_aesthetics()`:
#> ! Aesthetics must be either length 1 or the same as the data (70)
#> ✖ Fix the following mappings: `x` and `y`

创建于2023年2月28日,使用reprex v2.0.2.9000

lyr7nygr

lyr7nygr1#

我的第一个想法是建立一个nodesdata.frame,在那里执行透视,然后将其提供给tbl_graph()调用,该调用允许您为节点和边指定单独的 Dataframe 。
以下是你的例子。

grnodes <- data.frame(name=  unique(c(highschool$to,highschool$from))) |> mutate(
        feat1 = sample(LETTERS[1:3], n(), replace = TRUE),
        feat2 = sample(LETTERS[1:8], n(), replace = TRUE)
        ) |>
        #mutate_at(vars(feat1, feat2), as.factor) |> 
        pivot_longer(cols=c(feat1,feat2), names_to='feature', values_to='group')

gr <- tbl_graph(nodes=grnodes,edges=highschool)

ggraph(gr) +
  geom_edge_link(alpha=0.1) +
  geom_node_point(aes(color=group)) +
  scale_color_brewer(type = "qual") +
  theme_graph() + facet_nodes(.~feature) + geom_node_text(aes(label=name))

但是这并不起作用,因为ggraph + facet_nodes似乎不适用于节点的长格式数据.帧--它似乎只通过相应的边连接了一些节点,即使这些节点具有相同的名称。

相关问题