ggplot2绘图时如何过滤total值小于10的selected对应数据?
完全可以实现该筛选需求,不需要额外写复杂的if语句,有多种简洁的实现方式:
方法1:先过滤数据集再传入ggplot(最推荐,逻辑清晰易维护)
先对原始数据集做子集筛选,再把过滤后的数据传给ggplot绘图,适合所有图层都用同一筛选规则的场景:
# 用dplyr包filter过滤,写法更易读 library(dplyr) filtered_data <- rawdata %>% filter(total >= 10) ggplot(filtered_data) + geom_point(aes(x=location, y=selected)) + geom_smooth(aes(x=location, y=selected, se=F)) + labs( title="Bins with total >=10, selected", x="location", y="selected")
如果不想加载额外包,也可以用R基础语法做子集:
filtered_data <- rawdata[rawdata$total >= 10, ]
方法2:直接在ggplot调用中实时过滤
不需要单独生成过滤后的数据集,直接在data参数中完成筛选:
ggplot(rawdata[rawdata$total >= 10, ]) + geom_point(aes(x=location, y=selected)) + geom_smooth(aes(x=location, y=selected, se=F)) + labs( title="Bins with total >=10, selected", x="location", y="selected")
方法3:仅对特定图层做筛选
如果不同图层需要用不同的数据范围,比如散点过滤、拟合线用全量数据,可以单独给geom指定筛选后的data:
library(dplyr) ggplot(rawdata) + # 散点仅展示total>=10的数据 geom_point(aes(x=location, y=selected), data = ~ filter(.x, total >= 10)) + # 拟合线使用全量数据 geom_smooth(aes(x=location, y=selected), se=F) + labs( title="Selected vs location (points filtered, smooth full data)", x="location", y="selected")
你提到的if语句逻辑上也可以实现,但直接传入子集化的数据写法更简洁,也不容易出现逻辑错误。
内容的提问来源于stack exchange,提问作者Anan
相关产品推荐
相关产品推荐

