r - 如何在函数中指定条件图
问题描述
我编写了一个函数,该函数适合多个变量的单独模型,并将拟合值和置信区间存储在名为fitmod
. 然后,该函数在拟合值范围内找到局部最小值和最大值,并将它们临时存储在Loc.Min
和中Loc.Max
。接下来,它为每个变量的拟合值生成一个线图,并标记局部最小值和最大值的点(仅当它们落在拟合值索引的某个范围内时,由以下条件确定:fitmod[which(fitmod$idx %in% Loc.Min), ]
。这是一个示例在函数中编写(仅使用两个变量Var1
,Var2
例如):
#Var1 plot
Loc.Min <- which(diff(sign(diff(fitmod$Var1.fit)))==2)+1
Loc.Max <- which(diff(sign(diff(fitmod$Var1.fit)))==-2)+1
Var1plot<-
ggplot(fitmod, aes(x=idx, y=Var1.fit))+
geom_line()+
geom_ribbon(aes(ymin=Var1.lci, ymax=Var1.uci), alpha =0.3)+
labs(x=element_blank(), y="Var1")+
geom_point(data=fitmod[which(fitmod$idx %in% Loc.Min), ], aes(color="Local.Minima"), size=3)+
geom_point(data=fitmod[which(fitmod$idx %in% Loc.Max), ], aes(color="Local.Maxima"), size=3)+
scale_color_manual(values=list("red","blue"))
#Var2 plot
Loc.Min <- which(diff(sign(diff(fitmod$Var2.fit)))==2)+1
Loc.Max <- which(diff(sign(diff(fitmod$Var2.fit)))==-2)+1
Var2plot<-
ggplot(fitmod, aes(x=idx, y=Var2.fit))+
geom_line()+
geom_ribbon(aes(ymin=Var2.lci, ymax=Var2.uci), alpha =0.3)+
labs(x=element_blank(), y="Var2")+
geom_point(data=fitmod[which(fitmod$idx %in% Loc.Min), ], aes(color="Local.Minima"), size=3)+
geom_point(data=fitmod[which(fitmod$idx %in% Loc.Max), ], aes(color="Local.Maxima"), size=3)+
scale_color_manual(values=list("red","blue"))
只要它为 和 选择至少一个值,这就会完美地Loc.Min
工作Loc.Max
。然而,偶尔没有值落在其中一个变量的范围内,所以我想其中之一:[which(fitmod$idx %in% Loc.Max), ]
表达式默认为 NULL,我收到一条错误消息,上面写着Error: Aesthetics must be either length 1 or the same as the data (1): x and y
. 那么,如果表达式等于零,我该如何更改此代码以使其忽略任何geom_point()
一行(以及scale_color_manual()
与之配对的相应调用) ?which()
解决方案
我在您对 and 中的最小值和最大值的调用中看到了很多geom_point()
相似之处。没有您的数据,很难对此进行测试,但我认为这样的事情会奏效。我的方法是编写一个函数,它可以:Var1plot
Var2plot
如果您的子集数据没有行,则返回一个空列表,或者
返回正确的
geom_point
调用(作为列表)。
loc.minmax
是Loc.Min
or Loc.Max
,并且是作为字符串的调用的美学label_name
标签:color=
geom_point
my_points <- function(loc.minmax, label_name) {
return_list <- list()
checkframe <- fitmod[which(fitmod$idx %in% loc.minmax), ]
if(nrow(checkframe)!=0) {
return_list <- geom_point(data=checkframe, aes(color=label_name), size=3)
}
return(return_list)
}
如果将它们格式化为列表,则可以将它们直接添加到绘图中,因此您可以简单地将函数添加到geom
调用中。这是应该有效的用法示例(理论上):ggplot2
ggplot()
Var2plot
Var2plot<-
ggplot(fitmod, aes(x=idx, y=Var2.fit))+
geom_line()+
geom_ribbon(aes(ymin=Var2.lci, ymax=Var2.uci), alpha =0.3)+
labs(x=element_blank(), y="Var2")+
my_points(Loc.Min, 'Local.Minima') +
my_points(Loc.Max, 'Local.Maxima') +
scale_color_manual(values=list("red","blue"))
让我知道这是否有效...
推荐阅读
- heroku - Geoserver - 错误加载页面postgis连接
- node.js - 如何以编程方式从 Node.js 创建 Cloud Run 服务?
- angular - 将变量和链接放入数据数组 Kendo Angular
- reactjs - 如何在反应惰性后备中使用图像
- bash - BASH Hackerrank 解决方案适用于 PC,但不适用于 Hackerrank
- node.js - Facebook api 使用 FacebookRequestError 消息给出 400 错误
- r - 在 R 中下载 GPM-IMERG 卫星图像
- sql - 使用 JOIN 和条件 SQL 进行更新
- java - 未实例化的整数将位于内存中的哪个位置?
- java - 存储对象的 GCS 凭据刷新