ggplot2绘制xts格式数据时X轴标签未从1月起始的问题
解决ggplot2绘制xts数据时X轴标签从2月起始的问题
我有一份xts格式的美国CPI数据集,使用ggplot2可视化时其他功能均正常,但X轴标签默认从2月开始,需要调整为从1月起始。
数据集定义
USCPI_YEARLY = as.xts(c(1.399770, 1.676215, 2.619763, 4.159695, 4.992707, 5.391451, 5.365475, 5.251272, 5.390349, 6.221869, 6.809003, 7.036403, 7.479872, 7.871064, 8.542456, 8.258629, 8.581512, 9.059758, 8.524815, 8.262693, 8.201670, 7.745427, 7.110323, 6.454401, 6.410147, 6.035613, 4.984974, 4.930320, 4.047609, 2.969178, 3.177780, 3.665112, 3.699698, 3.241145, 3.137271, 3.352123), as.Date(c("2021-01-01", "2021-02-01", "2021-03-01", "2021-04-01", "2021-05-01","2021-06-01", "2021-07-01", "2021-08-01", "2021-09-01", "2021-10-01","2021-11-01", "2021-12-01", "2022-01-01", "2022-02-01", "2022-03-01","2022-04-01", "2022-05-01", "2022-06-01", "2022-07-01", "2022-08-01","2022-09-01", "2022-10-01", "2022-11-01", "2022-12-01", "2023-01-01","2023-02-01", "2023-03-01", "2023-04-01", "2023-05-01", "2023-06-01","2023-07-01", "2023-08-01", "2023-09-01", "2023-10-01", "2023-11-01", "2023-12-01"))) names(USCPI_YEARLY) = "USCPI"
原绘图代码(X轴标签从2月起始)
library(ggplot2) library(scales) ggplot(data = window(USCPI_YEARLY, start = "2021-01-01"), aes(x = Index, y = USCPI)) + geom_point() + geom_line() + ggtitle("US CPI", subtitle = "US Inflation peaked in Jun'22 and continues to decline") + ylab("CPI (in %)") + xlab("") + scale_x_date( breaks = date_breaks("3 months"), labels = scales::label_date_short() )
解决方案
问题源于date_breaks("3 months")的自动计算逻辑,它会基于数据起始日期自动生成间隔,但刚好偏移到了2月。可以通过两种方式强制从1月开始:
方法1:手动生成断点序列
直接用seq()指定起始日期和间隔,确保X轴标签从1月开始:
library(ggplot2) library(scales) ggplot(data = window(USCPI_YEARLY, start = "2021-01-01"), aes(x = Index, y = USCPI)) + geom_point() + geom_line() + ggtitle("美国CPI", subtitle = "美国通胀在2022年6月见顶后持续回落") + ylab("CPI(%)") + xlab("") + scale_x_date( breaks = seq(as.Date("2021-01-01"), as.Date("2023-12-01"), by = "3 months"), labels = scales::label_date_short() )
方法2:使用start_on_month参数(需scales包≥1.2.0)
如果你的scales包版本足够新,可以直接通过参数指定从1月开始生成间隔:
scale_x_date( breaks = date_breaks("3 months", start_on_month = 1), labels = scales::label_date_short() )
内容的提问来源于stack exchange,提问作者M.Dogan
相关产品推荐
相关产品推荐

