当前位置: 首页 > 知识库问答 >
问题:

iGraph Ploly创建随机连接

林雅畅
2023-03-14

我尝试使用这里的示例代码在<code>中绘制<code>iGraph<code>网络图,并在我自己的<code>数据中使用shoehorn。帧,而不是使用示例空手道俱乐部数据。绘制图形时,它似乎忽略了边缘列表,并且正在进行一系列随机连接。我认为标签或边缘都是错的,但我不知道。

library(igraph)
library(plotly)

setwd('C:/Users/Andrew Riffle/Documents/MEGAsync/code/R/link_analysis')

ID <- c(1:50)
nodes <- data.frame(ID)

Source <- c(23, 24, 36, 20, 36, 41, 12, 8, 18, 28)
Target <- c(5, 7, 9, 35, 23, 12, 38, 29, 33, 45)
links <- data.frame(Source, Target)

net <- graph_from_data_frame(d=links, vertices=nodes, directed=FALSE)

net <- simplify(net, remove.multiple = F, remove.loops = T)

tkplot(net, vertex.label=nodes$id, vertex.label.color='white', layout=layout.fruchterman.reingold)

#####Begin plotly example code unmodified unless commented#####

G <- upgrade_graph(net) #put my iGraph object instead of the karate club one
L <- layout.circle(G)

vs <- V(G)
es <- as.data.frame(get.edgelist(G))

Nv <- length(vs)
Ne <- length(es[1]$V1)

Xn <- L[,1]
Yn <- L[,2]

network <- plot_ly(x = ~Xn, y = ~Yn, mode = "markers", text = vs$name, hoverinfo = "text")

edge_shapes <- list()
for(i in 1:Ne) {
  v0 <- es[i,]$V1
  v1 <- es[i,]$V2

  edge_shape = list(
    type = "line",
    line = list(color = "#030303", width = 0.3),
    x0 = Xn[v0],
    y0 = Yn[v0],
    x1 = Xn[v1],
    y1 = Yn[v1]
  )

  edge_shapes[[i]] <- edge_shape
}

axis <- list(title = "", showgrid = FALSE, showticklabels = FALSE, zeroline = FALSE)

p <- layout(
  network,
  title = 'Test Network', #Changed the title
  shapes = edge_shapes,
  xaxis = axis,
  yaxis = axis
)

p #added a call to display p instead of upload to plot.ly

当我运行这个时,我得到了这个漂亮的iGraph,它由Ploly绘制。但是,边是不正确的。似乎只有ID的1-10正在连接,并且只有其他ID的小于10。这些连接都不在下面的边缘列表中。

   Source Target
1      24     35
2      12     23
3      41     12
4      23      7
5      18      5
6      20      9
7      28     29
8      36     45
9       8     33
10     36     38

有人看到我做错了什么吗?帮助感激。

共有2个答案

商松
2023-03-14

发现教程其实是错的。如果使用< code>plot与使用< code>plotly绘制相同的空手道网络,则< code>plot中有许多连接是< code>plotly中没有的。

我已经放弃了这项工作,visNetwork是一个很好的选择,我很容易找到它。建议任何有类似问题的人阅读此文章。

呼延珂
2023-03-14

我知道对于OP来说有点太晚了,但对于偶然遇到同样问题的其他人来说(就像我一样)。

我可以建议对教程源代码进行以下五项更改:

G <- upgrade_graph(net)
L <- layout.circle(G)
rownames(L) <- get.vertex.attribute(G)$name           #added line (#1 out of 5)

vs <- V(G)
es <- as.data.frame(get.edgelist(G))

Nv <- length(vs)
Ne <- length(es[1]$V1)

Xn <- L[,1]
Yn <- L[,2]

network <- plot_ly(x = ~Xn, y = ~Yn, mode = "markers", text = vs$name, hoverinfo = "text")

edge_shapes <- list()
for(i in 1:Ne) {
  v0 <- es[i,]$V1
  v1 <- es[i,]$V2

  edge_shape = list(
    type = "line",
    line = list(color = "#030303", width = 0.3),
    x0 = L[which(v0==rownames(L)),][1],               #changed line (#2 out of 5)                
    y0 = L[which(v0==rownames(L)),][2],               #changed line (#3 out of 5)
    x1 = L[which(v1==rownames(L)),][1],               #changed line (#4 out of 5)
    y1 = L[which(v1==rownames(L)),][2]                #changed line (#5 out of 5)
  )

  edge_shapes[[i]] <- edge_shape
}

axis <- list(title = "", showgrid = FALSE, showticklabels = FALSE, zeroline = FALSE)

p <- layout(
  network,
  title = 'Test Network', #Changed the title
  shapes = edge_shapes,
  xaxis = axis,
  yaxis = axis
)

p

现在工作正常。

 类似资料:
  • 问题内容: 我创建了以下方法,以便创建唯一的随机数。(此唯一值属于树的节点): 但这并不会创建唯一的数字,并且我的列表中仍然有重复的数字。喜欢 : 问题答案: 问题是,如果它发现重复的数字,您不会在检查函数中停止for循环。循环继续进行,b可以变回true。 例如,您应该做的是:

  • 问题内容: 我想知道是否有一种方法可以选择随机生成的100和500之间的数字以及选择查询。 例如: 我不必将此数字存储在db中,仅用于显示目的。 我尝试过类似的方法,但是无法正常工作。 希望有人帮助我。谢谢 问题答案: 这应该给出您想要的: 通常,生成一个介于>和包含之间的数字。 更新资料 完整的声明应该起作用:

  • 在本例中,最大值仅为5,因此我可以逐个检查副本,但如何以更简单的方式执行此操作?例如,如果最大值为20,该怎么办?谢谢

  • 当您导入java.util.random之后,您可以通过两种方式生成随机整数和随机double。 您可以创建Random类的一个实例

  • 问题内容: 在这种情况下,MAX仅为5,因此我可以一张一张地检查重复项,但是如何以更简单的方式进行检查呢?例如,如果MAX的值为20,该怎么办?谢谢。 问题答案: 最简单的方法是创建一个可能数字的列表(1..20或任何数字),然后用对其进行混洗。然后,只需考虑你想要的许多元素。如果你的范围最终等于你需要的元素数量(例如,用于洗牌的卡片),则这非常好。 如果你想要(说)1..10,000范围内的10

  • 问题内容: 我正在运行一个网站,并且有一个计分系统,可为您提供玩游戏次数的积分。 它使用散列来证明http请求评分的完整性,因此用户无法更改任何内容,但是正如我担心的那样,有人发现他们不需要更改它,他们只需要获得高分并复制http请求,标头和所有。 以前,我被禁止防御此攻击,因为它被认为不太可能。但是,既然已经发生,我可以。http请求源自Flash游戏,然后由php验证,然后php将其输入数据库