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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:12:30