【问题标题】:Creating chord network in R在 R 中创建和弦网络
【发布时间】:2021-02-14 18:36:21
【问题描述】:

我正在尝试使用 R 中的“networkD3”库为我的数据创建和弦图。我遵循这个 stackoverflow 帖子中提出的逻辑:Network chord diagram woes in R

我对使用“igraph”和“networkd3”创建和弦图特别感兴趣,因为我没有在我的计算机上安装其他库(例如“circlize”)的管理权限。

我在 R 中创建了一些假数据:

library(igraph)
library(dplyr)
library(networkD3)

#create file from which to sample from
x5 <- sample(1:100, 1100, replace=T)
#convert to data frame
x5 = as.data.frame(x5)

#create first file (take a random sample from the created file)
a = sample_n(x5, 1000)
#create second file (take a random sample from the created file)
b = sample_n(x5, 1000)

#combine
c = cbind(a,b)
#create dataframe
c = data.frame(c)
#rename column names
colnames(c) <- c("a","b")

接下来,我创建了一个邻接矩阵:

#创建邻接矩阵

g1 <- graph_from_adjacency_matrix(c)

当我尝试从邻接矩阵创建 Chord 网络时会出现问题:

chordNetwork(Data = c, 
             width = 500, 
             height = 500,
            )

Error in chordNetwork(Data = g, width = 500, height = 500, ) : 
  Data must be of type matrix or data frame

有谁知道我做错了什么?

谢谢

【问题讨论】:

  • 在创建数据框之前不要cbind,只需调用data.frame(a, b)——您正在创建一个矩阵,然后将其强制转换为数据框,当您的变量不是时,这会导致问题同类型。最好不要将变量命名为 c,因为这是一个通用函数。
  • @alistaire:感谢您的回复!我之前尝试在没有 cbind 的情况下运行此代码,但它也不起作用。如果我在没有 cbind 的情况下运行代码,它也不起作用。我无法创建邻接矩阵或和弦图:#create file from which to sample from x5
  • 是的,我的评论更多是为了避免其他问题,而不是解决您当前的问题。导致失败的问题是 CJ 在下面提到的:这些函数不是为处理您提供给它们的输入而构建的,因此您需要重组数据或使用不同的函数。也许你在追求igraph::graph_from_edgelist(as.matrix(c))之类的东西?
  • @alistaire :感谢您的回复。这似乎有效: d = igraph::graph_from_edgelist(as.matrix(c)) ;但是,“d”仍然与“chordNetwork”命令不兼容。我会继续看看是否有办法解决这个问题。以下是目前一切的样子: chordNetwork(Data = d, width = 500, height = 500, ) #Error in chordNetwork(Data = d, width = 500, height = 500, ) : Data must be of type matrix or数据框
  • ?chordNetwork;它不想要一个 igraph 对象作为输入,它想要一个矩阵,正如它告诉你的那样。您可以使用as_adjacency_matrix()(设置sparse = FALSE)将igraph 对象强制为邻接矩阵,或者直接去那里(有很多方法可以做到,例如unclass(table(c)))。也就是说,这个图表的节点太多,无法在这种类型的可视化项中有用地显示出来。

标签: r plot igraph networkd3 chord-diagram


【解决方案1】:

igraph::graph_from_adjacency_matrixnetworkD3::chordNetwork 两个函数都需要一个 square 矩阵作为输入。您输入的数据不是正方形的(即相同的行数和列数)。以下是基于其帮助文件中示例的两个工作示例...

adjm <- matrix(sample(0:1, 100, replace=TRUE, prob=c(0.9,0.1)), nc=10)

graph_from_adjacency_matrix(adjm)

chordNetwork(Data = adjm)


#####


hairColourData <- matrix(c(11975,  1951,  8010, 1013,
                           5871, 10048, 16145,  990,
                           8916,  2060,  8090,  940,
                           2868,  6171,  8045, 6907),
                         nrow = 4)

graph_from_adjacency_matrix(hairColourData)

chordNetwork(Data = hairColourData, 
             labels = c("red", "brown", "blond", "gray"))

【讨论】:

  • 感谢您的回复!我也看到了头发颜色的例子。我想用这条线:g1
  • 正如我所说的,正如帮助文件中明确指出的那样,包括igraph::graph_from_adjacency_matrix 在内的两个函数都需要一个方阵作为输入。
猜你喜欢
  • 2015-08-22
  • 2021-04-15
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多