如何在ggplot绘图时忽略0值并解决Aesthetics长度不匹配报错
ggplot忽略0值绘图报错解决方案
报错原因
你遇到的报错"Aesthetics must be either length 1 or the same as the data (1980): y"中文含义为:错误:美学映射参数的长度必须为1,或与数据集长度(1980)一致:y
触发错误的核心问题有两个:
which(D99!=0)返回的是满足D99≠0条件的行索引向量,长度必然小于数据集总行数1980,和传入geom_point的数据集维度不匹配,无法完成y轴映射- 你把
colour="red"写在了aes()内部,会被ggplot识别为分类变量映射,不会直接将点渲染为红色
修正后代码
无需提前处理全量数据集,仅给geom_point传入过滤后的子集即可,两种常用写法如下:
基础R写法(无需加载额外包)
ggplot(data=PRICE_MSCI_MODEL_10_PAESI,aes(x=t,y=fitted_values99,group = 1))+ geom_line(color = "steelblue")+ geom_point(data = ~.x[.x$D99 != 0,], colour="red")+ facet_wrap(~id)
dplyr::filter写法
library(dplyr) ggplot(data=PRICE_MSCI_MODEL_10_PAESI,aes(x=t,y=fitted_values99,group = 1))+ geom_line(color = "steelblue")+ geom_point(data = ~filter(.x, D99 != 0), colour="red")+ facet_wrap(~id)
补充说明
如果你需要展示的点的y值是D99的非0值,仅需要在geom_point的aes中新增y映射即可,过滤逻辑保持不变:
geom_point(data = ~.x[.x$D99 != 0,], aes(y=D99), colour="red")
内容的提问来源于stack exchange,提问作者Alain Pierre Patrignani
相关产品推荐
相关产品推荐

