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

R中使用ggplot的geom_line绘制月度时序图出现直线而非平滑线问题咨询

问题原因

  • 未做数据聚合:当前代码没有对同月份、同Pixel的多条观测值做统计汇总,同一x轴刻度下存在多个数值,geom_line直接连接点时就会呈现近似直线的效果。
  • x轴丢失连续时序属性:你使用month(Date, label = TRUE)将日期转换为了离散的月份因子,不同年份的同一月份数据被合并到同一个x轴刻度,丢失了时间序列的连续变化特性,无法生成随时间变化的平滑趋势线。

修正方案

方案1:绘制连续时间序列的平滑折线(保留年份时序)

保留日期的连续属性,先按月份维度对每个Pixel的数值做聚合,再绘图,可按需添加平滑线:

library(dplyr)
library(ggplot2)
library(lubridate)

df <- read.csv("/df.csv")
df$Date <- as.Date(df$T, format = "%m/%d/%Y")
df <- select(df, -T)

# 生成长表+按年月聚合数值
df_processed <- df %>% 
  pivot_longer(-c(GRID_CODE, Date)) %>%
  mutate(
    Pixel = paste0(GRID_CODE, ".", name),
    # 生成年月维度的连续日期
    month_date = floor_date(Date, unit = "month")
  ) %>%
  # 按年月、Pixel分组计算均值,也可替换为median等其他汇总统计量
  group_by(month_date, Pixel) %>%
  summarise(value = mean(value, na.rm = TRUE), .groups = "drop")

# 绘图
ggplot(df_processed, aes(x = month_date, y = value, group = Pixel, color = Pixel)) +
  geom_line() + # 聚合后的折线
  geom_smooth(method = "loess", se = FALSE) + # 可选:添加平滑线,se=FALSE关闭置信区间
  labs(x = "月份")

方案2:按自然月汇总趋势(忽略年份)

如果你需要的是1-12月的平均趋势,对不同年份的同月份数据做汇总后再绘图即可:

df_processed <- df %>% 
  pivot_longer(-c(GRID_CODE, Date)) %>%
  mutate(
    Pixel = paste0(GRID_CODE, ".", name),
    month = month(Date, label = TRUE, abbr = FALSE)
  ) %>%
  # 按自然月、Pixel分组汇总
  group_by(month, Pixel) %>%
  summarise(value = mean(value, na.rm = TRUE), .groups = "drop")

ggplot(df_processed, aes(x = month, y = value, group = Pixel, color = Pixel)) +
  geom_line() +
  labs(x = "月份")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:36:03