3 列 CSV,到邻接矩阵,到网络图,到 Arcplot

Posted

技术标签:

【中文标题】3 列 CSV,到邻接矩阵,到网络图,到 Arcplot【英文标题】:3 column CSV, to adjacency matrix, to networkgraph, to Arcplot 【发布时间】:2016-05-15 21:12:10 【问题描述】:

我正在尝试将具有 3 列的 CSV 转换为弧形图。列 - ABC 始终按 A -> B -> C 的顺序排列。但是,我没有看到将其实现为弧图的方法,因为似乎大多数方法都使用了两列边缘图。因此,我一直按照说明here 转换为邻接矩阵。

我将在下面重新创建问题 - 但不生成虚假数据,因为一个问题是 CSV 可能无法正确读取。

基本上,CSV 包含行,其中每一列由, 分隔,但可能包含多个由; 分隔的值,例如:

ENV;MO,echoic;tact,social 
ENV;MO,mand,physical
OVB,intraverbal,social
ENV;OVB,tact,social
OVB,intraverbal;tact,social
OVB;ENV;MO,intraverbal;mand,social
OVB;ENV;MO,intraverbal;mand,physical;social
ENV;MO,mand,social;physical

我正在尝试以下操作,以便在移动到弧形图之前完成一些网络绘图:

options(stringsAsFactors = F)
lst <- read.csv("abc.csv", header=FALSE)

#this is pretty much straight from the link above
d <- do.call(rbind, lst)
edges <- rbind(d[ ,1:2], d[ ,2:3])
g <- graph.data.frame(edges, directed=TRUE)
adj <- as.matrix(get.adjacency(g)) 
g2 <- new("graphAM", adjMat=adj, edgemode="directed")
plot(g2, attrs = list(graph = list(rankdir="LR"), node = list(fillcolor = "lightblue")))

结果几乎不是我所希望的。而不是来自A 列的元素指向B 指向C。相反,它只是 A 指向自身的一个元素;来自B 的一个指向另一个指向另一个,例如intraverbal -> mand -> intraverbaltact,一个来自C,指向自身,另一个来自C

附录:给定A -> B -> C 格式,一行如

OVB;ENV;MO,intraverbal;mand,social

表示

A(OVB&ENV&MO) -> B(intraverbal&mand) -> C(social)

虽然它可能超出了问题的范围,但最终目标将是类似于此处描述的弧形图 PDF guide to arcplots in R

【问题讨论】:

不确定用“;”分隔的多个值...例如第一行应该变成:ENV-&gt;echoic-&gt;social + ENV-&gt;tact-&gt;social + MO-&gt;echoic-&gt;social + MO-&gt;tact-&gt;social 对吗? 应该是 ENV/MO -> echoic/tact -> social A 列有 ENV、MO 或 OVB 的某种组合; B 列是机智、命令、回声或口头语言的某种组合; C 栏社会,身体,或社会/身体或身体/社会。 FWIW 替换 ';'使用 '-' 给出相同的结果 FWIW - 我刚刚发现换行符有问题!我使用了 dos2unix 并在每个列值周围添加了引号。我会看看这是否有帮助。 【参考方案1】:

不确定这是否是您想要的。不过你可以试试:

require(igraph)
df[]<-lapply(df,strsplit,";")
el<-as.matrix(do.call(rbind,apply(df,1,expand.grid)))
g<-graph_from_edgelist(rbind(el[,-3],el[,-1]))
plot(g)

数据

df<-structure(list(V1 = c("ENV;MO", "ENV;MO", "OVB", "ENV;OVB", "OVB", 
"OVB;ENV;MO", "OVB;ENV;MO", "ENV;MO"), V2 = c("echoic;tact", 
"mand", "intraverbal", "tact", "intraverbal;tact", "intraverbal;mand", 
"intraverbal;mand", "mand"), V3 = c("social", "physical", "social", 
"social", "social", "social", "physical;social", "social;physical"
)), .Names = c("V1", "V2", "V3"), row.names = c(NA, -8L), class = "data.frame")

【讨论】:

我不一定要拆分';'联合价值观 - 但它看起来很棒。我会试一试,然后回复你。 不知道您是否希望多个值成为图形的单个节点。如果是这样的话,从我回答的df开始,也许graph_from_edgelist(rbind(as.matrix(df)[,-3],as.matrix(df[,-1])))就足够了。 生成的图像有点密集 - imgur.com/p4KnVjD 但我会查看 igraph 选项并尝试调整它 嘿 Nicola,这是一个很好的答案。当它可用时,我会向你发布赏金 - 谢谢。【参考方案2】:

您可以使用此代码(实际上它甚至不需要 igraph...):

# of course you need to install arcdiagram first
# as described in the pdf
library(arcdiagram) 

DF <- read.table(text=
"ENV;MO,echoic;tact,social 
ENV;MO,mand,physical
OVB,intraverbal,social
ENV;OVB,tact,social
OVB,intraverbal;tact,social
OVB;ENV;MO,intraverbal;mand,social
OVB;ENV;MO,intraverbal;mand,physical;social
ENV;MO,mand,social;physical",sep=',')

# replace ";" with "&\n"
DF[] <- lapply(DF,function(x)gsub(';',' &\n',x))

# create adjacency matrix
m <- rbind(as.matrix(DF[,1:2]),as.matrix(DF[,2:3]))

# plot...
arcplot(m ,col.arcs='DodgerBlue',lwd.arcs=2,col.labels='black',las=2)

【讨论】:

以上是关于3 列 CSV,到邻接矩阵,到网络图,到 Arcplot的主要内容,如果未能解决你的问题,请参考以下文章

基础图论总结

邻接表的网络存储空间很大吗

图论-图的存储方式

转换图。从一种类型的矩阵到另一种(以前的答案不正确)

将行元素传播到多行

图神经网络实战深入浅出地学习图神经网络GNN(上)