ggplot2绘制双Y轴组合图(柱状展示X1、折线展示百分比)报错如何解决
报错原因
- 代码拼写错误:
scale_y_continous正确写法为scale_y_continuous - 次轴转换规则不符合要求:
sec_axis要求传入固定的单调转换公式,原代码直接引用数据集列percent作为转换参数,不是固定规则,触发报错 - 数值范围不匹配:左Y轴对应X1的取值范围是4002200,percent取值范围是3080,直接用percent作为折线y值会导致折线贴在X轴底部,和柱状图完全错位
- 数据源重复:数据集每年对应2行(item A/B),直接绘制折线会出现重复线条
修正后代码
# 先计算固定缩放系数,用于两个Y轴的数值线性映射 coeff <- max(df$X1) / max(df$percent) ggplot(df, aes(x = factor(year))) + # 柱状图部分,对应左Y轴 geom_col(aes(y = X1, fill = item), position = 'dodge2') + # 折线图部分:对年份去重后绘制,y值乘缩放系数适配左轴范围 geom_line(data = ~dplyr::distinct(.x, year, percent), aes(y = percent * coeff, group = 1), color = "#E64B35", linewidth = 1) + # 可选:添加折线对应点,辨识度更高 geom_point(data = ~dplyr::distinct(.x, year, percent), aes(y = percent * coeff), color = "#E64B35", size = 3) + # 配置双Y轴,次轴除以缩放系数还原百分比数值 scale_y_continuous( name = "X1数值", sec.axis = sec_axis(~./coeff, name = "百分比(%)") ) + labs(x = "年份", fill = "分类") + theme_minimal()
逻辑说明
- 提前计算固定的线性缩放系数
coeff,满足次轴对单调转换规则的要求 - 折线的y值先乘以
coeff匹配左Y轴的数值范围,避免和柱状图错位 - 右Y轴通过除以
coeff把左轴数值还原为原始百分比,保证数值显示正确 - 用
distinct处理折线数据源,保证每年只有一个percent数值,避免重复绘制 - 年份转为因子类型,避免ggplot将年份识别为连续数值,出现多余的X轴刻度
内容的提问来源于stack exchange,提问作者HyunJu PARK
相关产品推荐
相关产品推荐

