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

在R中绘制自定义X轴的多类别唯一颜色折线图

R绘制跨天类别折线图的简易方案

针对你的需求,这里给一套适合新手的ggplot2解决方案,解决X轴跨天、列筛选、图例与坐标轴名称修改的问题:

1. 先装包+读数据预处理

新手先运行安装命令(只需要装一次):

install.packages(c("tidyverse", "lubridate"))

然后加载包、读数据、筛选符合要求的列,再转成ggplot2能用的长格式:

library(tidyverse)
library(lubridate)

# 替换成你的CSV文件路径
df <- read.csv("your_data.csv", stringsAsFactors = FALSE)

# 筛选列:保留Time列,以及所有类别列(非Time列)中所有值>=0的列
# 如果是要保留【列名(类别名称)>=0】的列,把下面的sapply部分换成 as.numeric(colnames(df)[-1]) >= 0
keep_cols <- c(TRUE, sapply(df[,-1], function(col) all(col >= 0)))
df_filtered <- df[, keep_cols]

# 把宽数据转成长格式(多类别折线图必须的操作)
df_long <- df_filtered %>%
  pivot_longer(-Time, names_to = "类别", values_to = "频次")

# 处理跨天时间:把Time转成连续数值,0-9点的时间加24,让X轴顺序正确
# 假设你的Time列格式是"HH:MM",比如"17:00"
df_long$Time_num <- hour(hms(df_long$Time)) + minute(hms(df_long$Time))/60
df_long$Time_num <- ifelse(df_long$Time_num < 17, df_long$Time_num + 24, df_long$Time_num)

2. 绘制折线图

用ggplot2生成带自定义坐标轴和图例的折线图:

ggplot(df_long, aes(x = Time_num, y = 频次, color = 类别)) +
  geom_line(linewidth = 1) + # 可选:调整线条粗细
  # 设置X轴:从17:00到次日9:00的刻度和标签
  scale_x_continuous(
    breaks = c(17:23, 24:33),
    labels = c("17:00", "18:00", "19:00", "20:00", "21:00", "22:00", "23:00",
               "00:00", "01:00", "02:00", "03:00", "04:00", "05:00", "06:00",
               "07:00", "08:00", "09:00"),
    limits = c(17, 33)
  ) +
  # 修改坐标轴和图例名称
  labs(
    x = "时间",
    y = "频次",
    color = "类别" # 图例标题
  ) +
  # 可选:让图表更清爽,X轴标签旋转避免重叠
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

关键问题解决说明

  • X轴跨天错误:通过把0-9点的时间数值加24,让X轴变成连续的17到33,再自定义刻度标签显示实际时间,彻底解决跨天顺序混乱的问题。
  • 列筛选:代码里的sapply逻辑会检查每个类别列的所有值是否都>=0,如果你是要保留类别名称(列名)为非负数的列,直接替换成as.numeric(colnames(df)[-1]) >= 0即可。
  • 图例与坐标轴名称:labs()函数直接修改,简单易懂,不用找复杂的参数。
  • 重复折线问题:转成长格式后,ggplot2会自动按类别分组绘制,不会出现matplot里重复绘制的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:45:37