ggraph中geom_node系列函数aes映射无法识别数据列问题求助
核心问题原因
- igraph对象的边属性和顶点属性是独立存储的:
geom_edge_*系列函数读取边属性,geom_node_*系列读取顶点属性,二者不能直接混用原始边表的字段。- 第一个报错
object 'qcluster' not found:你调用graph_from_data_frame时没有传入顶点属性表,生成的igraph对象顶点只有name字段,没有qcluster相关属性,geom_node_point自然找不到对应字段。 - 第二个报错的两个诱因:
- 直接写
test$qcluster传入的向量和顶点顺序不匹配,会出现映射错乱; - 在
geom_node_point的aes里写alpha=match,顶点属性中没有match字段,R会默认调用内置的match()函数,因此提示传入了function类型的对象无法映射。
- 直接写
- 第一个报错
geom_edge_link能正常运行的原因:graph_from_data_frame会自动把输入的边表所有字段存为边属性,不需要额外设置。
修复方案
首先需要先提取所有顶点的属性表,建图时传入顶点参数,即可正常给geom_node系列做映射:
library(igraph) library(ggraph) library(tidyverse) # 1. 提取顶点及对应属性:合并query和subject的所有唯一值,关联对应的cluster node_info <- bind_rows( test %>% select(name = query, cluster = qcluster), test %>% select(name = subject, cluster = scluster) ) %>% # 去重,保证每个顶点只有一条属性记录 distinct(name, .keep_all = TRUE) # 2. 建图时传入vertices参数指定顶点属性 graph3 <- graph_from_data_frame(test, directed = FALSE, vertices = node_info) # 3. 绘图,geom_node可直接读取顶点属性表的cluster字段 ggraph(graph3, layout = "kk") + geom_edge_link(aes(colour = match, alpha = match)) + geom_node_point(aes(colour = cluster), size = 3) + geom_node_text(aes(label = name), repel = TRUE)
内容的提问来源于stack exchange,提问作者A foot of cinnamon
相关产品推荐
相关产品推荐

