ggplot设置PRCC结果X轴刻度:符号与下标失效问题求助
LHS-PRCC敏感性分析ggplot刻度设置问题解决
问题背景
我用LHS-PRCC技术对16个参数、10000组参数集做敏感性分析(示例用100组数据测试),生成数据和计算PRCC的代码如下:
df <- cbind( pcb = runif(100,0,1), pbc = runif(100,0,1), psb = runif(100,0,1), pbs = runif(100,0,1), pci = runif(100,0,1), pic = runif(100,0,1), psi = runif(100,0,1), pis = runif(100,0,1), epsilonc = runif(100,0,1), epsilons = runif(100,0,1), gammac = runif(100,0,1), gammas = runif(100,0,1), tauc = runif(100,0,1), taus = runif(100,0,1), sigmab = runif(100,0,1), sigmai = runif(100,0,1), summary.statistic = runif(100,0,1)) bonferroni.alpha <- 0.05/16 PRCC <- pcc(df[ , 1:16], df[ ,17], nboot = 10000, rank = TRUE, conf = 1- bonferroni.alpha)
用基础ggplot代码能正常出图:
plot <- ggplot(PRCC, mapping = aes(), environment = parent.frame(), ylim = c(-1,1)) + ggtitle("PRCC")
但想给X轴刻度设置带下标和符号的格式时,添加scale_x_discrete后X轴刻度直接消失了,出错代码:
plot <- ggplot(PRCC, mapping = aes(), environment = parent.frame(), ylim = c(-1,1)) + ggtitle("PRCC") + scale_x_discrete(breaks=c("pcb","pbc","psb","pbs", "pci","pic", "epsilonc","epsilons","gammac","gammas", "tauc","taus", "sigmab", "sigmai"),labels=c((expression(p[cb])), (expression(p[bc])), (expression(p[sb])), (expression(p[bs])), (expression(p[ci])), (expression(p[ic])), (expression(Epsilon[c])),(expression(Epsilon[s])),(expression(Gamma[c])),(expression(Gamma[s])),(expression(Tau[c])),(expression(Tau[s])),(expression(Sigma[b])),(expression(Sigma[i]))))
问题原因及解决方法
1. 核心问题:参数遗漏+映射未明确
你的breaks参数只列了14个参数,漏掉了原始数据中的psi和pis,导致ggplot无法匹配所有X轴刻度,进而全部消失。另外,原ggplot代码未明确指定X、Y轴的映射关系,这也是绘图逻辑不严谨的地方。
2. 修复后的完整代码
假设你用的是sensitivity包的pcc函数,返回的结果包含Parameter(参数名)、Estimate(PRCC值)、Lower/Upper(置信区间)列,修复后的代码如下:
# 加载必要包 library(ggplot2) library(sensitivity) # 生成数据(示例) df <- cbind( pcb = runif(100,0,1), pbc = runif(100,0,1), psb = runif(100,0,1), pbs = runif(100,0,1), pci = runif(100,0,1), pic = runif(100,0,1), psi = runif(100,0,1), pis = runif(100,0,1), epsilonc = runif(100,0,1), epsilons = runif(100,0,1), gammac = runif(100,0,1), gammas = runif(100,0,1), tauc = runif(100,0,1), taus = runif(100,0,1), sigmab = runif(100,0,1), sigmai = runif(100,0,1), summary.statistic = runif(100,0,1)) bonferroni.alpha <- 0.05/16 PRCC <- pcc(df[, 1:16], df[,17], nboot = 10000, rank = TRUE, conf = 1 - bonferroni.alpha) # 转换为数据框(部分pcc返回的是列表,需提取结果) PRCC_df <- as.data.frame(PRCC$PRCC) PRCC_df$Parameter <- rownames(PRCC_df) # 绘图:明确映射+完整刻度设置 plot <- ggplot(PRCC_df, aes(x = Parameter, y = Estimate)) + geom_point(size = 3) + geom_errorbar(aes(ymin = Lower, ymax = Upper), width = 0.2) + ggtitle("PRCC敏感性分析结果") + ylim(c(-1, 1)) + scale_x_discrete( breaks = c("pcb","pbc","psb","pbs", "pci","pic", "psi", "pis", "epsilonc","epsilons","gammac","gammas", "tauc","taus", "sigmab", "sigmai"), labels = c( expression(p[cb]), expression(p[bc]), expression(p[sb]), expression(p[bs]), expression(p[ci]), expression(p[ic]), expression(p[si]), expression(p[is]), expression(epsilon[c]), expression(epsilon[s]), expression(gamma[c]), expression(gamma[s]), expression(tau[c]), expression(tau[s]), expression(sigma[b]), expression(sigma[i]) ) ) + theme_bw() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转X轴标签避免重叠 print(plot)
3. 关键修复点
- 补全
breaks和labels中的所有16个参数,确保与原始数据的参数名完全匹配; - 明确指定ggplot的
aes映射(x=Parameter, y=Estimate),避免空映射导致的逻辑混乱; - 若
pcc返回的是列表而非数据框,需先提取核心结果转换为数据框; - 可选:添加误差棒展示置信区间,旋转X轴标签避免重叠,提升可读性。
内容的提问来源于stack exchange,提问作者JDK
相关产品推荐
相关产品推荐

