You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按时间顺序而非数值顺序排列图例条目?

如何按时间顺序而非数值顺序排列图例条目?

嘿,我完全懂你的需求——现在你的图例是按斜率的数值大小排序的,但你希望它能跟着图表里数据出现的**日历顺序(从左到右)**来排列,对吧?这其实只要调整一下图例对应变量的因子水平顺序就能搞定,我来帮你修改代码:

首先,问题出在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 11:54:35