R语言ggplot2绘制箱线图结果与预期不符如何解决
问题诊断
你的代码出图和目标差异大,是多个错误叠加导致的:
- 缺失核心前置变量:开头
p <- (d+1)/2里的d没有赋值,这个值是场景里真实的两党支持率差值,对应这个经典统计案例的固定取值为0.02,不定义的话要么代码报错,要么会沿用之前环境里的脏值导致结果偏差。 - 几何对象完全选错:目标图根本不是箱线图,是每个民调对应一个估计点+一条置信区间横线的误差棒图。
geom_boxplot()是用来展示一组数据五数概括分布的,你当前每个民调只有1行汇总结果,硬套箱线图只会输出异常的扁平块。 - AES映射写法不规范:ggplot的映射规则里直接写列名即可,不要加
polls$这类带数据集索引的写法,很容易导致后续图层继承映射错乱。 - y轴变量类型错误:民调编号
poll是分类标识,直接传入数值型变量会被ggplot识别为连续轴,不会给1-12每个民调单独分配纵轴位置,需要转成因子类型。 - 缺少核心图层:目标图里的真实值垂直参考虚线、置信区间横段、估计值点三个核心元素都没有对应图层,自然出不来目标效果。
修正后可直接运行的代码
library(tidyverse) # 补全缺失的真实差值定义 d <- 0.02 Ns <- c(1298, 533, 1342, 897, 774, 254, 812, 324, 1291, 1056, 2172, 516) p <- (d+1)/2 set.seed(123) # 固定随机种子,保证每次运行抽样结果一致 polls <- map_df(Ns, function(N) { x <- sample(c(0,1), size=N, replace=TRUE, prob=c(1-p, p)) x_hat <- mean(x) se_hat <- sqrt(x_hat * (1 - x_hat) / N) list(estimate = 2 * x_hat - 1, low = 2*(x_hat - 1.96*se_hat) - 1, high = 2*(x_hat + 1.96*se_hat) - 1, sample_size = N) }) %>% mutate(poll = seq_along(Ns)) ggplot(polls, aes(x = estimate, y = factor(poll))) + # 绘制真实值的垂直参考虚线 geom_vline(xintercept = d, linetype = "dashed") + # 绘制每个民调的95%置信区间横段 geom_errorbarh(aes(xmin = low, xmax = high), height = 0.2) + # 绘制每个民调的估计值点 geom_point(size = 2) + # 匹配目标图的坐标轴范围 xlim(-0.2, 0.2) + labs(x = "支持率差值估计", y = "民调序号")
运行代码后即可得到符合要求的目标效果:
内容的提问来源于stack exchange,提问作者Madhav Ddas
相关产品推荐
相关产品推荐

