如何在R的ggplot中为两个列向量绘制双Y轴图表?
解决ggplot2次坐标轴绘制问题
你的报错原因是sec_axis()的第一个参数需要转换函数,而非直接传入数据列v2。ggplot2的次坐标轴本质是基于主坐标轴的数值转换,需要先把v2的数值缩放到v1的取值范围,再通过反转换让次坐标轴显示v2的原始刻度。
正确实现步骤
- 计算主坐标轴(v1)和次坐标轴(v2)的缩放比例与偏移量,用于数值转换
- 将
v2转换为适配v1范围的数值后绘制线条 - 在
sec_axis()中定义反转换函数,还原v2的原始刻度
完整代码
library(tidyverse) # 生成目标数据框 date = seq(as.Date("2022/1/1"), as.Date("2022/1/12"), by = "day") v1 = rnorm(12,0,1) v2 = rnorm(12,10,1) df = data.frame(date,v1,v2) # 计算缩放比例与偏移量 v1_min <- min(df$v1) v1_max <- max(df$v1) v2_min <- min(df$v2) v2_max <- max(df$v2) scale_ratio <- (v1_max - v1_min) / (v2_max - v2_min) offset_val <- v1_min - v2_min * scale_ratio # 绘制双坐标轴折线图 ggplot(df, aes(x = date)) + # 绘制v1主坐标轴线条 geom_line(aes(y = v1), size = 1, color = "#2E86AB") + # 绘制转换后的v2线条(适配主坐标轴范围) geom_line(aes(y = v2 * scale_ratio + offset_val), size = 1, color = "#D83A56") + # 设置x轴日刻度 scale_x_date(date_labels = "%d", date_breaks = "1 day") + # 设置双y轴 scale_y_continuous( name = "v1", sec.axis = sec_axis( trans = ~ (. - offset_val)/scale_ratio, # 反转换还原v2原始值 name = "v2" ) ) + theme_minimal()
关键说明
scale_ratio:v1与v2取值范围的比例,用于将v2数值缩放到v1的区间内offset_val:偏移量,保证转换后的v2数值与v1的起始点对齐sec_axis()的trans参数:反转换函数,将主坐标轴的数值转换回v2原始值,让次坐标轴显示正确刻度
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

