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

R ggplot2按cod分组规则截断数据的折线图绘制问题

实现方案

你可以通过对cod分组排序后按规则过滤数据实现,完整可运行代码如下:

library(ggplot2)
library(dplyr)
library(data.table)

dt <- data.table(cod= c(202101,202101,202101,202101,202102,202102,202102,202102,202103,202103,202103,202103,202104,202104,202104,202104),
                 val= c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4),
                 porc= c(0.01,0.03,0.06,0.07,0,0.04,0.07,0.07,0.02,0.04,0.04,0.04,0.02,0.02,0.02,0.02)
)

# 步骤1:生成每个cod对应的截断行数映射
cod_levels <- sort(unique(dt$cod), decreasing = T)
cut_map <- setNames(0:(length(cod_levels)-1), as.character(cod_levels))

# 步骤2:按规则过滤数据
dt_filtered <- dt %>%
  group_by(cod) %>%
  arrange(val, .by_group = T) %>% # 每组按val从小到大排序,保证截断的是末尾的行
  slice_head(n = n() - cut_map[as.character(cur_group()$cod)]) %>%
  ungroup() %>%
  mutate(cod = as.character(cod))

# 步骤3:绘图
ggplot(dt_filtered, aes(x=val, y=porc)) +
  geom_line(aes(color=cod)) +
  geom_point(aes(color=cod))

逻辑说明

  • 首先对cod按从大到小排序,生成截断行数映射:最大的cod对应截断0行,次大对应截断1行,以此类推
  • 每个分组内按val排序后,用slice_head保留前N行,自动跳过末尾需要截断的行数
  • 过滤后的数据直接绘图即可符合要求:202104保留全部4条数据,202103保留前3条,202102保留前2条,202101保留前1条

内容的提问来源于stack exchange,提问作者MoisesT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:06:05