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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:45:09