ggplot2如何按AF阈值为符合条件的数据点添加对应误差线
报错原因分析
三个尝试方案的核心问题如下:
- 方案1:
fun.min、fun.max是stat_summary层的专用参数,基础geom_errorbar几何对象仅识别直接传入的ymin、ymax美学映射,因此会提示缺少必需美学、参数未知。同时自定义函数中使用的if、&&是标量运算逻辑,直接传入数据框列的向量时仅会判断第一个元素,无法逐行计算。 - 方案2:两处错误:一是使用仅支持单值判断的
&&做向量条件判断,应使用向量化运算符&;二是不符合条件的点将ymin/ymax设为0而非空值,ggplot会将0识别为有效坐标绘制误差线,且因为&&仅判断第一个元素,所有点都套用了第一行的计算结果,导致误差线长度完全一致。 - 方案3:
stat_summary的fun.min、fun.max参数要求传入函数对象,直接传入函数执行后返回的数值向量会触发类型转换错误。
正确实现代码
直接在geom_errorbar的美学映射中用向量化ifelse逐行计算误差线上下限,不符合条件的行赋值为NA_real_,ggplot会自动跳过空值不绘制误差线:
p <- ggplot(data=chr1, aes(x=x_values0, y=AF))+ geom_point(aes(col=color), size=2) p + geom_errorbar( aes( ymin = ifelse(AF > 10 & AF < 95, AF - sdPopHetAF, NA_real_), ymax = ifelse(AF > 10 & AF < 95, AF + sdPopHetAF, NA_real_) ), width = 0.2 # 可根据需求调整误差线横向宽度 )
注意:条件判断必须使用向量化运算符
&,不能用仅支持单值运算的&&,否则无法逐行生效;不符合条件的赋值必须用NA类空值,不能设为0,否则会绘制出从坐标0开始的无效误差线。
运行以上代码,即可仅为AF值在1095之间的点(示例数据中为pos1、pos3、pos5、pos6)添加对应长度的误差线,比如pos1的误差线范围为50±12.3即37.762.3,符合逐行计算的逻辑。
内容的提问来源于stack exchange,提问作者Jeni
相关产品推荐
相关产品推荐

