R语言ggplot绘图:X轴季度日期未按时间顺序排列求助
问题原因
你把zoo::yearqtr类型的时间序列用format()转成了字符串(比如"Q1-2000"),ggplot会把字符串类型的x轴按字典序排序——也就是先排所有以Q1开头的,再Q2,以此类推,所以才出现了Q1-2000、Q1-2001...的混乱顺序。
两种解决办法
办法1:保留yearqtr类型(推荐)
不要把时间转成字符串,直接用yearqtr类型做x轴,再通过scale_x_yearqtr自定义刻度标签格式:
Color <- "#FF6347" priceColor <- rgb(0.2, 0.6, 0.9, 1) coeff <- 0.035 # 保留yearqtr类型,不转字符串 data$time <- seq(from = zoo::as.yearqtr("2000-01-01"), to = zoo::as.yearqtr("2019-01-01"), by = 1/4) ggplot(data, aes(x=time, group =1)) + geom_bar( aes(y=YseriesA), stat="identity", size=.1, fill=Color, color="black", alpha=.4) + geom_line( aes(y=YseriesB / coeff), size=1.2, color=priceColor) + scale_y_continuous( name = "B", sec.axis = sec_axis(~.*coeff, name="A") ) + # 用zoo的scale函数设置x轴标签格式 scale_x_yearqtr(format = "Q%q-%Y", n = length(data$time)) + theme_ipsum() + theme( axis.title.y = element_text(color = Color, size=13), axis.title.y.right = element_text(color = priceColor, size=13), axis.text.x = element_text(angle = 90) ) + ggtitle("Title")
办法2:转成有序因子(如果一定要用字符串)
生成字符串后,把它转成有序因子,指定levels为原时间顺序,ggplot就会按这个顺序排列x轴:
Color <- "#FF6347" priceColor <- rgb(0.2, 0.6, 0.9, 1) coeff <- 0.035 # 生成字符串后转成有序因子 data$time <- seq(from = zoo::as.yearqtr("2000-01-01"), to = zoo::as.yearqtr("2019-01-01"), by = 1/4) %>% format("Q%q-%Y") %>% factor(levels = ., ordered = TRUE) # 后续绘图代码和你原来的一致即可 ggplot(data, aes(x=time, group =1)) + geom_bar( aes(y=YseriesA), stat="identity", size=.1, fill=Color, color="black", alpha=.4) + geom_line( aes(y=YseriesB / coeff), size=1.2, color=priceColor) + scale_y_continuous( name = "B", sec.axis = sec_axis(~.*coeff, name="A") ) + theme_ipsum() + theme( axis.title.y = element_text(color = Color, size=13), axis.title.y.right = element_text(color = priceColor, size=13) ) + theme(axis.text.x = element_text(angle = 90)) + ggtitle("Title")
内容的提问来源于stack exchange,提问作者Economist_Ayahuasca
相关产品推荐
相关产品推荐

