R语言如何同时绘制折线图与柱状图及代码错误排查
问题原因与修复方案
核心问题梳理
- 数据处理逻辑错误:Users列转数值后错误拼接了管道符,引发语法报错;Revenue列被重复执行*1000操作,数值被错误放大1000倍,完全偏离实际量级
- 未适配双Y轴规则:柱状图对应的用户数(单位:百万,数值范围1172)和折线图对应的收入(单位:百万美元,数值范围6004100)量级差距超过50倍,共用同一Y轴会导致其中一类图形无法正常显示
- ggplot语法使用不规范:geom_bar未指定stat="identity",weight参数使用逻辑错误;离散X轴下geom_line未指定group=1会导致线条无法连接;颜色赋值写在aes映射内导致自定义颜色规则失效
- 2015年的收入数据为NA,会导致折线从2016年才开始绘制,可按需保留或过滤2015年数据
修正后可运行完整代码
# 加载依赖包 library(tidyverse) # 读入数据(你可以替换为自己的读入代码) applemusic_subs_rev <- structure(list(Year = c(2015, 2016, 2017, 2018, 2019, 2020, NA ), Revenue = c(NA, "$0.6 billion", "$1.1 billion", "$1.8 billion", "$2.8 billion", "$4.1 billion", NA), Users = c("11 million", "20 million", "27 million", "40 million", "50 million", "72 million", NA), ...4 = c(NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, -7L), spec = structure(list(cols = list(Year = structure(list(), class = c("collector_double", "collector")), Revenue = structure(list(), class = c("collector_character", "collector")), Users = structure(list(), class = c("collector_character", "collector")), ...4 = structure(list(), class = c("collector_logical", "collector"))), default = structure(list(), class = c("collector_guess", "collector")), delim = ","), class = "col_spec"), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame")) # 数据清洗 applemusic_subs_rev2 <- subset(applemusic_subs_rev, select = c(1:3))[-c(7),] |> mutate( Revenue = gsub("[$,]", "", Revenue), Revenue = gsub("billion", "", Revenue), Users = gsub("million", "", Users), Revenue = as.numeric(Revenue) * 1000, # 单位转为百万美元 Users = as.numeric(Users) # 单位为百万 ) df <- applemusic_subs_rev2 # 绘图(双Y轴适配两个指标量级) ggplot(df, aes(x = factor(Year))) + geom_col(aes(y = Users, fill = "用户数(百万)"), alpha = 0.7) + geom_line(aes(y = Revenue/60, colour = "收入(百万美元)", group = 1), linewidth = 1) + geom_point(aes(y = Revenue/60, colour = "收入(百万美元)"), size = 2) + scale_y_continuous( name = "用户数(百万)", sec.axis = sec_axis(~.*60, name = "收入(百万美元)") ) + scale_fill_manual(values = "grey70", name = "") + scale_colour_manual(values = "black", name = "") + labs(x = "年份") + theme_minimal() + theme(legend.position = "bottom")
内容的提问来源于stack exchange,提问作者AppleBalloons
相关产品推荐
相关产品推荐

