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

