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
相关产品推荐
相关产品推荐

