使用qqman包绘制曼哈顿图报错:need finite 'ylim' values
使用qqman绘制曼哈顿图时出现"need finite 'ylim' values"报错的解决方案
问题描述
我使用qqman包基于4组不同的汇总统计量绘制曼哈顿图,前两张图正常生成无报错,但第三张图执行时出现报错。搜索报错信息后得知可能是数据中存在非数值型值,但检查后发现仅SNP列不是数值型,而前两张图的数据集同样存在这个情况。
绘制前两张图和第三张图的代码完全一致,仅替换了文件名和图名中的数字,代码如下:
data = fread("/z/Comp/lu_group/Members/jwlorge/ATN/scripts/data/temp_gwas/output_3/all_chunks_output_3.txt.gz", fill=TRUE, header=TRUE) data$CHR = as.numeric(as.factor(data$CHR)) data$BP = as.numeric(data$BP) data$Pval_Estimate = as.numeric(data$Pval_Estimate) s = length(unique(data$SNP)) jpeg('corrplot3.jpg') manhattan(data,chr="CHR", bp="BP", p="Pval_Estimate", na.action=TRUE, main = "Factor 3", sub = paste0(s, " SNPs")) dev.off()
报错出现在manhattan()函数执行阶段,完整报错信息:
Error in plot.window(...) : need finite 'ylim' values Calls: manhattan ... do.call -> plot -> plot.default -> localWindow -> plot.window
可能的原因及排查修复步骤
- P值列存在异常值:曼哈顿图的Y轴基于
-log10(P值)计算,若第三组数据的Pval_Estimate列出现以下情况,会导致Y轴范围无法确定:- 所有P值均为1(
-log10(1)=0,无有效波动范围) - 存在大于1或小于0的非法P值(会导致
-log10()返回Inf或NaN) - 大量/全部P值为NA(转换numeric时产生的无效值)
运行以下代码排查:
# 查看P值的有效范围 range(data$Pval_Estimate, na.rm = TRUE) # 统计P值列的NA数量 sum(is.na(data$Pval_Estimate)) # 统计非法P值的数量 sum(data$Pval_Estimate > 1 | data$Pval_Estimate < 0, na.rm = TRUE) - 所有P值均为1(
- 染色体或碱基对列无有效数据:若
CHR或BP列全部为NA,或没有有效数值,会导致绘图时无法确定X轴范围,进而影响Y轴计算。排查代码:sum(is.na(data$CHR)) sum(is.na(data$BP)) na.action参数设置错误:na.action参数需要传入处理NA的函数(如na.omit),而非布尔值TRUE。错误的参数会导致无效数据未被过滤,进而干扰坐标轴计算。修改为:manhattan(data,chr="CHR", bp="BP", p="Pval_Estimate", na.action=na.omit, main = "Factor 3", sub = paste0(s, " SNPs"))- 数据集为空或无有效行:检查第三组数据的读取结果,是否存在读取后数据为空的情况:
nrow(data)
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

