将顶点属性添加到NetworkD3对象

时间:2019-08-07 14:05:52

标签: r text analysis networkd3

问候人们,

出于网络视觉的目的,我一直在努力向中的对象添加颜色组。呈现视觉效果的代码很稳定,但是我目前将分组变量设置为1。棘手的一点是,我有一个单独的表,用于评估颜色组。

我试图通过首先生成一个列表将其添加为向量。

V(network)$color <- group[V(network)$name]

我还尝试了一个名为makeVertexAtt的自定义函数,还使用了中的set_vertex_attrvertex_attr-set,但无济于事。我在网络对象内进行简单连接时遇到的问题是cannot coerce class ‘"igraph.vs"’ to a data.frame。足够公平,但是如果创建矢量并将其添加进去,则会出现Not a graph object错误。

举个例子(由于这不是一个图形对象),我有这个名字向量:

V(Graph)$names<-c("knife","kitchen","toilet","shower","toothbrush", "shed")

然后我有一个单独的数据集,该数据集包含单词和类别两列。

Word<-c("knife","kitchen","toilet","shower","toothbrush")
Category <-c("Kitchen","Kitchen","bathroom","bathroom","bathroom")

理想情况下,我希望具有匹配向量的V(graph)$ color属性

V(graph)$color<-c("Kitchen","Kitchen","bathroom","bathroom","bathroom","N/A")

任何想法都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

问候人们,我想我解决了我的问题。 networkD3对象是列表的列表。在Python中使用该概念非常好,但是在R中访问级别时,我没有使用两个$进入列表列表。

因此,不要将组变量应用于network.D3$nodes。我需要向network.D3$nodes$group添加新顶点。因此,为了解决我的问题,我在调用中同时创建了一个合并变量,

group<- as.dataframe (Word,Category)

list<-merge (x=network.D3$nodes, y=group, x.by="names", y.by="Word",all.x=TRUE)

network.D3$nodes$group<-list$Category

forceNetwork(Links = network.D3$links, 
             Nodes = network.D3$nodes, 
             Source = 'source', 
             Target = 'target',
             NodeID = 'name',
             Group = 'group',
             opacity = 0.9,
             Value = 'Width',
             fontSize = 12,
             zoom = TRUE, 
             opacityNoHover = 1)

更新

我发现我的计划有缺陷。由于某种原因,将向量创建为单独的评估值,然后再将其重新添加不起作用,因为networkD3对象的顺序发生了变化吗?这是奇怪的行为。 (不幸的是,由于数据保护,我无法分享真实的例子。)

因此,我尝试使用以下代码在创建属性的过程中进行评估:

network.D3$nodes$group<- list(merge(x=network.D3$nodes,y=Lexicon, by="name", all.x = TRUE))

但这会将顶点添加为数据帧,然后无法将其放置在forcenetwork中。在plyr中进行尝试并没有提供更好的结果。

network.D3$nodes$group<- Lexicon %>% join(network.D3$nodes,Lexicon,by="name",type = "left")) %>% select(list(Category_1))

>Error in match.arg(match, c("first", "all")) : 
  'arg' must be NULL or a character vector

如何在匹配评估之后添加向量,将结果保存为可以分配给列表对象的networkD3列表的向量?

答案 1 :(得分:0)

这是一种将组信息从一个数据框合并到节点数据框的简便方法

names <- c("knife", "kitchen", "toilet", "shower", "toothbrush", "shed")
nodes <- data.frame(names, stringsAsFactors = FALSE)

Word <- c("knife", "kitchen", "toilet", "shower", "toothbrush")
Category <- c("Kitchen", "Kitchen", "bathroom", "bathroom", "bathroom")
group <- data.frame(Word, Category, stringsAsFactors = FALSE)

nodes$group <- group$Category[match(nodes$names, group$Word)]

nodes
#       names    group
# 1      knife  Kitchen
# 2    kitchen  Kitchen
# 3     toilet bathroom
# 4     shower bathroom
# 5 toothbrush bathroom
# 6       shed     <NA>