我想使用ggraph
绘制一个网络的小倍数图。对于网络中的每个节点,我有两个特征:feat1
和feat2
。我想在一个面板中可视化整个网络的feat1
,在另一个面板中可视化整个网络的feat2
。每个面板应包含网络中的所有节点和边。在相同的位置。最终我会想这样做的10-20个功能,说。
要解决表格数据的此类问题,我将使用pivot_longer()
或gather
将数据转换为长格式,然后将长数据传递给ggplot()
并使用facet_wrap()
或facet_grid()
。据我所知,ggraph
和tidygraph
不提供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
1条答案
按热度按时间lyr7nygr1#
我的第一个想法是建立一个nodesdata.frame,在那里执行透视,然后将其提供给tbl_graph()调用,该调用允许您为节点和边指定单独的 Dataframe 。
以下是你的例子。
但是这并不起作用,因为ggraph + facet_nodes似乎不适用于节点的长格式数据.帧--它似乎只通过相应的边连接了一些节点,即使这些节点具有相同的名称。