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
相关产品推荐
相关产品推荐

