在 "arcplot" 中使用 R 中的所有属性进行排序时出现问题

Problem ordering in "arcplot" with all the attributes in R

我正在尝试用 arcdiagram 包内的 arcplot 函数制作一个 arcplot,到目前为止我想我知道基础知识,但是如果我改变顶点的顺序,线条不会改变他们应该做的。它只是重新排序标签。

我会尽量解释这个过程,以防有帮助

edgelist = get.edgelist(net)
# get vertex labels
vlabels = get.vertex.attribute(net, "name")
# get vertex groups
vgroups = get.vertex.attribute(net, "group")
# get vertex fill color
vfill = get.vertex.attribute(net, "color")

# get vertex degree
degrees = degree(net)
# get edges value
values = get.edge.attribute(net, "value")

# data frame with vgroups, degree, vlabels and ind
x = data.frame(vgroups, vfill, degrees, vlabels, ind=1:vcount(net))
x = na.omit(x)
felec = x$ind
fcol = x$vfill

我正在尝试绘制不同的电极排列,我附上这个矩阵作为一个可重现的例子:

> edgelist
       [,1]    [,2]   
  [1,] "Fp1_1" "F8_2" 
  [2,] "Fp1_1" "FC5_2"
  [3,] "Fp1_1" "FC2_2"
  [4,] "Fp1_1" "FC6_2"
  [5,] "Fp1_1" "CP6_2"
  [6,] "Fp2_1" "Fp2_2"
  [7,] "Fp2_1" "F7_2" 
  [8,] "Fp2_1" "C3_2" 
  [9,] "Fp2_1" "Cz_2" 
 [10,] "Fp2_1" "CP2_2"
 [11,] "Fp2_1" "P7_2" 
 [12,] "Fp2_1" "Pz_2" 
 [13,] "Fp2_1" "P8_2" 
 [14,] "Fp2_1" "POz_2"
 [15,] "F7_1"  "F3_2" 
 [16,] "F7_1"  "FC5_2"
 [17,] "F7_1"  "C3_2" 
 [18,] "F7_1"  "Cz_2" 
 [19,] "F7_1"  "CP1_2"
 [20,] "F7_1"  "P4_2" 
 [21,] "F3_1"  "Fp1_2"
 [22,] "F3_1"  "Fp2_2"
 [23,] "F3_1"  "Fz_2" 
 [24,] "F3_1"  "F8_2" 
 [25,] "F3_1"  "FC2_2"
 [26,] "F3_1"  "CP5_2"
 [27,] "F3_1"  "P7_2" 
 [28,] "Fz_1"  "Fp1_2"
 [29,] "Fz_1"  "Fp2_2"
 [30,] "Fz_1"  "Fz_2" 
 [31,] "Fz_1"  "FC5_2"
 [32,] "Fz_1"  "FC6_2"
 [33,] "Fz_1"  "Cz_2" 
 [34,] "Fz_1"  "CP5_2"
 [35,] "Fz_1"  "CP6_2"
 [36,] "Fz_1"  "P4_2" 
 [37,] "Fz_1"  "P8_2" 
 [38,] "Fz_1"  "POz_2"
 [39,] "F4_1"  "Fp2_2"
 [40,] "F4_1"  "F4_2" 
 [41,] "F4_1"  "FC6_2"
 [42,] "F4_1"  "Cz_2" 
 [43,] "F4_1"  "CP5_2"
 [44,] "F4_1"  "CP1_2"
 [45,] "F4_1"  "P3_2" 
 [46,] "F4_1"  "Pz_2" 
 [47,] "F4_1"  "Oz_2" 
 [48,] "F8_1"  "F7_2" 
 [49,] "F8_1"  "F3_2" 
 [50,] "F8_1"  "Fz_2" 
 [51,] "F8_1"  "FC2_2"
 [52,] "F8_1"  "C3_2" 
 [53,] "F8_1"  "Cz_2" 
 [54,] "F8_1"  "CP5_2"
 [55,] "F8_1"  "CP2_2"
 [56,] "F8_1"  "P7_2" 
 [57,] "F8_1"  "P3_2" 
 [58,] "F8_1"  "P4_2" 
 [59,] "FC5_1" "F7_2" 
 [60,] "FC5_1" "F3_2" 
 [61,] "FC5_1" "Fz_2" 
 [62,] "FC5_1" "FC5_2"
 [63,] "FC5_1" "FC1_2"
 [64,] "FC5_1" "CP6_2"
 [65,] "FC5_1" "P7_2" 
 [66,] "FC5_1" "Pz_2" 
 [67,] "FC1_1" "FC2_2"
 [68,] "FC1_1" "Cz_2" 
 [69,] "FC1_1" "CP5_2"
 [70,] "FC1_1" "CP2_2"
 [71,] "FC1_1" "CP6_2"
 [72,] "FC1_1" "P3_2" 
 [73,] "FC2_1" "Fp1_2"
 [74,] "FC2_1" "F4_2" 
 [75,] "FC2_1" "C3_2" 
 [76,] "FC2_1" "CP1_2"
 [77,] "FC6_1" "Fp2_2"
 [78,] "FC6_1" "F8_2" 
 [79,] "FC6_1" "Cz_2" 
 [80,] "FC6_1" "CP2_2"
 [81,] "FC6_1" "CP6_2"
 [82,] "FC6_1" "P8_2" 
 [83,] "C3_1"  "Fp2_2"
 [84,] "C3_1"  "FC5_2"
 [85,] "C3_1"  "FC2_2"
 [86,] "C3_1"  "Cz_2" 
 [87,] "C3_1"  "P3_2" 
 [88,] "C3_1"  "P8_2" 
 [89,] "Cz_1"  "Fp2_2"
 [90,] "Cz_1"  "Fz_2" 
 [91,] "Cz_1"  "C3_2" 
 [92,] "Cz_1"  "CP5_2"
 [93,] "Cz_1"  "CP2_2"
 [94,] "Cz_1"  "P4_2" 
 [95,] "Cz_1"  "Oz_2" 
 [96,] "C4_1"  "Fz_2" 
 [97,] "C4_1"  "FC5_2"
 [98,] "C4_1"  "FC1_2"
 [99,] "C4_1"  "FC2_2"
[100,] "C4_1"  "C3_2" 
[101,] "C4_1"  "P3_2" 
[102,] "CP5_1" "F8_2" 
[103,] "CP5_1" "Cz_2" 
[104,] "CP5_1" "P7_2" 
[105,] "CP5_1" "Oz_2" 
[106,] "CP1_1" "F4_2" 
[107,] "CP1_1" "FC5_2"
[108,] "CP1_1" "C3_2" 
[109,] "CP1_1" "P7_2" 
[110,] "CP1_1" "Pz_2" 
[111,] "CP1_1" "POz_2"
[112,] "CP1_1" "Oz_2" 
[113,] "CP2_1" "F7_2" 
[114,] "CP2_1" "F4_2" 
[115,] "CP2_1" "CP2_2"
[116,] "CP6_1" "Fz_2" 
[117,] "CP6_1" "FC2_2"
[118,] "CP6_1" "C3_2" 
[119,] "CP6_1" "P7_2" 
[120,] "CP6_1" "P3_2" 
[121,] "CP6_1" "P4_2" 
[122,] "P7_1"  "F4_2" 
[123,] "P7_1"  "FC5_2"
[124,] "P7_1"  "CP5_2"
[125,] "P7_1"  "P4_2" 
[126,] "P7_1"  "P8_2" 
[127,] "P7_1"  "POz_2"
[128,] "P3_1"  "FC6_2"
[129,] "P3_1"  "Cz_2" 
[130,] "P3_1"  "CP6_2"
[131,] "P3_1"  "P3_2" 
[132,] "P3_1"  "P8_2" 
[133,] "P3_1"  "POz_2"
[134,] "P3_1"  "Oz_2" 
[135,] "Pz_1"  "Fp1_2"
[136,] "Pz_1"  "Fz_2" 
[137,] "Pz_1"  "FC5_2"
[138,] "Pz_1"  "Cz_2" 
[139,] "Pz_1"  "CP1_2"
[140,] "Pz_1"  "P7_2" 
[141,] "Pz_1"  "P3_2" 
[142,] "P4_1"  "F3_2" 
[143,] "P4_1"  "Fz_2" 
[144,] "P4_1"  "F4_2" 
[145,] "P4_1"  "FC1_2"
[146,] "P4_1"  "P7_2" 
[147,] "P8_1"  "Fp2_2"
[148,] "P8_1"  "Fz_2" 
[149,] "P8_1"  "FC2_2"
[150,] "POz_1" "F4_2" 
[151,] "POz_1" "FC1_2"
[152,] "POz_1" "C3_2" 
[153,] "POz_1" "POz_2"
[154,] "Oz_1"  "F4_2" 
[155,] "Oz_1"  "C3_2" 
[156,] "Oz_1"  "Cz_2" 
[157,] "Oz_1"  "P7_2" 
[158,] "Oz_1"  "P3_2" 
[159,] "Oz_1"  "P4_2" 
[160,] "Oz_1"  "P8_2" 

我知道脚本正在迭代以获取台词,我的顺序就是您在图像中看到的顺序。从看起来它首先采用第一个边缘和绘图然后继续。

´´´> arcplot(edgelist)´´

现在,如果我使用 ordering 参数将 arcplot 重新排序为我想要的顺序,我将按预期进行重新排序。

> arcplot(edgelist, ordering = felec)

但是,现在我无法添加带有颜色的矢量,因为在内部 arcplot 仍然有它自己的初始顺序从边缘出来而不是新的(顺便说一句,与原始顺序网络相关联)。

> arcplot(edgelist, ordering = felec, col.nodes = fcol)

不幸的是,我期待这样的事情,当我删除重新排序并使用原始向量中的顺序时会发生这种情况。当然现在,函数自动生成的顺序又是错误的。

> arcplot(edgelist, col.nodes = fcol)

从这个意义上说,预测 edgelist 的输出顺序非常有用,以便相应地准备向量。

当然,这也会发生在所有其他属性上,包括 degree 和所有其他属性。

如果有人可能知道如何预测或提取此顺序以便我可以使用其余属性,我将非常感谢任何帮助或想法,我不知道绘制弧线图的任何其他方法。

谢谢!

我最终使用了 tidyverse 中的 ggraph,比 arcplot 更通用。学习花了我30m或更少,我的建议:不要卡在这个包里。

我post代码以防对任何人有用:

edgelist <- get.edgelist(net)
# get vertex labels
label <- get.vertex.attribute(net, "name")
# get vertex groups
group <- get.vertex.attribute(net, "group")
# get vertex fill color
fill <- get.vertex.attribute(net, "color")
# get family
family <- get.vertex.attribute(net, "family")
# get vertex degree
degrees <- degree(net)

# data frame with groups, degree, labels and id
nodes <- data.frame(group, degrees, family, label, fill, id=1:vcount(net))
nodes$family <- factor(nodes$family, levels = unique(nodes$family))
nodes$label <- factor(nodes$label, levels = unique(nodes$label))
nodes <- as_tibble(nodes)
#nodes <- na.omit(nodes)

# prepare data for edges
edges <- as_tibble(edgelist)

net.tidy <- tbl_graph(nodes = nodes, edges = edges, directed = TRUE, node_key = "label")

ggraph(net.tidy, layout = "linear") + 
  geom_edge_arc(alpha = 0.5) + 
  scale_edge_width(range = c(0.2, 2)) +
  scale_colour_manual(values= vrtxc) +
  geom_node_point(aes(size = degrees, color = family)) +
  geom_node_text(aes(label = label), angle = 90, hjust = 1, nudge_y = -0.2, size = 4) +   
  coord_cartesian(clip = "off") + 
  theme_graph()+
  theme(legend.position = "top")