如何为PwrPlot生成的ggplot图形添加颜色图例并解决运行警告问题
警告问题修复
你遇到的is.na() applied to non-(list or vector) of type 'expression'警告是旧版ggplot2对geom_text中直接传入expression对象的兼容性问题,将expression写法替换为文本字符串+parse=TRUE参数即可消除警告。
自动图例实现
原代码直接在stat_function中指定固定fill值,没有映射到ggplot的美学维度,因此无法自动生成图例。只需要把每个填充区域的fill参数放到aes()内部,赋值为对应区域的含义标签,再用scale_fill_manual手动匹配颜色和显示标签,即可生成适配参数变化的图例,无需写死坐标的文本标注。
修改后完整代码
PwrPlot <- function(mu0=0, mu1=1.9, sig0=1, sig1=1, alpha=0.05, tail=1){ # 提前计算临界值,避免重复运算 cutoff <- qnorm(1-alpha/tail, mu0, sig0) ggplot(data.frame(x = -4:5), aes(x)) + # H0分布拒绝域(对应alpha) stat_function(fun = dnorm, args = c(mu0, sig0), geom = 'area', xlim = c(cutoff, 5), aes(fill = "alpha")) + stat_function(fun = dnorm, args = c(mu0, sig0)) + # H0分布接受域(对应1-alpha) stat_function(fun = dnorm, args = c(mu0, sig0), geom = 'area', xlim = c(-4, cutoff), aes(fill = "1-alpha")) + stat_function(fun = dnorm, args = c(mu0, sig0)) + # H1分布曲线 stat_function(fun = dnorm, args = c(mu1, sig1)) + # H1分布拒绝域(对应检验功效1-beta) stat_function(fun = dnorm, args = c(mu1, sig1), geom = 'area', xlim = c(cutoff, 5), alpha=0.2, aes(fill = "1-beta")) + # H1分布接受域(对应第二类错误beta) stat_function(fun = dnorm, args = c(mu1, sig1), geom = 'area', xlim = c(-4, cutoff), alpha=0.5, aes(fill = "beta")) + # H0、H1标注改为相对分布均值的位置,参数修改后不会错位 geom_text(x=mu0-1.7, y=dnorm(mu0, mu0, sig0)+0.03, label="H0", size=10, col="black") + geom_text(x=mu1+1.6, y=dnorm(mu1, mu1, sig1)+0.03, label="H1", size=10, col="black") + # 手动匹配填充色和图例公式标签 scale_fill_manual( name = "参数含义", values = c( "alpha" = "red", "1-alpha" = "deepskyblue3", "beta" = "chocolate3", "1-beta" = "cyan4" ), labels = ~parse(text = .x) ) + labs(y="Densité") + # 适配教学场景的图例样式调整,可按需修改 theme( legend.position = "top", legend.text = element_text(size = 12), legend.title = element_text(size = 14) ) } PwrPlot()
修改后的代码运行后不会再触发之前的警告,图例可自动展示各颜色对应的参数含义,调整mu0、mu1、alpha等曲线参数时,图例和标注都不会出现错位问题,完全适配教学演示场景。
内容的提问来源于stack exchange,提问作者Daniel Coulombe
相关产品推荐
相关产品推荐

