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

如何在R语言中将不同数据框的箱线图与折线图叠加并添加次坐标轴?

R语言:箱线图+折线图(带次坐标轴)合并方案

问题描述

需要将来自不同数据框的箱线图与折线图合并到一张图中,并添加次坐标轴。现有单独绘制的代码如下:

par(mfrow = c(1,2))  

dat <- data.frame(years = rep(2011:2020, each = 9), x = sample(200:325, 10*9 ,replace = T))  
boxplot(dat$x ~ dat$year, ylim = c(200, 350)) 

#reference data  
ref.dat <- data.frame(years = rep(2011:2020), x = sample(0:40, 10, replace = T))  
plot(ref.dat$years, ref.dat$x, type = "b")

ylim.prim <- c(200, 325)      
ylim.sec <- c(0, 40)      

b <- diff(ylim.prim)/diff(ylim.sec)    
a <- ylim.prim[1] - b*ylim.sec[1]     

ggplot(dat, aes(x = years, y = x)) +
  geom_boxplot(data = dat,  aes(group = years)) +
  geom_line(data = ref.dat, aes(x = years, y = X), color = "red") +
              scale_y_continuous("Sample", sec.axis = sec_axis(~ (. - a)/b, name = "reference")) 

修正后的解决方案

你的代码存在两个核心问题:折线图的变量名错误,且未将折线数据转换到主坐标轴范围。以下是修正后的完整代码:

# 1. 创建模拟数据(设置种子保证结果可重复)
set.seed(123)
dat <- data.frame(years = rep(2011:2020, each = 9), x = sample(200:325, 10*9 ,replace = T))  
ref.dat <- data.frame(years = 2011:2020, x = sample(0:40, 10, replace = T))  

# 2. 计算主、次坐标轴的转换系数
ylim.prim <- c(200, 325)      
ylim.sec <- c(0, 40)      
b <- diff(ylim.prim)/diff(ylim.sec)    
a <- ylim.prim[1] - b*ylim.sec[1]     

# 3. 合并绘图(带次坐标轴)
library(ggplot2)
ggplot() +
  # 绘制箱线图(主坐标轴数据)
  geom_boxplot(data = dat, aes(x = factor(years), y = x), fill = "#6699CC") +
  # 绘制折线图(将次轴数据转换为主轴范围)
  geom_line(data = ref.dat, aes(x = factor(years), y = a + b * x), color = "#E63946", size = 1) +
  geom_point(data = ref.dat, aes(x = factor(years), y = a + b * x), color = "#E63946", size = 2) +
  # 配置坐标轴
  scale_y_continuous(
    name = "Sample Value", # 主y轴标签
    limits = ylim.prim,
    sec.axis = sec_axis(~ (. - a)/b, name = "Reference Value") # 次y轴,反向转换
  ) +
  scale_x_discrete(name = "Year") +
  theme_minimal() +
  theme(
    axis.title.y.right = element_text(color = "#E63946"),
    axis.text.y.right = element_text(color = "#E63946")
  )

关键说明

  • 坐标轴转换逻辑:ggplot的次坐标轴仅做视觉映射,实际折线数据必须先通过a + b * x转换到主坐标轴的数值范围,否则折线会被压缩到箱线图底部无法正常显示。
  • 变量与分组:将years转为因子(factor(years)),避免连续型x轴导致箱线图绘制异常;同时修正了原代码中折线图的y = X错误(应为y = x并做转换)。
  • 视觉优化:给折线和次轴设置统一颜色,提升图表可读性;使用theme_minimal简化主题。

内容的提问来源于stack exchange,提问作者Payel Ghosh Dastidar IRRI IN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 09:13:26