使用R与ggraph绘制自定义圆形图时遇数据框列数不足错误求助
解决
graph_from_data_frame报错并构建HPV变体层级圆形图 错误原因
你遇到的报错是因为igraph::graph_from_data_frame()要求edges参数必须是至少包含两列的数据框,分别表示连接的起点(父节点)和终点(子节点)。而你现在只传入了HPV_subtypes$HPVseq_p这一列向量,完全不符合函数的输入要求。
修正步骤与代码
1. 数据预处理
首先清理数据中的无效"na"值,然后构建父节点(HPVseq_p)和子节点(HPVseq_s)的对应关系,同时去重避免重复连接:
# 加载所需包 library(ggraph) library(igraph) library(tidyverse) library(viridis) # 导入你的数据 mydata_compressed <- structure(list(Sample = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), HPVseq_p = c("HPV16", "HPV16", "HPV16", "HPV16", "HPV16", "HPV16", "HPV16", "HPV16", "HPV16", "HPV33"), HPVseq_s = c("HPV16", "HPV53", "HPV16", "HPV16", "HPV16", "HPV16", "HPV16", "HPV16", "HPV16", "na"), HPVdPCR_p = c("HPV16", "HPV16", "na", "HPV16", "HPV16", "HPV16", "HPV16", "HPV16", "HPV16", "HPV33"), HPVdPCR_s = c("HPV16", "HPV16", "HPV16", "HPV16", "HPV16", "HPV16", "HPV16", "na", "HPV16", "na")), row.names = c(NA, -10L ), class = c("tbl_df", "tbl", "data.frame")) # 预处理:过滤无效值,构建父-子边数据框并去重 edges_df <- mydata_compressed %>% filter(HPVseq_p != "na", HPVseq_s != "na") %>% # 去掉无效的na节点 select(from = HPVseq_p, to = HPVseq_s) %>% # 重命名为图要求的from/to格式 distinct() # 去重,避免重复的连接关系 # 整理节点属性:标记节点是父节点还是子节点 vertices_df <- edges_df %>% pivot_longer(cols = everything(), names_to = "type", values_to = "name") %>% mutate(type = ifelse(type == "from", "父节点", "子节点")) %>% distinct()
2. 构建igraph对象
用处理好的边和节点数据构建图对象:
mygraph <- graph_from_data_frame(d = edges_df, vertices = vertices_df, directed = TRUE)
3. 绘制层级圆形图
用ggraph的circlepack布局实现“大圆圈包含子圆圈”的效果:
ggraph(mygraph, layout = 'circlepack') + geom_node_circle(aes(fill = type, size = stat(size))) + geom_node_text(aes(label = name), size = 3) + scale_fill_viridis(discrete = TRUE) + theme_void() + labs(title = "HPV变体层级圆形图", fill = "节点类型")
关键说明
circlepack布局会自动根据父-子关系生成包含式的圆形结构,正好匹配你的需求- 去重操作能避免重复连接导致图结构冗余
- 过滤
"na"值是为了避免无效节点干扰图的正常构建
内容的提问来源于stack exchange,提问作者peaches523
相关产品推荐
相关产品推荐

