如何在ggplot时间序列图的X轴添加年份刻度?
问题原因
你之前的代码无法显示刻度,是因为字符型的DATE列是完整日期字符串(如"2000-01-01"),而你设置的breaks是纯数字年份(2000、2002等),两者完全不匹配,ggplot找不到对应的刻度位置,所以没有显示。
推荐解决方案:保留Date类型绘图(更专业)
不要将DATE转为字符型,直接用原始的Date类型,结合scale_x_date可以轻松设置年份刻度,同时保证时间轴的顺序正确:
library(data.table) library(ggplot2) library(reshape2) # 加载你的数据集 JAN <- structure(list(DATE = structure(c(11323, 11324, 11325, 11326, 11327, 11328, 11329, 11330, 11331, 11332, 11333, 11334, 11335, 11336, 11338, 11339, 11340, 11341, 11342, 11343, 11344, 11345, 11346, 11347, 11348, 11349, 11350, 11351, 11352, 11353, 11688, 11689, 11690, 11691, 11692, 11693, 11694, 11695, 11696, 11697, 11698, 11699, 11700, 11701, 11702, 11703, 11704, 11705, 11708, 11709), class = "Date"), GPM = c(1.5533290478978, 1.24701969168696, 0.116777682160594, 0.159065252296044, 0.187685331871536, 0.0151661402972882, 0.020278018811458, 0.0176270775569004, 0.0279074208473218, 0.0160315229342072, 0.0108845983433037, 0.0138721601327613, 0.0558540236901291, 0.00906727189688938, 0.0435902702469772, 0.0290332179873774, 0.00270738380328481, 0.0252890188192932, 0.0229272436557711, 0.0742112864619369, 0.63188089138853, 0.705841393296297, 0.516529939079614, 0.127323157396423, 0.0256321479421556, 0.0323624494729457, 0.0079694189713618, 0.00376088241239789, 0.0759068888752428, 0.138958983189343, 0.256206161642061, 0.174721437175792, 0.230700483398665, 0.587970629156566, 0.571620125923083, 0.975451244161874, 0.504429551956953, 0.884041147230531, 1.07488345201856, 0.180957611493698, 0.184881578653673, 0.374001801717993, 0.362102791148718, 0.29195778339993, 1.21737627575252, 0.338507284113606, 0.204682161851911, 0.353243602038057, 0.396781343074674, 0.722564701254419), TRI = c(1.52880963245181, 1.24787407735869, 0.115483602578865, 0.158250147345684, 0.187869975056161, 0.0154199965329919, 0.0206080794846154, 0.0179152393633214, 0.0309840515964189, 0.0164314402116303, 0.011020640632948, 0.014009522684361, 0.0560264671948149, 0.00940288960364489, 0.0440144074914532, 0.0291591207382827, 0.00281879608335482, 0.0258687357348923, 0.0231179141155455, 0.0751970951048421, 0.631786069656838, 0.705468587038617, 0.515739122757699, 0.127503088254437, 0.0261141304425291, 0.0328461160496562, 0.00801627954384064, 0.00414500906545901, 0.0764304795934617, 0.139526285880082, 0.0242871474756638, 0.0161267777172445, 0.0216795259687058, 0.0321224383153412, 0.190460597956337, 0.609730049059475, 1.03156475602083, 0.766647567271779, 0.538144953702912, 0.225904910424159, 0.0405455376019322, 0.00974115012354696, 0.770352515303129, 1.14427766245886, 1.46214410653354, 2.17646345430129, 0.718572896408112, 0.695926119172368, 0.464953672883994, 0.470512680102031), RCM = c(1.5533290478978, 1.24701969168696, 0.116777682160594, 0.159065252296044, 0.187685331871536, 0.0151661402972882, 0.020278018811458, 0.0176270775569004, 0.0279074208473218, 0.0160315229342072, 0.0108845983433037, 0.0138721601327613, 0.0558540236901291, 0.00906727189688938, 0.0435902702469772, 0.0290332179873774, 0.00270738380328481, 0.0252890188192932, 0.0229272436557711, 0.0742112864619369, 0.63188089138853, 0.705841393296297, 0.516529939079614, 0.127323157396423, 0.0256321479421556, 0.0323624494729457, 0.0079694189713618, 0.00376088241239789, 0.0759068888752428, 0.138958983189343, 0.0241264927288777, 0.0159794557614494, 0.0214845385735646, 0.0316829567566502, 0.189597625286888, 0.606003645196629, 1.04986528082511, 0.75786332559594, 0.535528758717859, 0.224178668128073, 0.040353171152155, 0.00945945458725323, 0.769543790868592, 1.14336633775158, 1.46421238660698, 2.18955063527956, 0.719810266439457, 0.694317224140577, 0.46319356040037, 0.470016988791303)), class = c("data.table", "data.frame"), row.names = c(NA, -50L), .internal.selfref = <pointer: 0x000001bacb52fc40>) # 融合数据,保留DATE的Date类型 dfmelt <- melt(JAN, id.vars = "DATE") # 绘图并设置年份刻度 ggplot(dfmelt, aes(x = DATE, y = value, col = variable, group = variable)) + labs(title = 'JANUARY') + geom_line() + scale_x_date( # 设置每两年显示一个刻度,对应每年1月1日 breaks = seq.Date(from = as.Date("2000-01-01"), to = as.Date("2021-01-01"), by = "2 years"), # 刻度标签只显示年份 labels = function(x) format(x, "%Y") )
备选方案:坚持使用字符型DATE(不推荐)
如果一定要保留字符型DATE,需要将breaks设置为对应年份的具体日期字符串,再将标签转为年份:
dfmelt <- melt(JAN, id.vars = "DATE") dfmelt$DATE <- as.character(dfmelt$DATE) # 生成对应年份的1月1日字符串作为breaks year_breaks <- as.character(seq.Date(from = as.Date("2000-01-01"), to = as.Date("2021-01-01"), by = "2 years")) ggplot(dfmelt, aes(x = DATE, y = value, col = variable, group = variable)) + labs(title = 'JANUARY') + geom_line() + scale_x_discrete( breaks = year_breaks, labels = format(as.Date(year_breaks), "%Y") )
内容的提问来源于stack exchange,提问作者hat6ytrs
相关产品推荐
相关产品推荐

