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

R语言时间序列图表求助:年月列合并及双轴图制作问题

解决两个R数据处理问题:日期合并NA与双轴时间序列图

一、月份+年份合并为日期时全为NA的解决办法

这种情况大概率是月份的格式不匹配解析规则,或者数据类型不对(比如年份带奇怪符号、月份拼写错误)。我给你几个靠谱的方案,按需选择:

情况1:月份是数字(1-12),年份是整数/字符

用lubridate包的make_date()函数最省心,直接指定年、月,日默认设为1即可:

library(lubridate)
df$Date <- make_date(year = df$Year, month = df$Month, day = 1)

如果没装lubridate,用基础R也能搞定:先把年月拼成标准格式再转日期

df$Date <- as.Date(paste(df$Year, df$Month, "01", sep = "-"))

情况2:月份是文本(比如"January"或"Jan")

还是lubridate最省心,它能自动识别各种月份文本:

# 直接解析年月,默认日为1
df$Date <- my(paste(df$Month, df$Year))
# 或者用完整拼接写法
df$Date <- dmy(paste("01", df$Month, df$Year))

用基础R的话,需要指定format参数匹配月份格式:

# 月份是全称(如"January")用%B,缩写(如"Jan")用%b
df$Date <- as.Date(paste("01", df$Month, df$Year), format = "%d %B %Y")
# 缩写版:
df$Date <- as.Date(paste("01", df$Month, df$Year), format = "%d %b %Y")

排坑提示:

  • 先检查df$Month和df$Year有没有缺失值(sum(is.na(df$Month))),缺失值会直接导致NA
  • 如果月份是字符但有拼写错误(比如"Januay"),也会解析失败,得先清洗数据

二、制作Score柱状图+n折线图的双轴时间序列图

用ggplot2就能实现,核心是用sec.axis设置右侧y轴,同时分别映射两个变量的几何对象:

给你完整代码示例(假设日期列已处理为Date):

library(ggplot2)

ggplot(df, aes(x = Date)) +
  # 绘制Score的柱状图
  geom_col(aes(y = Score), fill = "#2E8B57", alpha = 0.7) +
  # 绘制n的折线图(如果n和Score数值差距大,需要先缩放)
  geom_line(aes(y = n / max(n) * max(df$Score)), color = "#FF6347", size = 1.2) +
  geom_point(aes(y = n / max(n) * max(df$Score)), color = "#FF6347", size = 2) +
  # 设置右侧y轴,对应n的原始值
  scale_y_continuous(
    name = "Score",
    sec.axis = sec_axis(~ . * max(df$Score) / max(df$n), name = "n")
  ) +
  labs(title = "Score vs n Over Time", x = "Date") +
  theme_minimal() +
  theme(
    axis.title.y = element_text(color = "#2E8B57"),
    axis.title.y.right = element_text(color = "#FF6347")
  )

关键说明:

  • 如果Score和n的数值范围差距大,必须把n缩放成和Score同范围的数值,才能在同一图里展示;如果范围接近,可以直接把折线的y设为n,然后sec.axis = sec_axis(~ ., name = "n")
  • 右侧轴的公式是反向缩放,把缩放后的数值转回n的原始范围,确保显示的是真实数值

内容的提问来源于stack exchange,提问作者Neel Rajani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:56:35