R语言绘图调用legend函数报'legend' is of length 0错误如何解决
R绘图legend长度为0报错排查方案
报错根因
触发'legend' is of length 0错误的直接原因是:代码中传入legend()函数的图例标签参数levels(relatedness$RT)返回了长度为0的空向量,常见诱因有三个:
- 读入的
pihat.gen文件不存在RT列,可能是分隔符配置错误导致读入列错位、列名拼写不匹配(比如列名带多余空格、大小写不一致) - R版本差异导致
read.table()默认参数变化:R 4.0之后read.table()默认stringsAsFactors=FALSE,读入的文本列是字符型而非因子型,levels()函数作用在字符型向量上会返回NULL RT列全为缺失值/空值,无有效分类水平
排查流程
- 先运行
str(relatedness)查看读入数据的结构,确认三点:是否存在RT列、RT列的存储类型、RT列是否包含PO/UN两个分类取值 - 运行
head(relatedness)查看前6行数据,确认Z0、Z1、RT三列的数据读入没有错位,如果列错位就调整read.table()的sep参数匹配文件实际分隔符 - 单独运行
levels(relatedness$RT)确认返回值,如果返回NULL就说明RT列不是因子类型,不要依赖levels()自动取标签
修正后代码
pdf("rel.pdf") relatedness = read.table("pihat.gen", header=T) par(pch=16, cex=1) with(relatedness,plot(Z0,Z1, xlim=c(0,1), ylim=c(0,1), type="n")) with(subset(relatedness,RT=="PO") , points(Z0,Z1,col=4)) with(subset(relatedness,RT=="UN") , points(Z0,Z1,col=3)) # 直接显式指定图例标签,彻底避免levels取值为空的问题 legend(1,1, xjust=1, yjust=1, legend=c("PO","UN"), pch=16, col=c(4,3)) dev.off()
注意:原代码缺少
dev.off()语句,绘图完成后必须执行该语句关闭pdf绘图设备,否则生成的pdf文件会处于锁定状态,无法正常打开。
内容的提问来源于stack exchange,提问作者Mahan
相关产品推荐
相关产品推荐

