如何在ggplot的scale_x_discrete中指定刻度显示频率?
问题描述
数据集
structure(list(Nacional = c("Nacional", "Nacional", "Nacional", "Nacional", "Nacional", "Nacional", "Nacional", "Nacional", "Nacional", "Nacional"), CCAA = c("09 Cataluña", "09 Cataluña", "09 Cataluña", "09 Cataluña", "09 Cataluña", "09 Cataluña", "09 Cataluña", "09 Cataluña", "09 Cataluña", "09 Cataluña"), Habitatge = c("General", "General", "General", "General", "General", "General", "General", "General", "General", "General"), Unitat = c("Variació anual", "Variació anual", "Variació anual", "Variació anual", "Variació anual", "Variació anual", "Variació anual", "Variació anual", "Variació anual", "Variació anual"), Data = c("2022T4", "2022T3", "2022T2", "2022T1", "2021T4", "2021T3", "2021T2", "2021T1", "2020T4", "2020T3"), Total = c(5.5, 8.1, 7.2, 7.7, 6.1, 3.3, 3.2, 1.2, 1, 1.7)), row.names = 7041:7050, class = "data.frame")
绘图代码
ggplot(subset(var_ine_habitatge, Data>"2008T1"))+ geom_line (aes(x=Data, y=Total, color= Habitatge, group=Habitatge), linewidth=0.7) + scale_y_continuous(expand=c(0,0), limits=as.numeric(c(-20,14)), breaks=seq(from=-20, to=14, by=2)) + scale_x_discrete(expand=c(0,0), seq(by=5))
需求
不想让x轴显示所有Data标签,希望每4个值显示一个标签,尝试用breaks参数但无效,该怎么解决?
解决方案
问题出在你把seq(by=5)直接放在scale_x_discrete里,这不是正确的用法。下面提供两种可行的解决方法:
方法1:手动筛选x轴标签
先提取筛选后的Data向量,再按每4个取一个的规则生成breaks,传给scale_x_discrete的breaks参数即可:
# 获取筛选后的日期向量 filtered_dates <- subset(var_ine_habitatge, Data>"2008T1")$Data # 生成每4个取一个的标签列表 date_breaks <- filtered_dates[seq(1, length(filtered_dates), by=4)] ggplot(subset(var_ine_habitatge, Data>"2008T1"))+ geom_line(aes(x=Data, y=Total, color=Habitatge, group=Habitatge), linewidth=0.7) + scale_y_continuous(expand=c(0,0), limits=c(-20,14), breaks=seq(from=-20, to=14, by=2)) + scale_x_discrete(expand=c(0,0), breaks=date_breaks)
方法2:转换为日期格式(更推荐)
你的Data是季度格式(比如2022T4代表2022年第四季度),转换成日期类型后,可以用scale_x_date的参数更灵活控制标签:
library(lubridate) # 将Data转换为日期格式,把T替换为Q后解析 var_ine_habitatge$Date <- parse_date_time(var_ine_habitatge$Data, "Yq") ggplot(subset(var_ine_habitatge, Date > ymd("2008-03-31")))+ geom_line(aes(x=Date, y=Total, color=Habitatge, group=Habitatge), linewidth=0.7) + scale_y_continuous(expand=c(0,0), limits=c(-20,14), breaks=seq(from=-20, to=14, by=2)) + scale_x_date(expand=c(0,0), date_breaks = "1 year", date_labels = "%YT%q")
这里date_breaks = "1 year"刚好对应4个季度(每4个点显示一个标签),date_labels把日期还原成你原来的YT%q格式。这种方法更健壮,即使时间序列不连续也能准确按间隔显示标签。
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

