如何优化QQ图标注:仅显示显著性最高的部分数据点
QQ图标注重叠优化方案
方案1:基础绘图环境下筛选显著性高的点标注
你可以通过设定p值阈值或者选择top N个最显著的点(p值最小的N个)进行标注,从根源上减少标注数量避免重叠:
loc <- qqnorm(C_A$p_value, ylim = extendrange(C_A$p_value, f = 0.05)) # 方法A:仅标注p值小于指定阈值的点,示例阈值为0.0001 idx <- which(C_A$p_value < 0.0001) text(loc$x[idx], loc$y[idx], C_A$CONTROL_ASYMPTOMATIC[idx], pos = 3, cex = 0.8) # 方法B:仅标注p值最小的前N个点,示例取前3个最显著的点 # idx <- order(C_A$p_value)[1:3] # text(loc$x[idx], loc$y[idx], C_A$CONTROL_ASYMPTOMATIC[idx], pos = 3, cex = 0.8)
可以调整cex参数缩小字号,或给不同点设置不同的pos参数(1/2/3/4对应下/左/上/右四个方向)进一步避免重叠。
方案2:使用自动防重叠标注工具
如果需要标注的点数量较多,手动调整效率低,可以换用ggplot2 + ggrepel组合绘制QQ图,geom_text_repel会自动计算位置错开标签:
# 需提前安装安装包:install.packages(c("ggplot2", "ggrepel")) library(ggplot2) library(ggrepel) # 计算QQ图对应理论分位数 df_qq <- data.frame( observed_p = C_A$p_value, expected_quantile = qnorm(ppoints(nrow(C_A))), species = C_A$CONTROL_ASYMPTOMATIC ) # 筛选需要标注的点,示例取p值最小的前5个 df_qq$show_label <- ifelse(df_qq$observed_p %in% sort(C_A$p_value)[1:5], as.character(df_qq$species), NA) # 绘制QQ图 ggplot(df_qq, aes(x = expected_quantile, y = observed_p)) + geom_point(size = 2) + geom_text_repel( aes(label = show_label), na.rm = TRUE, size = 3, max.overlaps = 20, # 调整允许的最大重叠数 box.padding = 0.3 ) + labs(x = "理论正态分位数", y = "观测p值") + theme_bw()
内容的提问来源于stack exchange,提问作者PesKchan
相关产品推荐
相关产品推荐

