首页 > 解决方案 > 如何在函数中指定条件图

问题描述

我编写了一个函数,该函数适合多个变量的单独模型,并将拟合值和置信区间存储在名为fitmod. 然后,该函数在拟合值范围内找到局部最小值和最大值,并将它们临时存储在Loc.Min和中Loc.Max。接下来,它为每个变量的拟合值生成一个线图,并标记局部最小值和最大值的点(仅当它们落在拟合值索引的某个范围内时,由以下条件确定:fitmod[which(fitmod$idx %in% Loc.Min), ]。这是一个示例在函数中编写(仅使用两个变量Var1Var2例如):

#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()

标签: rfunctionggplot2functional-programmingconditional-statements

解决方案


我在您对 and 中的最小值和最大值的调用中看到了很多geom_point()相似之处。没有您的数据,很难对此进行测试,但我认为这样的事情会奏效。我的方法是编写一个函数,它可以:Var1plotVar2plot

  1. 如果您的子集数据没有行,则返回一个空列表,或者

  2. 返回正确的geom_point调用(作为列表)。

loc.minmaxLoc.Minor 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调用中。这是应该有效的用法示例(理论上):ggplot2ggplot()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"))

让我知道这是否有效...


推荐阅读