如何用ggplot仅绘制各x分组顶部y值点的连线?
问题
现有如下数据集,需基于x、y列进行可视化并关联z列信息,但无需绘制所有z值对应的点,仅保留每个x分组中的首个数据点(即y值最大的顶部点),并将这些点用线连接(类似参考图2:仅连接各x分组顶部点的折线图),而非连接所有数据点(类似参考图1:全量数据连线的折线图)。当前使用以下代码绘制了全量数据的连线,请问如何修改以实现需求?
数据集:
structure(list(x = c(-64.4427, -64.4427, -64.4427, -64.3412, -64.3412, -64.3412, -64.3412, -64.0203, -64.0203, -63.6396, -63.6396, -63.6396, -63.6396, -63.6396, -63.6396, -63.6396, -63.6396, -63.2791, -63.2791, -63.2791, -62.7842, -62.7842, -62.7842, -62.7842, -62.7842, -62.7842, -62.7842, -62.7842, -61.8798, -61.8798, -61.8798, -61.8798 ), y = c(2582, 2301, 1750, 2490, 2220, 2000, 1700, 3025, 2650, 3320, 3271, 3000, 2801, 2601, 2300, 2051, 1798, 3561, 3201, 2201, 3892, 3850, 3750, 3501, 3301, 3001, 2700, 2300, 4259, 4100, 3620, 3121), z = c(28.3265878478115, 28.3130766365866, 28.2790754780365, 28.3286882228112, 28.3134761067483, 28.2963621888498, 28.2736333444117, 28.3343768309236, 28.3169194745408, 28.3395710355091, 28.3401632547452, 28.3282659767822, 28.3216608667596, 28.3109917133086, 28.28969088234, 28.2731475151318, 28.2556126481574, 28.3357781854992, 28.3201236913069, 28.2589132983799, 28.3365221487856, 28.3374476656256, 28.3319243679285, 28.3177414449621, 28.3080447684229, 28.293909196108, 28.2762807654194, 28.2528794735116, 28.3319284513409, 28.320727357254, 28.3005401796587, 28.2761402040812)), class = "data.frame", row.names = c(NA, -32L ))
现有绘图代码:
ggplot(data = df, aes(x = x, y = y), fill = z, size = 1) + geom_line()
参考图说明:
- 参考图1:全量数据连线的折线图,所有数据点被连接成线
- 参考图2:仅连接各x分组顶部点的折线图,只保留每个x对应的y最大值点并连线
解决方案
要实现需求,需先筛选出每个x分组中y值最大的记录,再用筛选后的数据集绘图。推荐使用dplyr包完成数据筛选:
步骤1:准备工具(安装并加载dplyr)
如果还未安装dplyr,先执行安装命令:
install.packages("dplyr")
然后加载包:
library(dplyr)
步骤2:筛选每个x分组的顶部点
按x分组,提取每组中y值最大的行:
df_top <- df %>% group_by(x) %>% filter(y == max(y)) %>% ungroup()
步骤3:绘制目标折线图
修改ggplot代码,使用筛选后的数据集,同时关联z列信息(比如用颜色映射z值):
ggplot(data = df_top, aes(x = x, y = y, color = z)) + geom_line(linewidth = 1) + geom_point(size = 3) + # 显示顶部点,更直观 scale_color_viridis_c(option = "plasma", name = "z值") + # 可选:优化颜色渐变与图例名称 labs(x = "x", y = "y", title = "各x分组顶部点连线图")
代码说明
group_by(x):按x列对数据分组filter(y == max(y)):筛选每组中y值最大的记录,即每个x对应的顶部点color = z:将z值映射到线和点的颜色,实现z列信息的可视化关联- 添加
geom_point可以清晰展示每个顶部数据点的位置,便于观察
内容的提问来源于stack exchange,提问作者L55
相关产品推荐
相关产品推荐

