【问题标题】:How to go from a ggraph object to an igraph object? (R)如何从 ggraph 对象转到 igraph 对象? (右)
【发布时间】:2022-01-26 13:17:05
【问题描述】:

我想创建一个交互式丰富地图。我使用了enrichplot 包中的emapplot 函数来执行此操作。但是这个函数返回一个静态图。我想使用(最好)visNetwork 包使其具有交互性。

emapplot 函数返回一个 ggraph 对象。我找不到将 ggraph 对象更改为 igraph/visNetwork/tbl_graph 对象的函数。于是我想到了提取节点和边的信息。

这可用于创建示例 ggraph 对象。

library(igraph)
library(ggraph)
library(tidyverse)

graph <- graph_from_data_frame(highschool)
graph2 <- ggraph(graph, layout = "kk") + 
    geom_edge_link(aes(colour = factor(year))) + 
    geom_node_point()

attributes(graph2)

输出:

$names
[1] "data"        "layers"      "scales"      "mapping"     "theme"       "coordinates" "facet"       "plot_env"    "labels"     

$class
[1] "ggraph" "gg"     "ggplot"

可以使用graph2$data获取节点位置。

           x          y name .ggraph.orig_index circular .ggraph.index
1  0.7326425  2.3767052    1                  1    FALSE             1
2  0.7041666  2.9986454    2                  2    FALSE             2
3  1.5125110  2.9624914    3                  3    FALSE             3
4 -2.7467842 -1.0804763    4                  4    FALSE             4
5 -2.8196405  0.2369667    5                  5    FALSE             5
6 -2.6184244  2.1968979    6                  6    FALSE             6

现在我需要知道现在才能获取边缘信息。

我看到ggraph::get_edgesgeom_edge_link 之类的函数用于检索边缘信息。不幸的是,我无法让它工作。

有人知道如何从 ggraph 对象中获取边缘信息,或者将其更改为 igraph 对象吗?

编辑
应 camille 的要求,这里是使用 emapplot 函数的example

if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")

BiocManager::install("enrichplot")

library(DOSE)
library(ggnewscale)
library(ggraph)
library(igraph)
library(enrichplot)

data(geneList)
de <- names(geneList)[1:100]
x <- enrichDO(de)
x2 <- pairwise_termsim(x)
graph <- emapplot(x2)

【问题讨论】:

  • 我不熟悉enrichplot,但为了澄清一下,您从一个图形/ggplot 对象(来自ggraph)开始,并试图从中提取图形数据作为igraph 对象?还是数据框?如果您包含 emapplot 部分可能会有所帮助,以便我们知道您当时拥有什么,或者是否有替代方案可以让您维护 igraph 对象
  • 我只找到了一个用于富集图的 R 包。 emapplot 的输出是一个 ggraph 对象。例如,我提供了一个“简单”的 ggraph 对象。我正在尝试使用 visNetwork 使其具有交互性。所以我必须从这个 ggraph 对象转到一个 visNetwork 对象。如果我有 igraph 对象,或者如果我有节点/边缘信息,我可以这样做。但我不知道如何将 ggraph 对象转换为 igraph 对象。我也不知道如何提取边缘信息。我将提供一个使用 emapplot 函数的示例。

标签: r graph igraph visnetwork ggraph


【解决方案1】:

找到了!

假设您有一个名为 x 的 ggobject。 您可以将节点和边缘信息提取为 tbl_graph 对象(这是 igraph 对象的包装器),如下所示:

graph_info <- attributes(x$data)$graph

# If you want to plot it using visNetwork
visNetwork::visIgraph(graph_info)

【讨论】:

    猜你喜欢
    • 2019-06-22
    • 2012-08-25
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多