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

如何用R的ggplot按类别为时序数据设置不同色阶绘图?

R语言实现按类别分色系的时间序列同图绘制

核心思路

无需拆分数据框,通过为每个类别创建专属的颜色渐变系列,再将每个序列(series)映射到对应类别的渐变颜色上,即可实现同类别序列用同色系、不同深浅区分的需求。

具体实现代码

1. 数据预处理(确保时间格式正确)

先将ts列转换为标准日期时间类型,避免绘图时出现格式问题:

library(tidyverse)
library(lubridate)

# 模拟你的数据结构(替换为实际数据即可)
df <- tibble(
  series = c(1,3,5,1,3,5,2,4,6,2,4,6),
  ts = ymd_hms(c(rep("2023-04-01 11:00:00",6), rep("2023-04-01 12:00:00",6))),
  value = c(3,53,4,6,58,7,12,45,9,15,48,11),
  class = c(rep("A",2), rep("C",2), rep("B",2), rep("A",2), rep("C",2), rep("B",2))
)

# 确保时间列是日期时间格式(如果原始数据不是的话)
df <- df %>% mutate(ts = ymd_hms(ts))

2. 为每个类别生成渐变颜色

先统计每个类别下的序列数量,再用colorRampPalette生成对应数量的渐变色彩:

# 按类别分组,提取每个类别下的序列列表
class_series <- df %>% 
  distinct(class, series) %>% 
  group_split(class)

# 定义每个类别的基础色系(可根据需求调整)
base_colors <- list(
  A = c("#e8f5e9", "#2e7d32"),  # 绿色系:浅绿→深绿
  B = c("#fff3e0", "#ef6c00"),  # 橙色系:浅橙→深橙
  C = c("#e3f2fd", "#1565c0")   # 蓝色系:浅蓝→深蓝
)

# 生成每个序列对应的颜色映射表
color_mapping <- map_dfr(class_series, function(group) {
  class_name <- group$class[1]
  series_list <- group$series
  # 生成对应数量的渐变颜色
  color_palette <- colorRampPalette(base_colors[[class_name]])(length(series_list))
  tibble(series = series_list, color = color_palette)
})

# 将颜色映射合并到原数据框
df <- df %>% left_join(color_mapping, by = "series")

3. 绘制时间序列图

用ggplot2绘制,将序列映射到自定义颜色,实现同色系深浅区分:

ggplot(df, aes(x = ts, y = value, color = factor(series), group = series)) +
  geom_line(linewidth = 1) +
  # 应用自定义颜色映射
  scale_color_manual(values = setNames(color_mapping$color, color_mapping$series)) +
  # 设置图表标签
  labs(x = "时间", y = "数值", color = "序列编号") +
  theme_minimal()

拆分数据框的替代方法

如果偏好拆分数据框的方式,可按类别拆分后逐个添加图层,每个图层使用对应类别的渐变颜色:

# 按类别拆分数据框
df_list <- df %>% group_split(class)

# 初始化绘图对象
p <- ggplot() + theme_minimal() + labs(x = "时间", y = "数值", color = "序列编号")

# 逐个添加每个类别的序列图层
walk2(df_list, names(base_colors), function(data, class_name) {
  series_unique <- unique(data$series)
  palette <- colorRampPalette(base_colors[[class_name]])(length(series_unique))
  p <<- p + geom_line(data = data, aes(x = ts, y = value, color = factor(series), group = series), linewidth = 1) +
    scale_color_manual(values = setNames(palette, series_unique))
})

print(p)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 22:45:07