You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:36:04