如何在R散点图中添加校正后p值与相关系数?
解决方案:分面散点图添加校正后p值与相关系数
核心思路是预先批量计算带校正p值的相关性统计量,再将其与分面散点图匹配自动化添加,避免手动插入文本的繁琐,具体步骤如下:
1. 批量计算校正后的相关性统计量
使用correlation包一次性计算所有变量对的Kendall相关系数与Holm校正p值,并整理成与分面变量匹配的格式:
library(dplyr) library(correlation) library(glue) # 计算带Holm校正的相关性 cor_stats <- correlation( data = apq_apq156_ctq_metadjagg_fshort_df, select = "resp_percentage", select2 = c("apqg_iv", "apqg_pp", "apqg_pm", "apqg_id", "apqg_cp"), method = "kendall", p_adjust = "holm", ci = 0.95 ) |> # 提取并重命名关键列,匹配分面变量名 select(Parameter2, r, p) |> rename(apq_scales = Parameter2, tau = r, p_adj = p) |> # 格式化显示文本,优化p值展示逻辑 mutate( cor_label = case_when( p_adj < 0.001 ~ glue("τ = {round(tau, 2)}\np_adj < 0.001"), TRUE ~ glue("τ = {round(tau, 2)}\np_adj = {round(p_adj, 3)}") ) )
2. 绘制分面散点图并添加统计量
在原有ggplot代码基础上,通过geom_text()将预计算的统计量文本映射到对应分面,无需手动逐个插入:
library(ggplot2) library(tidyr) library(forcats) adj_apq_scat_gg <- apq_apq156_ctq_metadjagg_fshort_df |> pivot_longer(apqg_iv:apqg_cp, names_to = "apq_scales", values_to = "apq_values") |> ggplot(aes(x = resp_percentage, y = apq_values)) + geom_point(size=2, color="#808080") + geom_smooth(method="lm", se=TRUE, fullrange=FALSE, level=0.95, color="#4169E1") + facet_wrap(vars(fct_inorder(apq_scales)), ncol = 5) + labs(x = "Response Percentage Adjective Task", y = "APQ Scale Value") + # 添加校正后的相关系数与p值,定位在分面右上角 geom_text( data = cor_stats, aes(x = Inf, y = Inf, label = cor_label), hjust = 1.1, vjust = 1.1, size = 3.5, inherit.aes = FALSE # 避免继承主图的x/y映射 ) # 输出图形 adj_apq_scat_gg
针对你原有方法的补充说明
- 关于
stat_cor():该函数仅在单个分面内计算原始p值,不支持跨分面的p值校正,因此必须预先批量计算校正后p值再添加,无法直接通过stat_cor()实现。 - 关于
correlation::cor_test():若想批量生成单个散点图,可结合purrr循环处理,但分面图的方式更高效简洁,无需单独拼接多个图形。 - 关于
correlation::correlation()的可视化:该函数默认输出相关性矩阵的星形图,若要得到散点图,需自行用ggplot绘制,再将其计算的校正统计量整合到图中,这正是上述方案的核心逻辑。
内容的提问来源于stack exchange,提问作者Constantin Schmitt
相关产品推荐
相关产品推荐

