R语言:如何过滤工资数据集特定月份或让X轴仅显示年份?
问题与解决方案
问题描述
拥有一份包含10年两性小时工资率的数据集,列包含Males、Females和Date,每行对应每年的12个月份。现有ggplot折线图代码,需实现两个需求:
- 过滤每年的1月、6月、12月数据来绘制折线图;
- X轴仅显示年份,但保留所有筛选后月份的数据点。
修改后的完整代码
# 加载必要包 library(ggplot2) library(ggrepel) library(lubridate) # 读取数据并处理日期 wage_data <- read.csv("Final.csv") wage_data$Date <- as.Date(wage_data$Date, format = "%m/%d/%Y") # 过滤每年1月、6月、12月的数据 filtered_data <- wage_data[month(wage_data$Date) %in% c(1,6,12), ] # 计算过滤后数据的极值 # 女性工资极值 max_female <- filtered_data[which.max(filtered_data$Females), ] min_female <- filtered_data[which.min(filtered_data$Females), ] # 男性工资极值 max_male <- filtered_data[which.max(filtered_data$Males), ] min_male <- filtered_data[which.min(filtered_data$Males), ] # 绘制折线图 ggplot(filtered_data, aes(x = Date)) + # 女性数据点与折线 geom_point(aes(y = Females), size = 2, alpha = 0.3, color = "red") + geom_line(aes(y = Females), size = 0.5, color = "red") + geom_label_repel(data = rbind(max_female, min_female), aes(y = Females, label = round(Females, 2)), size = 4, color = "red", nudge_y = 1) + # 男性数据点与折线 geom_point(aes(y = Males), size = 2, alpha = 0.3, color = "blue") + geom_line(aes(y = Males), size = 0.5, color = "blue") + geom_label_repel(data = rbind(max_male, min_male), aes(y = Males, label = round(Males, 2)), size = 4, color = "blue", nudge_y = 1) + # 图表标签 labs(title = "2013-2023年男女平均小时工资率(仅1/6/12月数据)", x = "年份", y = "平均小时工资率(2024年加元)", color = "性别") + # X轴设置:仅显示年份,每年一个刻度 scale_x_date(breaks = seq.Date(from = min(filtered_data$Date), to = max(filtered_data$Date), by = "year"), labels = function(x) year(x)) + theme_minimal() + theme(axis.text.x = element_text(size = 9))
关键修改说明
- 数据过滤:使用
lubridate包的month()函数提取日期中的月份,筛选出1、6、12月的数据,确保只使用目标月份绘图; - X轴优化:保留
Date的日期类型(避免转成因子导致的刻度混乱),通过scale_x_date()设置刻度为每年年初,标签仅显示年份,同时所有筛选后的月份数据点都会保留在对应位置; - 修正原代码问题:修复了原代码中变量名笔误(如
Dates的错误定义),并将极值标签的数值保留两位小数,提升可读性; - 简化代码结构:移除了不必要的单独变量赋值(如
wages_males等),让代码更简洁。
内容的提问来源于stack exchange,提问作者dying inside
相关产品推荐
相关产品推荐

