如何按时间顺序而非数值顺序排列图例条目?
如何按时间顺序而非数值顺序排列图例条目?
嘿,我完全懂你的需求——现在你的图例是按斜率的数值大小排序的,但你希望它能跟着图表里数据出现的**日历顺序(从左到右)**来排列,对吧?这其实只要调整一下图例对应变量的因子水平顺序就能搞定,我来帮你修改代码:
首先,问题出在rateperday这个因子上,它默认是按数值大小来排列水平的,但我们需要让它的水平顺序对应每个数据分组出现的时间先后。我们可以先给每个分组标记出最早的出现日期,再按这个日期来重新定义rateperday的因子水平顺序。
修改后的完整代码如下:
library(data.table) library(lme4) library(tidyverse) library(ggplot2) mydata <- read.table(header = TRUE, text = " data_date data_value 2023-04-20 17 2023-04-24 15 2023-04-30 12 2023-05-03 10 2023-05-08 7 2023-05-13 2 2023-05-14 16 2023-05-17 15 2023-05-24 13 ") # 分组处理数据 mydatatable <- data.table(mydata) %>% mutate( mnth = format(as.Date(data_date), format="%b"), jumpup = as.character( cumsum( ifelse( c(-1, diff(mydata$data_value) ) > 0 , 1, 0 ) ) ) , month_jumpup = as.factor( paste(mnth, jumpup ) ) , data_date = as.POSIXct(data_date, format="%Y-%m-%d", tz="UTC") ) %>% select(data_date, data_value, month_jumpup) # 提取每组的斜率 fm1 <- lmList(data_value ~ data_date | month_jumpup , mydatatable) ratetib <- tibble(month_jumpup = names(fm1), rateperday = as.factor( round( -24*3600*summary(fm1)$coef[,1,2], 3 ) ) ) plottib <- tibble(mydatatable) %>% left_join(ratetib, by = c("month_jumpup" = "month_jumpup")) # ------------------- 新增的关键步骤:按时间顺序调整因子水平 ------------------- # 1. 为每个分组获取最早的日期,确定时间先后 group_time_order <- plottib %>% group_by(month_jumpup) %>% summarize(first_appear = min(data_date)) %>% arrange(first_appear) # 按日期升序排列分组 # 2. 按时间顺序匹配对应的rateperday值,得到新的因子水平顺序 sorted_rate_levels <- plottib %>% distinct(month_jumpup, rateperday) %>% right_join(group_time_order, by = "month_jumpup") %>% arrange(first_appear) %>% pull(rateperday) # 3. 重新设置rateperday的因子水平,让它跟着时间顺序走 plottib$rateperday <- factor(plottib$rateperday, levels = sorted_rate_levels) # --------------------------------------------------------------------------- # 绘制图表 gm <- ggplot( plottib , aes( x=data_date, y=data_value, color=rateperday )) + geom_point() + geom_smooth( method="lm", se=FALSE) gm
原理说明:
ggplot的图例顺序是由变量的因子水平顺序决定的。我们通过以下步骤调整:
- 先找到每个
month_jumpup分组最早出现的日期,确定分组的时间先后; - 根据这个时间顺序,提取对应的
rateperday值,作为新的因子水平顺序; - 把
rateperday的因子水平重新赋值为这个时间顺序,这样图例就会按数据出现的日历顺序(从左到右)排列了。
这样修改后,你的图例从上到下就会对应图表里从左到右的时间序列啦~
备注:内容来源于stack exchange,提问作者donman
相关产品推荐
相关产品推荐

